javascript - 为什么 Google Maps .getCenter() 返回无效坐标?

标签 javascript google-maps google-maps-api-3 mobile-safari user-agent

在一个拥有来自世界各地用户的流量相对较高的网站上,从昨天(2019 年 2 月 13 日)开始,大约在世界标准时间下午 5 点,我们开始收到带有无效坐标的 AJAX 回调。

我们有 Javascript 检测 map 何时空闲,然后将坐标发送到我们的服务器以进行反向地理编码器查找。这是一个简化:

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,如 Mac OS X)AppleWebKit/605.1.15(KHTML,如 Gecko)Version/12.0 Mobile/15E148 Safari/604.1但是并非所有请求都是 Mobile Safari,因此我不确定这是浏览器问题还是 Gmaps 问题。

我希望有人可以帮助阐明这一点,或者这可能会帮助处于类似情况的其他人。

最佳答案

API 的 3.35 和 3.36 版getCenter 方法似乎有问题。版本 3.34 工作正常。

我无法获得超过 90 度的纬度值,但只需将 map 向左或向右(沿一个方向)平移几次,就会显示经度值超出 -180/180 度范围.

我打开了一个bug report in the issue tracker .

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" />

关于javascript - 为什么 Google Maps .getCenter() 返回无效坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54690118/

相关文章:

javascript - 是否可以通过 NativeScript 使用 Sqlite 数据库?

php - 创建 geoRss 提要

java - 如何根据当前位置获取最近的地点(用户输入的)?

javascript - 谷歌地图 API 边界 : works in FF not in Safari?

c# - 如何使用 Sql 搜索矩形内的(预定义)位置(纬度/经度)?

javascript - 仅当文本输入为 0 时禁用按钮

javascript - 如何通过jquery或javascript获取复选框输入值?

javascript - 如何在js/ts树中查找节点的搜索路径

php - 使用 php 向谷歌地图添加静态 1km 网格

javascript - 谷歌地图 API 错误 : Error in property <waypoints>: