Почему Google Maps .getCenter () возвращает неверные координаты? - PullRequest
0 голосов
/ 14 февраля 2019

На сайте с относительно высоким трафиком, который посещают пользователи со всего мира, начиная со вчерашнего дня (13/02/2019), примерно в 17:00 по UTC мы начали получать обратные вызовы AJAX с недопустимыми координатами.

У нас есть Javascript, который определяет, когда карта простаивает, а затем отправляет координаты на наш сервер для обратного поиска геокодера.Вот упрощение:

google.maps.event.addListener(mapObject, 'idle', function() {
  $.ajax({
    url: '/geo/reverse/lookup',
    type: 'GET',
    dataType: 'json',
    data: { 
      lat: mapObject.getCenter().lat(), 
      lng: mapObject.getCenter().lng() 
    }
  })
});

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

Нам не удалось воспроизвести проблему дома.Но я догадывался, что это связано с браузером.Возможно, была выпущена новая версия браузера, и она по-другому обрабатывает Gmaps JS.Таким образом, мы начали смотреть на агентов пользователя плохих запросов.Большинство браузеров являются отчетными агентами Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1, однако не ВСЕ запросы относятся к Mobile Safari, поэтому я не уверен, является ли это браузером или проблемой Gmaps.

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

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Я проверил версии 3.35 и 3.36, и похоже, что getCenter () не упакован в соответствии с этим документ , но не происходит в версии 3.34.

Эта проблема также произошло в прошлом 2011 году.

function initialize() {

    var myLatLng = new google.maps.LatLng(46.2,6.17);
    var mapOptions = {
        zoom: 2,
        center: myLatLng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    
    var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
    
    google.maps.event.addListener(map, 'idle', function() {
    
     // document.getElementById('lat').value = map.getCenter().lat();
     // document.getElementById('lng').value = map.getCenter().lng();
var center = map.getCenter();
var wrapped = new google.maps.LatLng(center.lat(), center.lng());
document.getElementById('lat').value = wrapped.lat();
document.getElementById('lng').value = wrapped.lng();
    });
}
   initialize();
body {
  font-family: Arial;
  font-size: 10px;
}

#map-canvas {
  height: 150px;
  margin-bottom: 10px;
}
<div id="map-canvas"></div>

<script src="https://maps.googleapis.com/maps/api/js?v=3.36&key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>
Lat: <input id="lat" type="text" /> Lng: <input id="lng" type="text" />
0 голосов
/ 15 февраля 2019

Кажется, есть проблема с методом getCenter с версиями 3.35 и 3.36 API.Версия 3.34 работает нормально.

Я не могу получить значение широты больше 90, но просто панорамирование карты влево или вправо (в одном направлении) несколько раз показывает значения долготы внедиапазона -180 / 180 градусов .

Я открыл отчет об ошибке в трекере проблем .

function initialize() {

    var myLatLng = new google.maps.LatLng(46.2,6.17);
    var mapOptions = {
        zoom: 2,
        center: myLatLng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    
    var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
    
    google.maps.event.addListener(map, 'idle', function() {
    
      document.getElementById('lat').value = map.getCenter().lat();
      document.getElementById('lng').value = map.getCenter().lng();
    });
}

initialize();
body {
  font-family: Arial;
  font-size: 10px;
}

#map-canvas {
  height: 150px;
  margin-bottom: 10px;
}
<div id="map-canvas"></div>

<script src="https://maps.googleapis.com/maps/api/js?v=3.36&key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>
Lat: <input id="lat" type="text" /> Lng: <input id="lng" type="text" />

Вот тот же код с версия 3.34 , который отлично работает:

function initialize() {

    var myLatLng = new google.maps.LatLng(46.2,6.17);
    var mapOptions = {
        zoom: 2,
        center: myLatLng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    
    var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
    
    google.maps.event.addListener(map, 'idle', function() {
    
      document.getElementById('lat').value = map.getCenter().lat();
      document.getElementById('lng').value = map.getCenter().lng();
    });
}

initialize();
body {
  font-family: Arial;
  font-size: 10px;
}

#map-canvas {
  height: 150px;
  margin-bottom: 10px;
}
<div id="map-canvas"></div>

<script src="https://maps.googleapis.com/maps/api/js?v=3.34&key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>
Lat: <input id="lat" type="text" /> Lng: <input id="lng" type="text" />
...