Google Maps API V3: уменьшение масштаба снимает ограничение панорамирования;обходной путь? - PullRequest
1 голос
/ 03 декабря 2011
function initialize() {
    var latlng = new google.maps.LatLng(37.7702429, -122.4245789);

    var myOptions = {
      zoom: 3,
      center: latlng,
      disableDefaultUI: false,
      mapTypeId: google.maps.MapTypeId.TERRAIN,
    };

    var map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);

    // Limit panning
    // Latitude bounds for map, longitude not important
    var southWest = new google.maps.LatLng(-85.000, -122.591);
    var northEast = new google.maps.LatLng(85.000, -122.333);
    var allowedBounds = new google.maps.LatLngBounds(southWest, northEast);

    // Add a move listener to restrict the bounds range
    google.maps.event.addListener(map, "center_changed", function() {checkBounds(); });

    //If zoom out at bound limit then map breaks; center doesn't change but bounds get broken. Listen for zoom event and try to correct bound break. **Doesn't Work**
    google.maps.event.addListener(map, 'zoom_changed', function() {checkBounds(); });

    // If the map position is out of range, move it back
    function checkBounds() {

      // Perform the check and return if OK
      if ((allowedBounds.getNorthEast().lat()>(map.getBounds().getNorthEast().lat()))&&(allowedBounds.getSouthWest().lat()<(map.getBounds().getSouthWest().lat()))) {
        lastValidCenter = map.getCenter();
        lastValidZoom = map.getZoom();
        return;
      }

      // not valid anymore => return to last valid position
      map.panTo(lastValidCenter);
      map.setZoom(lastValidZoom);
    }
  }

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

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

Любая помощь, которую могут предложить ваши гении, очень важна.

Ответы [ 3 ]

1 голос
/ 06 декабря 2011

Хорошо, это было очень просто. Событие zoom_changed не работало должным образом, и само по себе bounds_changed не было удовлетворительным. Эта карта не будет выходить за границы при панорамировании или масштабировании и идеально подходит, если вы хотите, чтобы пользователь видел только карту без серого фона. Не очень хорошо, если ваши пользователи хотят центрировать карту на высокой широте и низком уровне масштабирования. Перейди тот мост позже. Вот код:

    // The allowed region which the whole map must be within
    var southWest = new google.maps.LatLng(-85.000, -122.591);
    var northEast = new google.maps.LatLng(85.000, -122.333);
    var allowedBounds = new google.maps.LatLngBounds(southWest, northEast);

    // Add listeners to trigger checkBounds(). bounds_changed deals with zoom changes.
    google.maps.event.addListener(map, "center_changed", function() {checkBounds(); });
    google.maps.event.addListener(map, 'bounds_changed', function() {checkBounds(); });

    // If the map bounds are out of range, move it back
    function checkBounds() {
      // Perform the check and return if OK
      if ((allowedBounds.getNorthEast().lat()>(map.getBounds().getNorthEast().lat()))&&(allowedBounds.getSouthWest().lat()<(map.getBounds().getSouthWest().lat()))) {
        lastValidCenter = map.getCenter();
        lastValidZoom = map.getZoom();
        return
      }
      // not valid anymore => return to last valid position
      map.panTo(lastValidCenter);
      map.setZoom(lastValidZoom);
1 голос
/ 14 апреля 2012

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

PANING Карты Google всегда были глючными, особенно по краям или рядом с любым из значков Google для масштабирования и т. Д.

вам нужно вернуться к основам, забыть о функциях и сценариях, просто спроситеЕСЛИ операторы

, подобные этому, НЕ МОГУТ ПОМНИТЬ, ЧТО Я СДЕЛАЛ ПАРУ ГОДОВ, но суть в том, что

1) хранит 4 переменные для представления четырех строк на карте

левый край западный правый край восточный верхний край северный нижний край юг

другой, чтобы отслеживать центр LAT LNG (начальный центр такой же, как первая карта, отображаемая при загрузке)

i, eесли вы поворачиваете влево или запад на X, вы делаете центр / центр (для американцев) равным текущему центру плюс плюс панорамирование X для всех остальных направлений панорамирования, добавляя или вычитая требуемые широты и долготы

, чтобы проверить, чтоесли вы не достигли края (за исключением проб и ошибок), это приводит к тому, что ошибка Google появляется рядом со значками вокруг края

или ставится иначеона делает LAT и LNG, которые вы проверяете, меньшими, чем отображаемая карта

, если левый или западный край отображаемой карты имеет долготу x прекратите панорамирование (не выполняя регулировки s в вашем центре VARIABLE вX - 10 долгот одинаковы для всех остальных 3-х сторон плюс или минус необходимое количество

верхний край на север будет на широте, нижний край на юг будет на широте a - все, что вы выбрали

слевакрай на западе будет на долготе b правый край на востоке будет на долготе b - независимо от того, что вы выбрали

, все они будут в пределах отображаемой карты, но скажем, 0,5 широты или долготы, чем отображаемая карта

если ваша панорама пересекает любую из ваших тонких линий, вы устанавливаете центральную переменную назад или вперед, и вы перемещаетесь назад или вперед, скажем, от 0,1 до 0,5 зрителей широты или долготы, просто увидят легкий рывок назад, когда они панорамируют за пределы вашего предde = мелкие четыре строки на карте.

Код будет похож на базовый код ученика, но будетЯ работаю.

по крайней мере, он сделал для меня после некоторых проб и ошибок и обычных ошибок отладки и т. д.

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

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

это похоже на создание простой программы для учащихся, в которой, если вы перемещаетесь вверх или вниз или по диагонали, вы настраиваете центральный СПГ в вашей переменной, в которой хранится текущий центр (это ваша собственная переменная, а не переменная Google), если центр (хранится вваша собственная переменная) пересекает одну из ваших линий, прекратите панорамирование и установите центр Gmap назад вперед вверх или вниз, немного плюс или минус доля LAT или LNG

0 голосов
/ 03 декабря 2011

Спасибо, ваш скрипт разбил мою Mozilla :-) Это, вероятно, потому что событие zoom_changed не дает вам правильный центр в вызове getCenter().Известной проблемой является то, что обработчик событий zoom_changed не дает правильных границ , поэтому он может применяться и к центру.Я попытался изменить ваш код так, чтобы он обрабатывал только событие bounds_changed (вместо zoom_changed и center_changed), и проблема исчезла!Но это не ведет себя идеально также.Может быть, лучше взглянуть на этот пример ограничения диапазона , он прекрасно работает.

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