javascript - Google map v3 fitBounds 缩放不一致

标签 javascript google-maps-api-3 zooming fitbounds

有一个非常奇怪的问题。

答:我的 map 的一种方法效果很好。用户设置起点和终点,然后创建 map ,并且 fitBounds.extend(bounds) 适当设置缩放级别以包含 map 上的开始/结束标记。

B:第二种方法是,如果用户设置起点但不设置终点,但根据其他用户兴趣,我会检索它们的终点和终点,并使用与方法 A 相同的功能将其绘制在 map 上。但是,在 fitBounds.extend(bounds) 上,它将缩放级别设置为 4(国家/地区级别)。然后我必须强制设置缩放。

用户何时执行方法 A(在方法 B 之前或之后)并不重要...当使用方法 A 时,缩放级别是正确的。当其方法 B 时,其始终缩放至 4 级。

...但都使用相同的功能。

这两种方法都能准确地将标记放置在 map 上,并准确绘制标记之间的路线。仅在方法 A 上,自动缩放是正确的,而在方法 B 上,缩放始终设置为 4。

如果用户执行 A,它是对的...然后 B 发生,它会缩小...再次执行 B,它会保持缩小...再次执行 A,它会返回到正确的缩放状态。

快把我逼疯了!

我的 map 对象是“setMap”,它是一个全局变量

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 ;
}

//这是方法 A - 它总是正确设置缩放

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起点/终点。如果没有,则将 map 设置为用户起点到单个兴趣终点

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) ;
  }
}

这里是从方法 B 中的 else 传递到 setMapBounds 的对象。起点由用户设置...但没有设置终点,我为它们选择一个。第一个对象是开始,第二个对象是结束。

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 
...

这里是从方法 A 传递到 setMapBounds 的对象,用户在其中设置相同的起点和终点。您可以看到方法 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 
  ...

最佳答案

我正在制作一个类似的应用程序,我使用的代码是:

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);
    }
  });
}

它的作用是从文本输入中获取参数,对其进行地理编码,然后在 map 上放置标记。该函数由表单元素上的 onchange 事件触发。这可以很容易地适应您自己的用途。如果只有一个点,我只是选择默认的缩放值(通常非常接近街道,尽管您可以根据需要调整它)。

至于你的问题为什么它不起作用,我可以对整个代码做出更好的猜测。目前,我认为这与区域偏差有关,或者它只是一个错误。最好的办法可能就是解决这个问题。

关于javascript - Google map v3 fitBounds 缩放不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30792621/

相关文章:

android - 在 Webview 中缩放图像

c# - 让 Viewbox 和 ScrollViewer 协同工作

javascript - 当焦点不在输入中时允许按 ENTER 提交 FORM

javascript - 无法从 Google Place Search API 返回的 JSON 中提取数据

javascript - 谷歌地图api ajax视口(viewport)标记管理

java - 放大 Java 中的 Mandelbrot 集分形

javascript - JavaScript 中的二次方程求解器

javascript - Ng-Checked 默认值未定义

javascript - 如何阻止函数在 x 秒结束之前返回新结果,并在调用太快时返回之前的结果

javascript - 从 Google Earth KML 文件指向 latlng 转换