ซูมให้พอดีกับเครื่องหมายทั้งหมดใน 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);

คำตอบ:


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

map.fitBounds(group.getBounds());

ดูเอกสารสำหรับข้อมูลเพิ่มเติม


2
ปัญหาในการแก้ปัญหานี้คือบางครั้งอาจตัดเครื่องหมายทางทิศเหนือออกไปได้เนื่องจากเครื่องหมายขยายเกินขอบเขตที่กำหนดโดยพิกัด
aaronbauman

77
จาก @ user317946: "map.fitBounds (markers.getBounds (). pad (0.5)); ตอนนี้ไอคอนจะไม่ถูกตัดออก :-)"
lpapp

12
ฉันดีใจที่ Googled สิ่งนี้ก่อนที่จะสร้างล้อใหม่ ขอบคุณ
martynas

4
ในกรณีที่ไม่มีใครเห็นได้ชัด ... คุณสามารถรับขอบเขตของวัตถุใบปลิวส่วนใหญ่ได้ map.fitBounds (circle.getBounds ()); ตัวอย่างเช่น.
Ravendarksky

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

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.fitBounds (L.featureGroup (markerArray) .getBounds ()); สิ่งนี้จะสร้างความแตกต่างหรือไม่?
Lucas Steffen

15

Leaflet ยังมี LatLngBounds ที่มีฟังก์ชันขยายเช่นเดียวกับ Google Maps

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

ดังนั้นคุณสามารถใช้:

var latlngbounds = new L.latLngBounds();

ที่เหลือก็เป็นตรงเดียวกัน


3
ขอบคุณ! สำหรับฉันวิธีแก้ปัญหาตามคำตอบข้างต้นส่งคืน 'getBounds () ไม่ใช่ฟังก์ชัน ดังนั้นฉันจึงเปลี่ยนรหัสตามคำแนะนำของคุณ ฉันมีคำตอบของตัวเอง
IrfanClemson


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.