Как ограничить панорамирование в Google Maps API V3? - PullRequest
74 голосов
/ 26 июня 2010

В V2 был способ ограничить панорамирование / перетаскивание, чтобы карта оставалась в определенных пределах. Как это делается в V3?

Допустим, я хочу, чтобы пользователи смотрели только на Европу. Я уже ограничил масштаб, но если я разрешу перетаскивать (что в данном случае необходимо по другим причинам), тогда пользователь сможет перемещаться за пределы области, которую я хочу показать.

Пожалуйста, дайте рабочий пример или фрагмент кода - я не эксперт по программированию ...

Спасибо!

Ответы [ 14 ]

0 голосов
/ 04 июня 2016

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

Мне нужно было ограничить вертикальные границы (широта)карта, так что пользователь не сможет перемещаться за пределы широты Земли (~ +/- 85 градусов), но любые другие границы тоже будут работать.

Этот подход использует тот же center_changedсобытие, как описано в другом месте, и просто фиксирует центр в случае отображения частей запрещенных границ.

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

Рабочий пример: http://jsbin.com/vizihe

function initMap() {
  // sample bounds, can be anything and goes hand in hand with minZoom
  var northBoundary = 40
  var southBoundary = -40

  var map = new google.maps.Map(document.getElementById('map'), {
    center: {lat: 0, lng: 0},
    zoom: 4,
    // it's important to set this to a large enough value
    // so that zooming out does not show an area larger than allowed
    minZoom: 4 
  })

  map.addListener('center_changed', function () {
    var bounds = map.getBounds();
    var ne = bounds.getNorthEast()
    var sw = bounds.getSouthWest()
    var center = map.getCenter()

    if(ne.lat() > northBoundary) {
      map.setCenter({lat: center.lat() - (ne.lat() - northBoundary), lng: center.lng()})
    }

    if(sw.lat() < southBoundary) {
      map.setCenter({lat: center.lat() - (sw.lat() - southBoundary), lng: center.lng()})
    }   
  })
}
html, body, #map {
  height: 100%;
  margin: 0;
  padding: 0;
}
<!DOCTYPE html>
<html>
  <head>
<meta name="description" content="limit google map panning">
    <title>Simple Map</title>
    <meta name="viewport" content="initial-scale=1.0">
    <meta charset="utf-8">
  </head>
  <body>
    <div id="map"></div>
    <script src="https://maps.googleapis.com/maps/api/js?callback=initMap"
    async defer></script>
  </body>
</html>
0 голосов
/ 19 мая 2015

Это HenningJ - но HenningJ на ios использует lastValidCentre - что нехорошо, так как он старый, поэтому я зажимаю, что делает его лучше на iOS.

var mapObject = plugin_map.gmap3('get');
var allowedBounds = new google.maps.LatLngBounds(
     new google.maps.LatLng(41.3957556, -88.4345472), 
     new google.maps.LatLng(49.4010417, -78.4286389)
);
google.maps.event.addListener(mapObject, 'center_changed', function() {
    if (allowedBounds.contains(mapObject.getCenter())) {
        // still within valid bounds, so save the last valid position
        return; 
    }

    // not valid anymore => return to last valid position
     var c = mapObject.getCenter(),
         x = c.lng(),
         y = c.lat(),
         maxX = allowedBounds.getNorthEast().lng(),
         maxY = allowedBounds.getNorthEast().lat(),
         minX = allowedBounds.getSouthWest().lng(),
         minY = allowedBounds.getSouthWest().lat();

     if (x < minX) x = minX;
     if (x > maxX) x = maxX;
     if (y < minY) y = minY;
     if (y > maxY) y = maxY;

     //mapObject.setCenter(new google.maps.LatLng(y, x));
     mapObject.panTo(new google.maps.LatLng(y, x));
});
0 голосов
/ 26 июня 2013

Решения здесь оставили мне 2 проблемы. Прежде всего, если вы удерживаете нажатой клавишу со стрелкой, чтобы она начала быстро панорамировать, когда она коснется края, она не пойдет до самого края, потому что из-за ускорения панорамирования, выполняющего большие «шаги», следующий шаг "вышел бы за пределы, так что это не последний шаг". Поэтому, как только он остановился, вы можете отпустить клавишу со стрелкой, а затем нажать ее снова, и она будет перемещаться немного дальше. Во-вторых, эти решения не содержат должным образом панорамирование после изменения масштаба. Мне удалось решить оба вопроса и опубликовать свое решение в другой ветке , но я решил связать его здесь, поскольку именно эта ветка впервые подтолкнула меня к правильному направлению.

0 голосов
/ 09 июля 2012

Когда я использую перетаскивание, драгенд или что-то еще, карта возвращается в допустимые пределы вместо простого ограничения переполнения.Просто измените событие на 'center_changed', чтобы оно не прыгал так.

Модифицированный jsfiddle: http://jsfiddle.net/Vjdde/1/

Редактировать: Не уверен, почему скрипка не вызывает переполнение стека,так и должно быть, поскольку setCenter снова будет вызывать center_changed. Просто следите за

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