Saya memiliki serangkaian poin yang ingin saya plot di Google Map yang disematkan (API v3). Saya ingin batas untuk mengakomodasi semua titik kecuali jika tingkat zoom terlalu rendah (mis. Terlalu memperkecil). Pendekatan saya seperti ini:
var bounds = new google.maps.LatLngBounds();
// extend bounds with each point
gmap.fitBounds(bounds);
gmap.setZoom( Math.max(6, gmap.getZoom()) );
Ini tidak berhasil. Baris terakhir "gmap.setZoom ()" tidak mengubah level zoom peta jika dipanggil langsung setelah fitBounds.
Apakah ada cara untuk mendapatkan tingkat zoom batas tanpa menerapkannya pada peta? Gagasan lain untuk menyelesaikan ini?
Jawaban:
Sunting : Lihat komentar Matt Diamond di bawah ini.
Mengerti! Coba ini:
Ubah sesuai kebutuhan Anda.
sumber
Saya memecahkan masalah serupa di salah satu aplikasi saya. Saya sedikit bingung dengan deskripsi masalah Anda, tetapi saya pikir Anda memiliki tujuan yang sama dengan yang saya miliki ...
Di aplikasi saya, saya ingin memplot satu atau lebih spidol dan memastikan peta menunjukkan semuanya. Masalahnya adalah, jika saya hanya mengandalkan metode fitBounds, maka tingkat zoom akan dimaksimalkan ketika ada satu titik - itu tidak baik.
Solusinya adalah menggunakan fitBounds ketika ada banyak poin, dan setCenter + setZoom ketika hanya ada satu titik.
sumber
Saya telah mengunjungi halaman ini beberapa kali untuk mendapatkan jawabannya, dan sementara semua jawaban yang ada sangat membantu, mereka tidak menyelesaikan masalah saya dengan tepat.
Pada dasarnya saya menemukan bahwa acara 'zoom_changed' mencegah UI peta dari "melompati" yang terjadi ketika saya menunggu acara 'idle'.
Semoga ini bisa membantu seseorang!
sumber
fitBounds()
jika menggunakanzoom_changed
bounds_changed
, karenazoom_changed
tidak harus dipicu dalam kasus ini ketikafitBounds
menjaga tingkat zoom. Upaya saya jsfiddle.net/rHeMp/10 tidak mengkonfirmasi itu, tetapi orang tidak harus bergantung pada perilaku yang tidak terdefinisi.Saya baru saja memperbaiki ini dengan mengatur maxZoom terlebih dahulu, kemudian menghapusnya setelah itu. Sebagai contoh:
sumber
Jika saya tidak salah, saya berasumsi Anda ingin semua poin Anda terlihat di peta dengan tingkat zoom setinggi mungkin. Saya menyelesaikan ini dengan menginisialisasi tingkat zoom peta ke 16 (tidak yakin apakah itu tingkat zoom setinggi mungkin pada V3).
Kemudian setelah itu saya melakukan hal-hal batas:
Hasil: Sukses!
sumber
Saya menggunakan:
Ini akan menggunakan yang lebih kecil dari 24 dan tingkat zoom yang diperlukan sesuai dengan kode Anda, namun itu mungkin mengubah zoom pula dan tidak peduli berapa banyak Anda memperkecil.
sumber
Silakan coba ini:
sumber
Saya memiliki masalah yang sama dan saya bisa menyelesaikannya menggunakan kode berikut. Acara pendengar (
google.maps.addListenerOnce()
) ini hanya akan dipecat satu kali, tepat setelahmap.fitBounds()
dieksekusi. Jadi, tidak perluidle
.Ini mengatur tingkat zoom yang sesuai pada awalnya dan memungkinkan pengguna untuk memperbesar dan memperkecil tingkat zoom awal karena pendengar acara telah kedaluwarsa. Misalnya, jika hanya
google.maps.addListener()
dipanggil, maka pengguna tidak akan pernah bisa memperbesar melewati tingkat zoom yang dinyatakan (dalam kasus ini, 4). Karena kami menerapkangoogle.maps.addListenerOnce()
, pengguna akan dapat memperbesar ke level apa pun yang dia pilih.sumber
Punya masalah yang sama, diperlukan agar sesuai dengan banyak spidol di peta. Ini menyelesaikan kasus saya:
bounds.extend(objLatLng)
)Jalankan fitbounds SETELAH peta selesai:
sumber
Saya telah menemukan solusi yang melakukan pemeriksaan sebelum menelepon
fitBounds
sehingga Anda tidak memperbesar dan tiba-tiba memperkecilAnda harus bermain-main dengan variabel minLatSpan sedikit untuk mendapatkannya di tempat yang Anda inginkan. Ini akan bervariasi berdasarkan level zoom dan dimensi kanvas peta.
Anda juga bisa menggunakan garis bujur dan bukan garis lintang
sumber
Saya melihat banyak solusi yang salah atau terlalu rumit, jadi saya memutuskan untuk memposting solusi yang berfungsi dan elegan .
Alasannya
setZoom()
tidak berfungsi seperti yang Anda harapkan adalah karenafitBounds()
tidak sinkron, sehingga tidak memberikan jaminan bahwa itu akan segera memperbarui zoom, tetapi panggilan Anda untuksetZoom()
mengandalkan itu.Yang mungkin Anda pertimbangkan adalah mengatur
minZoom
opsi peta sebelum memanggilfitBounds()
dan kemudian menghapusnya setelah selesai (sehingga pengguna masih dapat memperkecil secara manual jika mereka mau):Selain itu, jika Anda ingin juga membatasi zoom maks, Anda dapat menerapkan trik yang sama dengan
maxZoom
properti.Lihat dokumen MapOptions .
sumber
Saya menggunakan ini untuk memastikan level zoom tidak melebihi level yang ditentukan sehingga saya tahu gambar satelit akan tersedia.
Tambahkan pendengar ke
zoom_changed
acara tersebut. Ini memiliki manfaat tambahan untuk mengontrol kontrol zoom pada UI juga.Eksekusi hanya
setZoom
jika Anda perlu, jadiif
pernyataan lebih disukaiMath.max
atauMath.min
Untuk mencegah memperkecil terlalu jauh:
sumber
Dalam fungsi ini, Anda perlu menambahkan metadata secara dinamis untuk menyimpan jenis geometri hanya karena fungsi menerima geometri apa pun.
"fitGeometries" adalah fungsi JSON yang memperluas objek peta.
"geometri" adalah array javascript generik bukan MVCArray ().
sumber
ini cocok untuk saya dengan API v3 tetapi dengan pengaturan zoom tetap:
sumber
Seperti saya, jika Anda tidak mau bermain dengan pendengar, ini adalah solusi sederhana yang saya buat: Tambahkan metode pada peta yang bekerja secara ketat sesuai dengan kebutuhan Anda seperti ini:
maka Anda dapat menelepon
map.fitLmtdBounds(bounds)
alih-alihmap.fitBounds(bounds)
mengatur batas di bawah rentang zoom yang ditentukan ... ataumap.fitLmtdBounds(bounds,3,5)
untuk menimpa rentang zoom ..sumber
Silakan coba ini.
Jika ini akan membantu Anda.
Semua yang terbaik
sumber
Setelah perhitungan batas Anda dapat memeriksa jarak antara sudut kiri atas dan kanan bawah; maka Anda dapat memahami tingkat zoom dengan menguji jarak (jika jarak terlalu jauh tingkat zoom akan rendah) maka Anda dapat memilih apakah menggunakan metode setbound atau setZoom ..
sumber
Saya tidak suka menyarankannya, tetapi jika Anda harus mencoba - panggilan pertama
gmap.fitBounds(bounds);
Kemudian buat Thread / AsyncTask baru, minta tidur selama 20-50ms atau lebih dan kemudian panggil
gmap.setZoom( Math.max(6, gmap.getZoom()) );
dari utas UI (gunakan handler atau
onPostExecute
metode untuk AsyncTask).Saya tidak tahu apakah itu berhasil, hanya sebuah saran. Selain itu, Anda harus menghitung sendiri tingkat pembesaran dari poin Anda sendiri, periksa apakah terlalu rendah, perbaiki, lalu panggil saja
gmap.setZoom(correctedZoom)
sumber
Jika 'bounds_changed' tidak diaktifkan dengan benar (terkadang Google tampaknya tidak menerima koordinat dengan sempurna), maka pertimbangkan untuk menggunakan 'center_changed'.
Peristiwa 'center_changed' diaktifkan setiap kali fitBounds () dipanggil, meskipun berjalan segera dan tidak harus setelah peta dipindahkan.
Dalam kasus normal, 'idle' masih menjadi pendengar acara terbaik, tetapi ini dapat membantu beberapa orang mengalami masalah aneh dengan panggilan fitBounds () mereka.
Lihat callback Google Map fitBounds
sumber
Untuk berpadu dengan solusi lain - saya menemukan bahwa pendekatan "mendengarkan acara bounds_changed dan kemudian mengatur zoom baru" tidak bekerja andal bagi saya. Saya pikir saya kadang-kadang menelepon
fitBounds
sebelum peta diinisialisasi penuh, dan inisialisasi menyebabkan peristiwa bounds_changed yang akan menghabiskan pendengar, sebelumfitBounds
mengubah batas dan tingkat zoom. Saya berakhir dengan kode ini, yang tampaknya berfungsi sejauh ini:sumber
Bagi saya solusi termudah adalah ini:
sumber
sumber
Yang saya lakukan adalah:
Dan itu bekerja pada V3 API.
sumber