#google-maps #google-maps-api-3 #gis
#google-карты #google-maps-api-3 #гис
Вопрос:
Я хочу отобразить список маркеров, которые расположены внутри ограничивающей рамки карты. У меня работает базовая реализация, которая перехватывает событие «bounds_changed» карты и отправляет AJAX-запрос на мой сервер с широтными / длинными координатами юго-западного и северо-восточного углов карты. Это работает для большинства сценариев, однако я обнаружил, что эта реализация прерывается, если пользователь перемещается слишком далеко на восток / запад.
Например, предположим, что изначально ограничивающая рамка представляет собой весь мир (юго-западный угол: [-90, -180], северо-западный угол: [90, 180]). Затем, если пользователь поворачивает на запад на 180 градусов, ограничивающая рамка становится [-90, -360] / [90, 0]. Это прерывает мой AJAX-запрос, потому что, хотя весь мир по-прежнему виден пользователю, любые маркеры с долготой > 0 не будут возвращены моим запросом к базе данных.
Каков наилучший способ справиться с этим?
Ответ №1:
Самый простой способ сделать это — проверить значения широты и долготы при их получении, и если они больше, чем «реальные» широта и долгота, вы просто убедитесь, что получили их соответствующие значения в диапазоне [-90; 90] для долготы и [-180; 180] для долготы.
В качестве дополнительного примечания: если вы хотите сэкономить на всех вызовах ajax, вы можете сделать это с помощью javascript. google.maps.В классе LatLngBounds есть метод contains, который проверяет, находится ли данный latlng в границах. Затем вы просто сохраняете все свои маркеры в массиве при инициализации сайта, а затем выполняете итерацию по ним, когда пользователь выполняет панорамирование, и устанавливаете для их свойства visible значение true, если они находятся в пределах текущих границ. Вы можете получить текущие границы, вызвав getBounds() на вашем экземпляре карты.
Использование метода map.getBounds().contains() также решит вашу проблему, не беспокоясь о том, не заходит ли пользователь слишком далеко, поскольку API обрабатывает это за вас.