Google Maps v3 - ограничение видимой области и уровня масштабирования - PullRequest
92 голосов
/ 29 сентября 2010

можно ли ограничить карту Google v3 определенной областью? Я хочу разрешить отображение только некоторой области (например, страны) и запретить пользователю скользить в другом месте. Также я хочу ограничить уровень масштабирования - например, только между уровнями 6 и 9. И я хочу использовать все базовые типы карт.

Есть ли способ добиться этого?

У меня был частичный успех с ограничением уровня масштабирования с помощью StyledMap, но мне удалось только с ограничением ROADMAP, я не смог ограничить масштабирование других основных типов таким образом.

Спасибо за любую помощь

Ответы [ 12 ]

175 голосов
/ 04 марта 2011

Лучшим способом ограничения уровня масштабирования может быть использование параметров minZoom / maxZoom вместо реакции на события?

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

Или параметры могут быть указаны во время инициализации карты, например ::

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

См .: Справочник по API Карт Google JavaScript V3

118 голосов
/ 29 сентября 2010

Вы можете прослушать событие dragend, и если карта перетаскивается за допустимые пределы, переместите ее обратно внутрь.Вы можете определить допустимые границы в объекте LatLngBounds, а затем использовать метод contains(), чтобы проверить, находится ли новый центр широты / ширины в пределах границ.

Вы также можете ограничитьуровень масштабирования очень легко.

Рассмотрим следующий пример: 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>

Снимок экрана из вышеприведенного примера.Пользователь не сможет перетащить дальше на юг или на дальний восток в этом случае:

Google Maps JavaScript API v3 Example: Force stop map dragging

8 голосов
/ 16 февраля 2019

Хорошие новости.Начиная с версии 3.35 API Карт JavaScript, которая была запущена 14 февраля 2019 года, вы можете использовать новую опцию restriction, чтобы ограничить область просмотра карты.

Согласно документации

Интерфейс MapRestriction

Ограничение, которое может быть применено к Карте.Окно просмотра карты не будет превышать эти ограничения.

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

Итак, теперь вы просто добавляете ограничение во время инициализации карты и все.Посмотрите на следующий пример, который ограничивает область просмотра Швейцарией

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>

Надеюсь, это поможет!

6 голосов
/ 08 декабря 2013

Для ограничения увеличения на v.3 +.в настройках вашей карты добавьте уровень масштабирования по умолчанию и уровни масштабирования minZoom или maxZoom (или оба, если требуется) от 0 до 19. Вы должны объявить уровень масштабирования по умолчанию, если требуется ограничение.все регистрозависимы!

function initialize() {
   var mapOptions = {
      maxZoom:17,
      minZoom:15,
      zoom:15,
      ....
3 голосов
/ 27 января 2012

Намного лучший способ ограничить диапазон ... Использовал логику содержимого сверху.

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);
                           });
1 голос
/ 04 июня 2015
myOptions = {
        center: myLatlng,
        minZoom: 6,
        maxZoom: 9,
        styles: customStyles,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
1 голос
/ 27 февраля 2014

Это может быть использовано для повторного центрирования карты в определенном месте.Что мне и нужно.

    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));
        }
    });
0 голосов
/ 10 июня 2016

По состоянию на середину 2016 года , официального способа ограничения видимой области не существует.Однако большинство специальных решений для ограничения границ имеют недостаток, поскольку они не ограничивают границы точно так, чтобы они соответствовали виду карты, они ограничивают его, только если центр карты находится за пределами указанных границ.Если вы хотите ограничить границы наложенным изображением, как я, это может привести к поведению, подобному показанному ниже, когда под наложением изображения отображается карта нижнего слоя:

enter image description here

Для решения этой проблемы я создал библиотеку , которая успешно ограничивает границы, поэтому вы не можете выполнить панорамирование из оверлея.

Однако, как и другие существующие решения, онаимеет "вибрирующую" проблему.Когда пользователь достаточно агрессивно перемещается по карте, после того, как он отпустил левую кнопку мыши, карта все равно продолжает панорамирование, постепенно замедляясь.Я всегда возвращаю карту к границам, но это приводит к вибрации.Этот эффект панорамирования не может быть остановлен никакими средствами, предоставляемыми Js API в данный момент.Похоже, что пока Google не добавит поддержку чего-то вроде map.stopPanningAnimation (), мы не сможем создать плавный опыт.

Пример использования упомянутой библиотеки, самый плавный опыт строгих границ, который я смог получить:

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>

Библиотека также может автоматически рассчитать минимальное ограничение масштабирования.Затем он ограничивает уровень масштабирования с помощью minZoom атрибута карты.

Надеюсь, это поможет кому-то, кто хочет решения, которое полностью уважает данные границы, и не хочет допускать панорамирование из них.

0 голосов
/ 03 сентября 2013

Одно решение, как, если вы знаете конкретный широту / долгота.

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

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

});

Если нет точных значений широта / долгота

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

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

});

или

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

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

});
0 голосов
/ 18 апреля 2013

Это может быть полезно.

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

Уровень масштабирования можно настраивать в соответствии с требованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...