缩放以适合Mapbox或Leaflet中的所有标记


124

如何设置视图以在MapboxLeaflet中查看地图上的所有标记?像Google Maps API一样bounds

例如:

var latlngbounds = new google.maps.LatLngBounds();
for (var i = 0; i < latlng.length; i++) {
  latlngbounds.extend(latlng[i]);
}
map.fitBounds(latlngbounds);

Answers:


263
var group = new L.featureGroup([marker1, marker2, marker3]);

map.fitBounds(group.getBounds());

请参阅文档以获取更多信息。


2
该解决方案的问题在于,由于标记超出了其坐标给定的范围,因此有时可能会切断北向标记。
aaronbauman 2013年

77
来自@ user317946:“ map.fitBounds(markers.getBounds()。pad(0.5));现在图标不会被截断。:-)”
lpapp 2014年

12
我很高兴在重新发明轮子之前用Google搜索了此内容。谢谢
martynas

4
以防万一它对任何人都不是显而易见的...您可以获取大多数传单对象的范围。map.fitBounds(circle.getBounds()); 例如。
Ravendarksky 2014年

8
markers.getBounds().pad(<percentage>)如果您想将边界扩展给定的百分比,则可以使用,但也可以将padding选项传递给fitBounds,以设置像素的填充。markers.getBounds(), {padding: L.point(20, 20)})
亚历克斯·格雷罗

21

由于某些原因,“答案”没有起作用。所以这就是我最终要做的事情:

////var group = new L.featureGroup(markerArray);//getting 'getBounds() not a function error.
////map.fitBounds(group.getBounds());
var bounds = L.latLngBounds(markerArray);
map.fitBounds(bounds);//works!

尝试执行此操作但得到Error:LngLatLike参数必须指定为LngLat实例,对象{lng:<lng>,lat:<lat>}或[<lng>,<lat>]的数组。任何想法?
returnvoid

18
var markerArray = [];
markerArray.push(L.marker([51.505, -0.09]));
...
var group = L.featureGroup(markerArray).addTo(map);
map.fitBounds(group.getBounds());

1
它可以在没有addTo(map)的情况下工作:map.fitBounds(L.featureGroup(markerArray).getBounds()); 这会有所不同吗?
卢卡斯·斯特芬

15

Leaflet也具有LatLngBounds,甚至具有扩展功能,就像google maps一样。

http://leafletjs.com/reference.html#latlngbounds

因此,您可以简单地使用:

var latlngbounds = new L.latLngBounds();

其余的完全一样。


3
谢谢!对我来说,根据上面的答案,解决方案是返回'getBounds()不是函数。因此,我根据您的建议更改了代码。我有自己的答案。
IrfanClemson,2014年

6

对于Leaflet,我正在使用

    map.setView(markersLayer.getBounds().getCenter());

这是我可以在Chrome中使用单个标记的唯一解决方案
Tim Styles

2

您还可以找到一个FeatureGroup或所有FeatureGroup中的所有要素,看看它是如何工作的!

//Group1
m1=L.marker([7.11, -70.11]);
m2=L.marker([7.33, -70.33]);
m3=L.marker([7.55, -70.55]);
fg1=L.featureGroup([m1,m2,m3]);

//Group2
m4=L.marker([3.11, -75.11]);
m5=L.marker([3.33, -75.33]);
m6=L.marker([3.55, -75.55]);
fg2=L.featureGroup([m4,m5,m6]);

//BaseMap
baseLayer = L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png');
var map = L.map('map', {
  center: [3, -70],
  zoom: 4,
  layers: [baseLayer, fg1, fg2]
});

//locate group 1
function LocateOne() {
    LocateAllFeatures(map, fg1);
}

function LocateAll() {
    LocateAllFeatures(map, [fg1,fg2]);
}

//Locate the features
function LocateAllFeatures(iobMap, iobFeatureGroup) {
		if(Array.isArray(iobFeatureGroup)){			
			var obBounds = L.latLngBounds();
			for (var i = 0; i < iobFeatureGroup.length; i++) {
				obBounds.extend(iobFeatureGroup[i].getBounds());
			}
			iobMap.fitBounds(obBounds);			
		} else {
			iobMap.fitBounds(iobFeatureGroup.getBounds());
		}
}
.mymap{
  height: 300px;
  width: 100%;
}
<script src="https://unpkg.com/leaflet@1.3.1/dist/leaflet.js"></script>
<link href="https://unpkg.com/leaflet@1.3.1/dist/leaflet.css" rel="stylesheet"/>

<div id="map" class="mymap"></div>
<button onclick="LocateOne()">locate group 1</button>
<button onclick="LocateAll()">locate All</button>


1

为了只适合可见标记,我有此方法。

fitMapBounds() {
    // Get all visible Markers
    const visibleMarkers = [];
    this.map.eachLayer(function (layer) {
        if (layer instanceof L.Marker) {
            visibleMarkers.push(layer);
        }
    });

    // Ensure there's at least one visible Marker
    if (visibleMarkers.length > 0) {

        // Create bounds from first Marker then extend it with the rest
        const markersBounds = L.latLngBounds([visibleMarkers[0].getLatLng()]);
        visibleMarkers.forEach((marker) => {
            markersBounds.extend(marker.getLatLng());
        });

        // Fit the map with the visible markers bounds
        this.map.flyToBounds(markersBounds, {
            padding: L.point(36, 36), animate: true,
        });
    }
}

-2

最好的方法是使用下一个代码

var group = new L.featureGroup([marker1, marker2, marker3]);

map.fitBounds(group.getBounds());

2
也有类似的答案
AHOYAHOY
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.