【问题标题】:Google geocoder is returning different latitude and longitude from request values谷歌地理编码器从请求值返回不同的纬度和经度
【发布时间】:2016-07-29 11:01:54
【问题描述】:

我从给定的纬度和经度获取位置:

getLocationFromCoords(lat, lng) {
    var geocoder = new google.maps.Geocoder();
    var latLng = new google.maps.LatLng(parseFloat(lat), parseFloat(lng));
    geocoder.geocode({
        'latLng': latLng
    }, function (results, status) {
        if (status === google.maps.GeocoderStatus.OK) {
            if (typeof results[0].geometry.location != 'undefined') {

                console.log(lat, lng);
                console.log(results[0].geometry.location.lat(), results[0].geometry.location.lng());

                // set the location
            } else {
                //...
            }
        });
    });
}

问题是来自results[0].geometry.location 的纬度和经度与请求的值不同。上面的代码显示在控制台中:

38.9067339 1.4205983

38.9069681 1.4205133000000387

所以我错过了什么吗?为什么不同的值?

【问题讨论】:

  • 你想做什么? LatLong 到地址或地址到 LatLong?
  • @TuğcaEker - 经纬度地址(也包含经纬度)。
  • 好的。您正在应用 反向地理编码 将坐标转换为地址。您无法获得完全相同的地理位置,因为 Google 会向您返回最近的记录。作为我的检查,期望和结果之间只有 20-30 米。别担心,这很正常。
  • @TuğcaEker - 哦,你是对的。两个地址我都没查,我以为第一个是正确的,大概有100公里远。
  • 我用haversine方法计算,这些点之间的距离约为0.02公里。我错了吗? Image

标签: javascript reverse-geocoding


【解决方案1】:

地理编码或反向地理编码不能给出准确的结果。如果您将地址地理编码到 LatLong,您将从 Google 获得最合适和最近的记录。那是正常的行为。谷歌的官方例子也有同样的行为。 (不是错误或问题)。

检查这个fiddle;

function initMap() {
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 8,
    center: {lat: 40.731, lng: -73.997}
  });
  var geocoder = new google.maps.Geocoder;
  var infowindow = new google.maps.InfoWindow;

  document.getElementById('submit').addEventListener('click', function() {
    geocodeLatLng(geocoder, map, infowindow);
  });
}

function geocodeLatLng(geocoder, map, infowindow) {
  var input = document.getElementById('latlng').value;
  var latlngStr = input.split(',', 2);
  var latlng = {lat: parseFloat(latlngStr[0]), lng: parseFloat(latlngStr[1])};
  geocoder.geocode({'location': latlng}, function(results, status) {
    if (status === 'OK') {
      if (results[1]) {
        map.setZoom(11);
        var marker = new google.maps.Marker({
          position: latlng,
          map: map
        });
        infowindow.setContent(
        	results[1].formatted_address + "<br />" + results[1].geometry.location
        );
        infowindow.open(map, marker);
      } else {
        window.alert('No results found');
      }
    } else {
      window.alert('Geocoder failed due to: ' + status);
    }
  });
}
html, body {
  height: 100%;
  margin: 0;
  padding: 0;
}
#map {
  height: 100%;
}
#floating-panel {
  position: absolute;
  top: 10px;
  left: 25%;
  z-index: 5;
  background-color: #fff;
  padding: 5px;
  border: 1px solid #999;
  text-align: center;
  font-family: 'Roboto','sans-serif';
  line-height: 30px;
  padding-left: 10px;
}
#floating-panel {
  position: absolute;
  top: 5px;
  left: 50%;
  margin-left: -180px;
  width: 350px;
  z-index: 5;
  background-color: #fff;
  padding: 5px;
  border: 1px solid #999;
}
#latlng {
  width: 225px;
}
<div id="floating-panel">
  <input id="latlng" type="text" value="40.714224,-73.961452">
  <input id="submit" type="button" value="Reverse Geocode">
</div>
<div id="map"></div>
<!-- Replace the value of the key parameter with your own API key. -->
<script async defer
src="https://maps.googleapis.com/maps/api/js?callback=initMap">
</script>

【讨论】:

    【解决方案2】:

    地理编码(将位置与经纬度对匹配,反之亦然)仅在您搜索已知地址或已知地点时才准确。有一些数据库可以提供所有真实地址的准确信息。而且,有专门使用此类数据的服务和 API。例如,地址验证服务搜索真实地址列表。他们解析地址输入并可以确定输入是否是真实地址。对于使用这些服务的人(例如处理运输的人),准确的地址很重要。

    但是,许多地理编码服务更愿意给用户一个答案,即使没有一个完美的答案 - 即如果没有与输入匹配的官方数据。例如,即使输入的不是真实地址,谷歌的地图服务也会给你一个结果。他们使用好的算法在地图上给你一个“估计的猜测”。 Google 的服务有很多优点,但缺点之一是某些响应并不准确。

    在其他情况下,大型公共场所或其他命名位置可能会匹配许多经纬度对,但与名称匹配的数据与搜索输入略有不同。

    在您的具体情况下,也许 Google 发现您输入的纬度和经度非常接近实际的地标或地点,并假设这就是您想要的。或者,这个地方很大(就像一个公园),而谷歌关于那个公园的信息将一个不同的地方定位为“中间”。

    如前所述,Google 的结果通常很接近。当你使用其中一种服务,输入经纬度,搜索对应的地方,再转换回经纬度,很可能已经发生了细微的变化。


    (完全披露:我为地址验证公司SmartyStreets工作。)

    【讨论】:

      猜你喜欢
      • 2011-09-05
      • 2016-07-26
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 2012-01-17
      • 1970-01-01
      相关资源
      最近更新 更多