Google Haritalar v3 - görüntülenebilir alanı ve yakınlaştırma seviyesini sınırlayın


98

Google harita v3'ü belirli bir alanla sınırlamak mümkün mü? Yalnızca bazı alanların (örneğin bir ülke) görüntülenmesine izin vermek ve kullanıcının başka bir yere kaymasına izin vermemek istiyorum. Ayrıca yakınlaştırma düzeyini sınırlamak istiyorum - örn. Yalnızca 6. ve 9. düzeyler arasında. Ve tüm temel harita türlerini kullanmak istiyorum.

Bunu başarabilmenin bir yolu var mı?

StyledMap kullanarak yakınlaştırma düzeyini sınırlama konusunda kısmi bir başarı elde ettim, ancak yalnızca ROADMAP'i kısıtlayarak başarılı oldum, diğer temel türlerde yakınlaştırmayı bu şekilde sınırlayamadım.

Herhangi bir yardım için teşekkürler

Yanıtlar:


119

dragendEtkinliği dinleyebilirsiniz ve harita izin verilen sınırların dışına sürüklenirse tekrar içeri taşıyın. Bir LatLngBoundsnesnede izin verilen sınırlarınızı tanımlayabilir ve ardından contains()yeni enlem / boylam merkezinin sınırlar içinde olup olmadığını kontrol etmek için yöntemi kullanabilirsiniz .

Ayrıca yakınlaştırma düzeyini çok kolay bir şekilde sınırlayabilirsiniz.

Aşağıdaki örneği düşünün: 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>

Yukarıdaki örnekten ekran görüntüsü. Kullanıcı bu durumda daha fazla güneye veya uzak doğuya sürükleyemez:

Google Maps JavaScript API v3 Örnek: Harita sürüklemeyi zorla durdurma


2
Karar net görünmüyor. Neden if (x < minX) x = minX;ve if (x > maxX) x = maxX;birbirini dışlamaz mı? Neden tuvali minX / maxX ve maxX / maxY koordinatlarında ortalıyorsunuz ama bunlar merkezin koordinatları değil?
Alexander Palamarchuk

1
dragendOlay yerine draggable: falseharita örneğini kullanabilirsiniz ( çalışma örneği )
machineaddict

Bu, kullanıcıyı kısıtlamak için "zoom_changed" olayını kullanmak için iyi bir teknik değildir. İlk seferinde her zaman minimum seviyenin ötesine geçeceği ve ardından kodunuzu kullanarak, minimum yakınlaştırmayı yeniden ayarlıyorsunuz, bu da ekranı dolduracak.
Jitendra Pancholi

kontrol zillow.com/homes/for_sale/days_sort/... Onlar emin nasıl doğru bir şekilde yaptım.
Jitendra Pancholi

1
Bunun center_changedyerine etkinliğe geçersem bu benim için mükemmel çalıştı dragend.
Johan B

182

Yakınlaştırma düzeyini kısıtlamanın daha iyi bir yolu , olaylara tepki vermek yerine minZoom/ maxZoomoptions kullanmak olabilir.

var opt = { minZoom: 6, maxZoom: 9 };
map.setOptions(opt);

Veya seçenekler harita başlatma sırasında belirlenebilir, örneğin:

var map = new google.maps.Map(document.getElementById('map-canvas'), opt);

Bkz: Google Maps JavaScript API V3 Referansı


3
Şimdi bu, kesinlikle yakınlaştırma düzeyini sınırlamanın en iyi yoludur. Gönderiyi yazarken bu özellik Maps API v3'te mevcut değildi. Neyse ki, API'yi geliştirmeye devam ediyorlar.
Tomik

2
Bu mükemmel çalışıyor, yakınlaştırma için en iyi cevap bu olmalı.
paullb

3
Bu, yalnızca seçilen cevaba bakanların cevabı olarak işaretlenmelidir.
ErJab

9
yakınlaştırma düzeyini ayarlamanın kaydırma üzerinde hiçbir etkisi yoktur.
simpatico

1
Kesinlikle gitmek için en iyi yol
ChrisRich

17

İyi haberler. 14 Şubat 2019'da başlatılan Maps JavaScript API 3.35 sürümünden başlayarak restriction, haritanın görüntü alanını sınırlandırmak için yeni seçeneği kullanabilirsiniz .

Belgelere göre

MapRestriction arayüzü

Haritaya uygulanabilecek bir kısıtlama. Haritanın görüntü alanı bu kısıtlamaları aşmayacaktır.

kaynak: https://developers.google.com/maps/documentation/javascript/reference/map#MapRestriction

Yani, şimdi bir harita başlatma sırasında sadece kısıtlama seçeneği ekliyorsunuz ve bu. Görüntü alanını İsviçre ile sınırlayan aşağıdaki örneğe bir göz atın

var map;
function initMap() {
  map = new google.maps.Map(document.getElementById('map'), {
    center: {lat: 46.818188, lng: 8.227512},
    minZoom: 7,
    maxZoom: 14,
    zoom: 7,
    restriction: {
      latLngBounds: {
        east: 10.49234,
        north: 47.808455,
        south: 45.81792,
        west: 5.95608
      },
      strictBounds: true
    },
  });
}
#map {
  height: 100%;
}
html, body {
  height: 100%;
  margin: 0;
  padding: 0;
}
<div id="map"></div>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDztlrk_3CnzGHo7CFvLFqE_2bUKEq1JEU&callback=initMap" async defer></script>

Umarım bu yardımcı olur!


Bağlantı çalışmıyor. İşte bu konuyla ilgili yeniler: ÖRNEK: geliştiriciler- dot-devsite-v2-prod.appspot.com/maps/documentation/… DOCS: developer-dot-devsite-v2-prod.appspot.com/maps/documentation/ …
Adam

1
Sabit dokümantasyon bağlantısı.
xomena

Teşekkürler, bu kod işe yaradı. Yani, yakınlaştırmayı minZoom ve maxZoom ile mümkün olan yalnızca 1 seviyeye sınırlarsanız. Bu amaçlandığı gibi çalışıyorsa, her yakınlaştırma seviyesi için farklı güney, batı, noth, doğu ayarlamanız gerekiyor gibi görünüyor. Her yakınlaştırma seviyesi için farklı bir kısıtlama ayarına sahip olmak güzel olurdu. Maksimum uzaklaştırma seviyem için gittim ve oradan koordinatları tanımladım, böylece yakınlaştırırsanız ve sonra kaydırırsanız sınırların dışına kaydırmayı mümkün kılar.
Kim Steinhaug

6

Yakınlaştırmayı v.3 + 'da sınırlamak için. Harita ayarınızda varsayılan yakınlaştırma düzeyi ekleyin ve minZoom veya maxZoom (veya gerekirse her ikisi) yakınlaştırma düzeyleri 0 ila 19'dur. Sınırlama gerekiyorsa sağır yakınlaştırma düzeyini belirtmelisiniz. tümü büyük / küçük harfe duyarlıdır!

function initialize() {
   var mapOptions = {
      maxZoom:17,
      minZoom:15,
      zoom:15,
      ....

3

Aralığı sınırlamanın çok daha iyi bir yolu ... yukarıdaki posterden içerme mantığını kullandı.

var dragStartCenter;

google.maps.event.addListener(map, 'dragstart', function(){
                                       dragStartCenter = map.getCenter();
                                         });

google.maps.event.addListener(this.googleMap, 'dragend', function(){
                            if (mapBounds.contains(map.getCenter())) return;
                    map.setCenter(this.dragStart);
                           });

Neden ikinci dinleyici this.googleMapyerine ekliyorsunuz map? Ayrıca olmamalıdır dragStartolmak dragStartCenter? Son olarak nedir mapBounds?
hobbes3

2
Elbette tek yaptığı, kullanıcının tek bir sürükleme hareketiyle uzağa sürüklemesini durdurmak mı? Hala bir sürü küçük sürükleme yapıp herhangi bir yere varabilirler, değil mi?
James

1

Bu, haritayı belirli bir konuma yeniden ortalamak için kullanılabilir. İşte ihtiyacım olan şey.

    var MapBounds = new google.maps.LatLngBounds(
    new google.maps.LatLng(35.676263, 13.949096),
    new google.maps.LatLng(36.204391, 14.89038));

    google.maps.event.addListener(GoogleMap, 'dragend', function ()
    {
        if (MapBounds.contains(GoogleMap.getCenter()))
        {
            return;
        }
        else
        {
            GoogleMap.setCenter(new google.maps.LatLng(35.920242, 14.428825));
        }
    });

1
myOptions = {
        center: myLatlng,
        minZoom: 6,
        maxZoom: 9,
        styles: customStyles,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

1
Bu soruya cevap vermiyor.
Kit Sunde

0

Görüntülenebilir alan sınırlaması sorununu çözmek için benim varyantım.

        google.maps.event.addListener(this.map, 'idle', function() {
            var minLat = strictBounds.getSouthWest().lat();
            var minLon = strictBounds.getSouthWest().lng();
            var maxLat = strictBounds.getNorthEast().lat();
            var maxLon = strictBounds.getNorthEast().lng();
            var cBounds  = self.map.getBounds();
            var cMinLat = cBounds.getSouthWest().lat();
            var cMinLon = cBounds.getSouthWest().lng();
            var cMaxLat = cBounds.getNorthEast().lat();
            var cMaxLon = cBounds.getNorthEast().lng();
            var centerLat = self.map.getCenter().lat();
            var centerLon = self.map.getCenter().lng();

            if((cMaxLat - cMinLat > maxLat - minLat) || (cMaxLon - cMinLon > maxLon - minLon))
            {   //We can't position the canvas to strict borders with a current zoom level
                self.map.setZoomLevel(self.map.getZoomLevel()+1);
                return;
            }
            if(cMinLat < minLat)
                var newCenterLat = minLat + ((cMaxLat-cMinLat) / 2);
            else if(cMaxLat > maxLat)
                var newCenterLat = maxLat - ((cMaxLat-cMinLat) / 2);
            else
                var newCenterLat = centerLat;
            if(cMinLon < minLon)
                var newCenterLon = minLon + ((cMaxLon-cMinLon) / 2);
            else if(cMaxLon > maxLon)
                var newCenterLon = maxLon - ((cMaxLon-cMinLon) / 2);
            else
                var newCenterLon = centerLon;

            if(newCenterLat != centerLat || newCenterLon != centerLon)
                self.map.setCenter(new google.maps.LatLng(newCenterLat, newCenterLon));
        });

strictBoundsnew google.maps.LatLngBounds()türden bir nesnedir . self.gmapbir Google Harita nesnesini ( new google.maps.Map()) depolar .

Gerçekten işe yarıyor, ancak sınırlarınız onları kapsıyorsa, 0'ıncı meridyenleri ve paralelleri geçen hemoroitleri hesaba katmayı unutmayın.


Daniel Vassallo'nun algoritması benim için düzgün çalışmıyor kabul edildi. Burada birkaç temel fark var.
Alexander Palamarchuk

0

Bazı sebeplerden dolayı

if (strictBounds.contains(map.getCenter())) return;

benim için işe yaramadı (belki bir güney yarımküre sorunu). Bunu şu şekilde değiştirmek zorunda kaldım:

    function checkBounds() {
        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 > maxX || y < minY || y > maxY) {
            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));
        }
    }

Umarım birine yardımcı olur.


0

Çözümlerden biri, Belirli enlem / boylamı biliyorsanız gibi.

google.maps.event.addListener(map, 'idle', function() {

    map.setCenter(new google.maps.LatLng(latitude, longitude));
    map.setZoom(8);

});

Belirli enlem / boylam yoksa

google.maps.event.addListener(map, 'idle', function() {

    map.setCenter(map.getCenter());
    map.setZoom(8);

});

veya

google.maps.event.addListener(map, 'idle', function() {

    var bounds = new google.maps.LatLngBounds();
    map.setCenter(bounds.getCenter());
    map.setZoom(8);

});

0

2016'nın ortalarından itibaren , görüntülenebilir alanı kısıtlamanın resmi bir yolu yoktur. Sınırları kısıtlamaya yönelik çoğu geçici çözümün bir kusuru olsa da, sınırları tam olarak harita görünümüne sığacak şekilde kısıtlamadıkları için, yalnızca haritanın merkezi belirtilen sınırların dışındaysa sınırlarlar. Sınırları benim gibi üst üste binen görüntüyle sınırlamak istiyorsanız, bu, aşağıda gösterildiği gibi, altta yatan haritanın görüntü bindirmemizin altında göründüğü bir davranışla sonuçlanabilir:

görüntü açıklamasını buraya girin

Bu sorunu çözmek için , bindirmenin dışına çıkamayacağınız şekilde sınırları başarıyla kısıtlayan bir kitaplık oluşturdum .

Ancak, diğer mevcut çözümlerde olduğu gibi, bir "titreşim" sorunu var. Kullanıcı haritayı yeterince agresif bir şekilde kaydırdığında, farenin sol düğmesini bıraktıktan sonra, harita yavaş yavaş kendi kendine kaydırmaya devam eder. Haritayı her zaman sınırlara geri döndürürüm, ama bu bir tür titreşime neden olur. Bu kaydırma etkisi, şu anda Js API tarafından sağlanan herhangi bir yöntemle durdurulamaz. Görünüşe göre Google, map.stopPanningAnimation () gibi bir şey için destek ekleyene kadar sorunsuz bir deneyim oluşturamayacağız.

Söz konusu kitaplığı kullanarak elde ettiğim en sorunsuz katı sınır deneyimi örneği:

function initialise(){
  
  var myOptions = {
     zoom: 5,
     center: new google.maps.LatLng(0,0),
     mapTypeId: google.maps.MapTypeId.ROADMAP,
  };
  var map = new google.maps.Map(document.getElementById('map'), myOptions);
  
  addStrictBoundsImage(map);
}

function addStrictBoundsImage(map){
	var bounds = new google.maps.LatLngBounds(
		new google.maps.LatLng(62.281819, -150.287132),
		new google.maps.LatLng(62.400471, -150.005608));

	var image_src = 'https://developers.google.com/maps/documentation/' +
		'javascript/examples/full/images/talkeetna.png';

	var strict_bounds_image = new StrictBoundsImage(bounds, image_src, map);
}
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
      <script type="text/javascript">
        google.load("maps", "3",{other_params:"sensor=false"});
      </script>
<body style="margin:0px; padding:0px;" onload="initialise()">
	 <div id="map" style="height:400px; width:500px;"></div>
     <script  type="text/javascript"src="https://raw.githubusercontent.com/matej-pavla/StrictBoundsImage/master/StrictBoundsImage.js"></script>
</body>

Kütüphane ayrıca minimum yakınlaştırma sınırlamasını otomatik olarak hesaplayabilir. Daha sonra minZoomharitanın özelliğini kullanarak yakınlaştırma seviyesini sınırlar .

Umarım bu, verilen sınırlara tam anlamıyla saygı duyan ve bunların dışına çıkılmasına izin vermek istemeyen bir çözüm isteyen birine yardımcı olur.


-4

Bu yardımcı olabilir.

  var myOptions = {
      center: new google.maps.LatLng($lat,$lang),
      zoom: 7,
      disableDefaultUI: true,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };

Yakınlaştırma seviyesi ihtiyaca göre özelleştirilebilir.


Bu, yakınlaştırma düzeyini bir aralıkla sınırlamakla ilgili orijinal soruyu ele almaz e.g. only between levels 6 and 9, varsayılan yakınlaştırma düzeyini ayarlar ve biraz fazla olan varsayılan kullanıcı arabirimini (yani +/ -) kaldırır .
Alastair
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.