2015-06-11 4 views
0

с очень странной проблемой.Google Maps v3 fitBounds непоследовательный зум

A: Один метод моей карты отлично работает. Пользователь устанавливает начальную точку, а конечную точку и карту создаются, а fitBounds.extend (bounds) устанавливает уровень масштабирования соответствующим образом, чтобы охватить маркеры начала/конца на карте.

B: Второй способ заключается в том, что пользователь устанавливает начальную точку, но нет и конечную точку, но в зависимости от других интересов пользователя я получаю для них конечную точку и выводя ее на карту, используя те же функции, что и метод A Однако, после fitBounds.extend (bounds), он устанавливает уровень масштабирования на 4 (уровень страны). Затем мне нужно настроить масштаб.

Не имеет значения, когда в какой-либо момент пользователь выполняет метод A (до или после метода B) ... при его методе A уровень масштабирования правильный. Когда его метод B всегда должен увеличивать уровень 4.

... но все используют одни и те же функции.

Оба метода точно помещают маркеры на карту и точно рисуют маршрут между маркерами. Только по методу A автомасштабирование является правильным, а по методу B - всегда установлено значение 4.

Если пользователь делает A, его право ... тогда B происходит, его масштабирование ... снова B остается увеличенным ... снова A снова возвращается к правильному масштабированию.

Вождение меня здесь!

Мой объект карта "setMap", это глобальная Var

function setMapBounds(start,end) { 
    mapBounds = new google.maps.LatLngBounds(); 
    mapBounds.extend(start.position); 
    mapBounds.extend(end.position) ; 
    setMap.fitBounds(mapBounds) ; 
} 

function addMarkers(newMarkers) { // an array of map points. 
    var tempMarkers = [] ; 

    for (var x=0;x<newMarkers.length;x++) { 
    var tempLatlon = new google.maps.LatLng(newMarkers[x].lat,newMarkers[x].lon) ; 
    var tempMarker = createMarker(tempLatlon,newMarkers[x].img,newMarkers[x].title) ; 
    tempMarkers.push(tempMarker) ; 
    } 
    return tempMarkers ; 
} 

function createMarker(latlon,img,title) { 
    var marker = new google.maps.Marker({ 
    map:setMap, 
    position:latlon, 
    icon: img, 
    title:title 
    }) ; 
    return marker ; 
} 

// Это метод А - это ВСЕГДА устанавливает масштаб правильно

function setDropoff(dropoffLoc) { //called from: index.js/setPickup(), tab-map.html 
    geoCoder.geocode({'address': dropoffLoc}, function(results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     if (results[0]) { 
     endLocation = dropoffLoc ; 
     endLat = results[0].geometry.location.lat() ; 
     endLon = results[0].geometry.location.lng() ; 
     // first clear any existing END Markers only. 
     while(markersArray.length) { 
      markersArray.pop().setMap(null); 
     } 
     endPointSet = 1 ; 
     endLatlon = new google.maps.LatLng(endLat,endLon) ; 
     var endMarker = createMarker(endLatlon,'img/red-pin.png','Drop off') ; 
     markersArray.push(endMarker) ; 
     setMapBounds(userMarker,endMarker) ; 

     if (startPointSet == 1) { 
      drawRoute("DRIVING",startLocation,endLocation) ; 
     } 
     } 
    } else { 
     error = "Address not found." 
    } 
    }); 
} 

// Это метод B , он ВСЕГДА пуширует уменьшение до 4. Он вытаскивается из другой функции, которая проверяет, установлен ли пользователь вручную и конечная точка ... если это так, то добавьте wayPoints между пользовательскими начальными/конечными точками. Если нет, то установите карту в начальной точке пользователя к одной конечной точки интереса

if (endPointSet == 1) { // draw Pickup to START to wayPoints to END 
    var markers = [ 
     {lat:interests[0].shub_lat,lon:interests[0].shub_lon,img:interests[0].img,title:"Pickup"}, 
     {lat:interests[1].ehub_lat,lon:interests[1].ehub_lon,img:interests[1].img,title:"Dropoff"} 
    ] ; 
    var points = [interests.shub_address,interests.ehub_address] ; 
    extraMarkers = addMarkers(markers) ; 
    drawRoute("BICYCLING",startLocation,endLocation,points) ; 
    } else { 
    var markers = [ 
     {lat:interests[0].shub_lat,lon:interests[0].shub_lon,img:interests[0].img,title:"Dropoff"} 
     ] ; 

    extraMarkers = addMarkers(markers) ; 
    setMapBounds(userMarker,extraMarkers[0]) ; 
    drawRoute("WALKING",startLocation,interests[0].shub_address) ; 
    } 
} 

Здесь есть являются объекты, передаваемые в setMapBounds из другого места Метод B. Точка старта устанавливается Пользователем ... но нет конечная точка установлена, я выбираю для них одну. Первый объект запускается, второй объект - конец.

Lh {__gm: Object, gm_accessors_: Object, map: Qk, closure_uid_909815000: 563, gm_bindings_: Object…} 
Lf: Object 
... 
    position: pf 
    D: -82.49799999999999 
    k: 27.873196 
... 

Lh {__gm: Object, gm_accessors_: Object, map: Qk, closure_uid_909815000: 602, gm_bindings_: Object…} 
Lf: Object 
... 
    position: pf 
    D: -82.47631678090198 
    k: 27.9374560148825 
... 

А вот объекты, передаваемые в setMapBounds из метода A, где пользователь устанавливающий как же начальных и конечных точки. вы можете увидеть точку старта является одинаковым для обоих Method A и B.

Lh {__gm: Object, gm_accessors_: Object, map: Qk, closure_uid_909815000: 563, gm_bindings_: Object…} 
    Lf: Object 
    ... 
    position: pf 
    D: -82.49799999999999 
    k: 27.873196 
... 

Lh {__gm: Object, gm_accessors_: Object, map: Qk, closure_uid_909815000: 703, gm_bindings_: Object…} 
    Lf: Object 
    ... 
    position: pf 
    D: -82.45717760000002 
    k: 27.950575 
    ... 
+1

Не могли бы вы указать, о чем идет речь? Хотите исправить или объяснить? – bcdan

+0

Ну, и то, и другое. Я ищу исправление и объяснение. Я не понимаю, почему метод B делает неправильное масштабирование при использовании тех же функций, что и метод A, который выполняет правильное масштабирование. – rolinger

+0

Вы пытались использовать координаты в других странах? Вы упомянули, что он идет на уровень увеличения 4, поскольку вы описываете как «уровень страны». Я прочитал в [https://developers.google.com/maps/documentation/javascript/geocoding] документации по геокодированию, что есть смещение области. Возможно, это переносится в 'setBounds'. Не могли бы вы разместить полный сценарий, чтобы я мог получить еще какой-то контекст? – bcdan

ответ

0

Я делаю подобное приложение, и код, который я использую:

var start; 
var end; 

function updateMap(name, obj){ //obj is a form input i.e. <input type="text"> 
    var marker = (name==='start')?start:end; 
    geocoder.geocode({address:obj.value}, function(results, status){ 

    //get coords/check if is valid place 
    if(status === google.maps.GeocoderStatus.OK){ 

     //get info, store in new marker 
     marker.setPosition(results[0].geometry.location); 
     marker.setTitle(obj.value); 

     //if both markers present 
     if(start.getPosition() && end.getPosition()){ 
     map.fitBounds(new google.maps.LatLngBounds(start.getPosition(), end.getPosition())); 
     }else{ 

     //otherwise, if one marker 
     map.setCenter(marker.getPosition()); 
     map.setZoom(15); 
     } 
     marker.setMap(map); 
    }else if(status === google.maps.GeocoderStatus.ZERO_RESULTS){ 
     alert('There is an issue with address. Please refer to the "Help" link.'); 
    }else{ 
     setTimeout(function(){ 
     updateMap(marker, obj); 
     }, 200); 
    } 
    }); 
} 

Что это делает принять аргумент из текстового ввода, геокодировать его и поместить маркер на карту. Функция запускается событием onchange на элементе формы. Это может быть легко адаптировано для вашего собственного использования. Если бы было только одно очко, я просто установил значение масштабирования по умолчанию (обычно довольно близко к улице, хотя вы можете настроить его, как хотите).

Что касается вашего вопроса о том, почему он не работает, я могу сформулировать лучшее предположение со всем кодом.На данный момент я думаю, что это имеет какое-то отношение к смещению региона или что это просто ошибка. Скорее всего, лучше всего обойти это.

 Смежные вопросы

  • Нет связанных вопросов^_^