Anda dapat mendengarkan dragend
acara tersebut, dan jika peta ditarik ke luar batas yang diizinkan, pindahkan kembali ke dalam. Anda dapat menentukan batas yang diizinkan dalam sebuah LatLngBounds
objek dan kemudian menggunakan contains()
metode ini untuk memeriksa apakah pusat lintang / bujur yang baru berada dalam batas tersebut.
Anda juga dapat membatasi level zoom dengan sangat mudah.
Perhatikan contoh berikut: Fiddle Demo
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Google Maps JavaScript API v3 Example: Limit Panning and Zoom</title>
<script type="text/javascript"
src="http://maps.google.com/maps/api/js?sensor=false"></script>
</head>
<body>
<div id="map" style="width: 400px; height: 300px;"></div>
<script type="text/javascript">
// This is the minimum zoom level that we'll allow
var minZoomLevel = 5;
var map = new google.maps.Map(document.getElementById('map'), {
zoom: minZoomLevel,
center: new google.maps.LatLng(38.50, -90.50),
mapTypeId: google.maps.MapTypeId.ROADMAP
});
// Bounds for North America
var strictBounds = new google.maps.LatLngBounds(
new google.maps.LatLng(28.70, -127.50),
new google.maps.LatLng(48.85, -55.90)
);
// Listen for the dragend event
google.maps.event.addListener(map, 'dragend', function() {
if (strictBounds.contains(map.getCenter())) return;
// We're out of bounds - Move the map back within the bounds
var c = map.getCenter(),
x = c.lng(),
y = c.lat(),
maxX = strictBounds.getNorthEast().lng(),
maxY = strictBounds.getNorthEast().lat(),
minX = strictBounds.getSouthWest().lng(),
minY = strictBounds.getSouthWest().lat();
if (x < minX) x = minX;
if (x > maxX) x = maxX;
if (y < minY) y = minY;
if (y > maxY) y = maxY;
map.setCenter(new google.maps.LatLng(y, x));
});
// Limit the zoom level
google.maps.event.addListener(map, 'zoom_changed', function() {
if (map.getZoom() < minZoomLevel) map.setZoom(minZoomLevel);
});
</script>
</body>
</html>
Tangkapan layar dari contoh di atas. Pengguna tidak akan dapat menyeret lebih jauh ke selatan atau timur jauh dalam kasus ini:
if (x < minX) x = minX;
danif (x > maxX) x = maxX;
tidak mengecualikan satu sama lain? Mengapa Anda memusatkan kanvas pada koordinat minX / maxX dan maxX / maxY meskipun keduanya bukan koordinat pusat?dragend
acara yang dapat Anda gunakandraggable: false
pada contoh peta ( contoh yang berfungsi )center_changed
acara, bukandragend
.Cara yang lebih baik untuk membatasi tingkat zoom mungkin menggunakan
minZoom
/maxZoom
options daripada bereaksi terhadap kejadian?Atau opsi dapat ditentukan selama inisialisasi peta, misalnya:
Lihat: Referensi Google Maps JavaScript API V3
sumber
Kabar baik. Mulai dari Maps JavaScript API versi 3.35 yang diluncurkan pada 14 Februari 2019, Anda dapat menggunakan
restriction
opsi baru untuk membatasi viewport peta.Menurut dokumentasi
sumber: https://developers.google.com/maps/documentation/javascript/reference/map#MapRestriction
Jadi, sekarang Anda hanya menambahkan opsi pembatasan selama inisialisasi peta dan itu. Lihat contoh berikut yang membatasi area pandang ke Swiss
Saya harap ini membantu!
sumber
Untuk membatasi zoom pada v.3 +. dalam pengaturan peta Anda, tambahkan tingkat zoom default dan minZoom atau maxZoom (atau keduanya jika diperlukan) tingkat zoom adalah 0 hingga 19. Anda harus menyatakan tingkat zoom yang tuli jika batasan diperlukan. semua case sensitive!
sumber
Cara yang jauh lebih baik untuk membatasi jangkauan ... menggunakan logika berisi dari poster di atas.
sumber
this.googleMap
bukanmap
untuk pendengar kedua? Juga tidakdragStart
bolehdragStartCenter
? Terakhir apamapBounds
?Ini dapat digunakan untuk memusatkan kembali peta ke lokasi tertentu. Itulah yang saya butuhkan.
sumber
sumber
Inilah varian saya untuk memecahkan masalah batasan area yang dapat dilihat.
strictBounds
adalah objeknew google.maps.LatLngBounds()
bertipe.self.gmap
menyimpan objek Google Map (new google.maps.Map()
).Ini benar-benar berfungsi tetapi jangan hanya lupa untuk memperhitungkan wasir dengan melintasi garis meridian ke 0 dan paralel jika batas Anda menutupinya.
sumber
Untuk beberapa alasan
tidak berhasil untuk saya (mungkin masalah belahan bumi selatan). Saya harus mengubahnya menjadi:
Semoga bisa membantu seseorang.
sumber
Salah satu solusinya adalah seperti, Jika Anda mengetahui garis lintang / lng spesifik.
Jika tidak memiliki lintang / bujur tertentu
atau
sumber
Hingga pertengahan 2016 , tidak ada cara resmi untuk membatasi area yang dapat dilihat. Sebagian besar solusi ad-hoc untuk membatasi batas memiliki kekurangan, karena mereka tidak membatasi secara tepat agar sesuai dengan tampilan peta, mereka hanya membatasinya jika pusat peta berada di luar batas yang ditentukan. Jika Anda ingin membatasi batas ke gambar overlay seperti saya, ini dapat mengakibatkan perilaku seperti yang diilustrasikan di bawah ini, di mana peta yang mendasari terlihat di bawah hamparan gambar kami:
Untuk mengatasi masalah ini, saya telah membuat perpustakaan , yang berhasil membatasi batas sehingga Anda tidak dapat keluar dari hamparan.
Namun, seperti solusi lain yang ada, ini memiliki masalah "bergetar". Saat pengguna menggeser peta dengan cukup agresif, setelah mereka melepaskan tombol kiri mouse, peta masih terus menggeser dengan sendirinya, secara bertahap melambat. Saya selalu mengembalikan peta ke batas, tetapi itu menghasilkan semacam getaran. Efek panning ini tidak dapat dihentikan dengan cara apa pun yang disediakan oleh Js API saat ini. Tampaknya hingga Google menambahkan dukungan untuk sesuatu seperti map.stopPanningAnimation (), kami tidak akan dapat menciptakan pengalaman yang mulus.
Contoh menggunakan pustaka yang disebutkan, pengalaman batas ketat paling halus yang bisa saya dapatkan:
Perpustakaan juga dapat menghitung batasan zoom minimum secara otomatis. Kemudian membatasi tingkat zoom menggunakan
minZoom
atribut peta.Mudah-mudahan ini membantu seseorang yang menginginkan solusi yang sepenuhnya menghormati batasan yang diberikan dan tidak ingin membiarkannya keluar.
sumber
Ini mungkin berguna.
Tingkat Zoom dapat disesuaikan sesuai kebutuhan.
sumber
e.g. only between levels 6 and 9
, ini menetapkan tingkat zoom default dan menghapus UI default (yaitu+
/-
) yang sedikit berlebihan.