谷歌地图API V3 fitbounds()缩小但从未缩小

我已经创建了一个非常复杂的商店定位器。 用户输入他们的zip并且表格在地图上返回带有相应标记的结果。 他们可以翻阅结果并且标记进一步向外移动, fitbounds()函数非常适合缩小到适当的缩放级别以适合标记。 问题是,如果你回到更近的位置, fitbounds()不会放大。即使你输入一个新的搜索,它也不会放大这些新的标记 – 它以它们为中心,但保持在任何缩放级别它是在以前。 我希望这是有道理的。 如果有人知道我需要添加什么来让它放大更接近的结果,请帮助。 这些是我在标记推送function结束时调用的google函数:

  map.setCenter(bounds.getCenter()); map.panToBounds(bounds); map.fitBounds(bounds); 

谢谢!

问题是:我们设定

 var bounds = new google.maps.LatLngBounds(); 

这样我们以后可以将我们的标记放到地图上的有界区域。 GMaps将始终异步缩小以适应fitBounds(),但不会放大以实现相同(如前所述@broady)。 这对于许多应用来说并不理想,因为一旦你走了并在地图上显示一系列标记导致地图缩小(可能<10),它就不会在没有用户手动这样做的情况下放大。

GMaps将继续使用(缺少更好的单词)最大缩小标记收集状态(抱歉)的界限。 在每次调用新标记之前设置为“null”会为您提供一个新的地图。

要自动放大,只需设置LatLngBounds(); 像这样’null’(请参阅下面的伪示例以查看其位置):

 bounds = new google.maps.LatLngBounds(null); 

伪示例:

 // map stuff/initiation ... var bounds = new google.maps.LatLngBounds(); var gmarkers = []; function CreateMarker (obj) { myLatLng = new google.maps.LatLng(obj['latitude'], obj['longitude']); marker = new google.maps.Marker({ position: myLatLng, map: map }); google.maps.event.addListener(marker, 'click', (function(marker, i) { return function() { infowindow.setContent(obj['job']); infowindow.open(map, marker); } })(marker, i)); bounds.extend(myLatLng); gmarkers.push(marker); } .... // here's an AJAX method I use to grab marker coords from a database: $.ajax({ beforeSend: function() { clear_markers(gmarkers); // see below for clear_markers() function declaration }, cache: false, data: params, dataType: 'json', timeout: 0, type: 'POST', url: '/map/get_markers.php?_=', success: function(data) { if (data) { if (data['count'] > 0) { var obj; var results = data['results']; // Plot the markers for (r in results) { if (r < (data['count'])) { CreateMarker(results[r]); } } } } }, complete: function() { map.fitBounds(bounds); } }); // clear_markers() function clear_markers(a) { if (a) { for (i in a) { a[i].setMap(null); } a.length = 0; } bounds = new google.maps.LatLngBounds(null); // this is where the magic happens; setting LatLngBounds to null resets the current bounds and allows the new call for zoom in/out to be made directly against the latest markers to be plotted on the map } 

这里没有什么花哨的东西。 首先适合边界然后平移它。 这将为您提供适当的缩放并包含整个边界。

 map.fitBounds(bounds); map.panToBounds(bounds); 

没错, fitBounds只能确保提供的边界是可见的。 它不会放大到适当的水平。

您可以先调用setZoom(20) ,然后调用fitBounds。

嗯,有趣..我使用PHP遍历所有(将)标记坐标并计算southWest和northEast的值; 原点的坐标在两者之间。 如果所有标记坐标彼此非常接近,则由fitBounds设置的缩放因子比在地图创建时使用的15更高(放大)。 这就是为什么我添加了最后一行..

 var map; function mapInit() { var origin = new google.maps.LatLng(59.33344615, 18.0678188); var options = { zoom: 15, center: origin, mapTypeControlOptions: { mapTypeIds: [google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.HYBRID] }, mapTypeId: google.maps.MapTypeId.ROADMAP }; map = new google.maps.Map(document.getElementById("googlemap"), options); var southWest = new google.maps.LatLng(59.3308415, 18.0643054); var northEast = new google.maps.LatLng(59.3360508, 18.0713322); var bounds = new google.maps.LatLngBounds(southWest, northEast); map.fitBounds(bounds); google.maps.event.addListenerOnce(map, "idle", function() { if (map.getZoom() > 16) map.setZoom(16); }); 

因此,谷歌已经重新编程了这个function,因为你发布了问题或者..我需要更多关于你的代码的信息。

在使用新标记在同一地图上第二次调用fitBounds时,我也遇到了地图缩放问题。 这是适用于我的frankensolution:

 // This is a stationary point tho dynamic will work too var myLat = someLat, myLng = someLong; var map = false, markersArray = []; function makeOrderMap(lat, lng) { // pass in dynamic point when updating map var mapOptions = { center: new google.maps.LatLng(myLat, myLng), zoom: 16, mapTypeId: google.maps.MapTypeId.ROADMAP }; deleteOverlays(); // remove any existing markers.. if(!map) { map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); } // Find the mid-point to center the map midLat = (parseFloat(lat) + parseFloat(myLat)) / 2; midLng = (parseFloat(lng) + parseFloat(myLng)) / 2; map.setCenter(new google.maps.LatLng(midLat, midLng)); var newSpot = new google.maps.LatLng(lat, lng); placeMarker(mapOptions.center); placeMarker(newSpot); // determine the distance between points for deciding the zoom level var dist = distHaversine(mapOptions.center, newSpot); var zoom = 10; if(dist < 1.25) { zoom = 15; } else if(dist < 2.5) { zoom = 14; } else if(dist < 5) { zoom = 13; } else if(dist < 10) { zoom = 12; } else if(dist < 20) { zoom = 11; } map.setZoom(zoom); } rad = function(x) {return x*Math.PI/180;} distHaversine = function(p1, p2) { var R = 6371; // earth's mean radius in km var dLat = rad(p2.lat() - p1.lat()); var dLong = rad(p2.lng() - p1.lng()); var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) * Math.sin(dLong/2) * Math.sin(dLong/2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); var d = R * c; return d.toFixed(3); } function deleteOverlays() { if (markersArray) { for (i in markersArray) { markersArray[i].setMap(null); } markersArray = []; markersArray.length = 0; } } function placeMarker(location, alt_icon) { var marker = new google.maps.Marker({ position: location, map: map }); // add marker in markers array markersArray.push(marker); } 

事实certificate,当你调用map.getBounds()它会返回边缘周围有一点边距的视口。 由于此新边界大于当前边界,因此地图将始终缩小。 我能够通过完全避免使用当前地图的边界并保持单独的LatLngBounds变量来解决它。 每次我添加一个点我都打电话:

 markersBounds.extend(newMarkersLatLng); map.fitBounds(markersBounds); map.panToBounds(markersBounds); 

要删除点(我总是添加它们),您可以使用第一个点创建一个新的LatLngBounds对象,然后扩展每个剩余点以获得新的边界:

 var markersBounds = new google.maps.LatLngBounds(markers[0].getPosition(), markers[0].getPosition()); for(var i=1; i 
 map.setZoom(10); 

我相信可接受的范围是1-20。 仅限整数,小数在我的经验中打破了地图。

 fitBounds: function(bounds, mapId) { //bounds: bounds, id: map id if (bounds==null) return false; maps[mapId].fitBounds(bounds); }, 

这应该有帮助,我使用这种方法并且工作正常,在地图v2上有点不同的方式。

我今天遇到了这个普遍的问题,以为我会分享一个解决方案。 我意识到这与你的“商店定位器”问题略有不同,但它确实适用于很多方面。 在我的情况下,我在地图上有一组标记,并添加了一个标记,并希望确保所有标记现在都在视图中。 此代码检查每个现有标记,以查看它是否在视图中,并在此过程中构建一个新的边界框,如果需要,将包含所有标记。 最后,如果发现任何视图不在视图中,视图将被重置,因此它们都是。

(这使用Dojo的数组模块,只是围绕基本数组迭代的便利包装器)

 var origBounds = map.getBounds(), newBounds = new google.maps.LatLngBounds(null), anyFailed = false; array.forEach(markers, function (m) { newBounds.extend(m.position); if (!origBounds.contains(m.position)) { anyFailed = true; } }); if (anyFailed) { map.setCenter(newBounds.getCenter()); map.fitBounds(newBounds); } 

人们可以很容易地修改它,只确保新标记在视图中,不循环,只需对新标记执行contains()检查。

是什么帮助我使用0填充作为fitBounds(边界,填充)的第二个参数:

 var worldBounds = new google.maps.LatLngBounds( new google.maps.LatLng(70.4043,-143.5291), //Top-left new google.maps.LatLng(-46.11251, 163.4288) //Bottom-right ); map.fitBounds(worldBounds, 0); 
Interesting Posts