Mapbox 또는 Leaflet의 모든 마커에 맞게 확대


124

Mapbox 또는 Leaflet 에서지도의 모든 마커를보기 위해보기를 설정하려면 어떻게해야 합니까? 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);

답변:


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

map.fitBounds(group.getBounds());

자세한 내용 은 설명서 를 참조하십시오.


2
이 솔루션의 문제점은 마커가 좌표로 지정된 경계를 넘어 확장되기 때문에 때때로 북쪽 마커를 잘라낼 수 있다는 것입니다.
aaronbauman

77
@ user317946에서 : "map.fitBounds (markers.getBounds (). pad (0.5)); 이제 아이콘이 잘리지 않습니다. :-)"
lpapp 2014 년

12
나는 바퀴를 재발 명하기 전에 이것을 구글로 검색해서 기쁘다. 감사합니다
martynas

4
누구에게도 분명하지 않은 경우를 대비하여 ... 대부분의 전단지 개체의 경계를 얻을 수 있습니다. map.fitBounds (circle.getBounds ()); 예를 들면.
Ravendarksky 2014 년

8
markers.getBounds().pad(<percentage>)주어진 백분율로 경계를 확장하려는 경우 사용할 수 있지만 패딩을 픽셀 단위로 설정하기 위해 패딩 옵션을 fitBounds에 전달할 수도 있습니다. markers.getBounds(), {padding: L.point(20, 20)})
Alex Guerrero

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!

이 작업을 시도했지만 오류 : LngLatLike인수가 LngLat 인스턴스, 개체 {lng : <lng>, lat : <lat>} 또는 [<lng>, <lat>]의 배열로 지정되어야합니다. 어떤 생각?
returnvoid 2011

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 ()); 이것이 어떤 차이를 만들까요?
Lucas Steffen

15

Leaflet에는 Google지도와 마찬가지로 확장 기능도있는 LatLngBounds도 있습니다.

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

따라서 다음을 간단히 사용할 수 있습니다.

var latlngbounds = new L.latLngBounds();

나머지는 똑같 습니다.


3
감사합니다! 나에게 해결책은 위의 답변에 따라 'getBounds () is not a function. 그래서 당신의 제안에 따라 코드를 변경했습니다. 내 답변에 있습니다.
IrfanClemson

6

Leaflet의 경우

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

이것은 유일한 내가 크롬에서 하나의 마커 작업에 얻을 수있는 솔루션이었습니다
팀 스타일

2

또한 FeatureGroup 또는 모든 featureGroups 내에서 모든 기능을 찾을 수 있으며 작동 방식을 확인할 수 있습니다!

//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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.