ตั้งค่าระดับการซูมแบบไดนามิกโดยยึดตามช่องว่าง


13

ฉันมีแผนที่แผ่นพับซึ่งขนาดขึ้นอยู่กับขนาดของหน้าต่างเบราว์เซอร์ ฉันต้องการให้ระดับการซูมได้รับการเลือกแบบไดนามิกเพื่อให้สามารถซูมได้มากที่สุดเท่าที่จะเป็นไปได้ในขณะที่แสดงขอบเขตทั้งหมด

ตอนนี้ฉันเพิ่งได้ระดับการซูมฮาร์ดโค้ดและจุดศูนย์กลางตามค่าเฉลี่ยของคะแนน

map = new L.Map('map', {
  center: new L.LatLng(
    latitudeSum/locations.length,
    longitudeSum/locations.length
  )
  zoom: 9
})

แต่ฉันต้องการให้มันเป็นกล่องที่มีขอบเขต (สองเกาะ) และให้ระดับการซูมที่เลือกตามขนาดของหน้าต่าง

คำตอบ:


27

คุณสามารถใช้:

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

map.fitBounds(group.getBounds());

1
คำตอบที่เป็นประโยชน์ - นั่นเป็นวิธีที่ดีกว่าสำหรับการจัดกึ่งกลางและการซูม - ก่อนที่ฉันจะอยู่กึ่งกลางด้วยการคำนวณแบบแมนนวล FitBounds คือคำตอบที่ฉันต้องการ แต่ฉันรู้ว่าคุณสามารถส่งผ่านสองพิกัดเพื่อให้พอดีกับขอบเขตและทำได้
Mike McKay

2
ใช้คำตอบถัดไปอย่างแน่นอนเว้นแต่ว่าคุณได้สร้างเครื่องหมายแล้ว
Andy

12

ใช้คำตอบของ @ Farhatฉันคิดว่าสิ่งที่ฉันต้องการคือการส่งอาร์เรย์

map.fitBounds([
  [-4.8587000, 39.8772333],
  [-6.4917667, 39.0945000]
])

1
เห็นได้ชัดว่านี่คือกรอบสี่เหลี่ยมด้านขวาใกล้สุด ไม่แน่ใจว่าทำไมคุณเปลี่ยนกลับการแก้ไขของฉัน
ม.ค. Kyu Peblik

1
คุณพูดถูกแล้ว - ขอบคุณ ฉันจะแก้ไขมัน การแก้ไขของคุณมีเครื่องหมายจุลภาคพิเศษด้วย
Mike McKay

4
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...... รหัสทดสอบจริง ๆ ด้วยคอมม่าต่อท้ายเช่นกัน (เพราะชีวิตสั้นเกินไปที่จะรบกวนเส้นที่มีรูปแบบที่แตกต่างกันอย่างไม่มีนัยสำคัญ)
Jan Kyu Peblik

0

map.fitBounds() ยังใช้งานได้ดีถ้าคุณทำงานกับ Google Map Polylines:

<!-- required for Leaflet Polyline support -->
<script type="text/javascript" src="https://cdn.rawgit.com/jieter/Leaflet.encoded/68e78190/Polyline.encoded.js"
crossorigin=""></script>

// polylines require backslashes to be escaped (Jinja example)
let encodedRoute = '{{ activity.strava_data['map']['polyline']|replace("\\", "\\\\")|safe }}';
let coordinates = L.Polyline.fromEncoded(encodedRoute).getLatLngs();
let map = L.map('map').fitBounds(coordinates);

ทำไมคำตอบนี้ถึงถูกโหวต?
LeeGee

0

นี่เป็นวิธีที่ฉันทำด้วย @Mike McKay! ;)

โปรดทราบว่าฉันได้เพิ่มสองสามพิเศษใน coords เป็น Padding ภายในดังนั้นเครื่องหมายไม่ถูกต้องด้านข้างของแผนที่ วิธีนี้ดูสวยงาม


const [ ...coordinates ] = locations.map(marker => [ marker.coordinates.latitude + 
0.055, marker.coordinates.longitude + 0.055 ])

map.fitBounds([ ...coordinates ])

VUE.JS WAY:

mounted () {
   this.$nextTick(() => {
        this.initialZoom()
   })
}


methods: {
   initialZoom () {
       const map = this.$refs.myMap.mapObject
       const [ ...coordinates ] = this.locations.map(marker => [                                  
                                          marker.coordinates.latitude + 0.055,
                                          marker.coordinates.longitude + 0.055 
                                   ]) 

map.fitBounds([ ...coordinates ])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.