查找最近的已知位置:Google反向地理编码

时间:2015-08-07 10:24:51

标签: javascript google-maps google-maps-api-3 reverse-geocoding

我需要使用Google Maps API获取给定坐标的格式化地址。我使用Google Reverse Geo coding来查找位置名称。当Google地图数据库中有可用于该位置的名称时,此功能正常。

大多数情况下,给定的坐标来自远离城市边界的位置(例如在高速公路上)。该函数返回ZERO_RESULTS,因为地图上没有定义名称。要求是找到要返回的最近的已知位置地址。

从功能上讲,这是一个很好听的,但从技术上讲,如何去做呢?

目前我找到距离这一点很少(千米)的位置,检查位置是否有名字,然后递归直到我得到一个名字。

就个人而言,由于以下原因,他们不喜欢这种方法:

  1. 无法猜测找到名称所在位置的方向

  2. 我可能朝着一个方向走,但是一个已知的地方只有几米的反方向。

  3. 在增量期间我可能会走得太远,就像15岁的地方一样 公里外有一个名字。我搜索10公里外的名字并检查 再增加20公里,因为增量标识是10公里。
  4. 以下是完整的代码,该代码正在运行,但存在上述问题。

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Map Test</title>
         <script type="text/javascript" src="//code.jquery.com/jquery-1.11.1.min.js"></script>
        <script src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>
    
    </head>
    <body>
        <span id="spanId">Loading...</span>
        <script>
            Number.prototype.toRad = function () {
                return this * Math.PI / 180;
            }
    
            Number.prototype.toDeg = function () {
                return this * 180 / Math.PI;
            }
    
            google.maps.LatLng.prototype.destinationPoint = function (brng, dist) {
                dist = dist / 6371;
                brng = brng.toRad();
    
                var lat1 = this.lat().toRad(), lon1 = this.lng().toRad();
    
                var lat2 = Math.asin(Math.sin(lat1) * Math.cos(dist) +
                                     Math.cos(lat1) * Math.sin(dist) * Math.cos(brng));
    
                var lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(dist) *
                                             Math.cos(lat1),
                                             Math.cos(dist) - Math.sin(lat1) *
                                             Math.sin(lat2));
    
                if (isNaN(lat2) || isNaN(lon2)) return null;
    
                return new google.maps.LatLng(lat2.toDeg(), lon2.toDeg());
            }
    
            var pointA = new google.maps.LatLng(32.6811,74.8732);
    
            getLocation(pointA);
    var distance = 0;
            function getLocation(info) {
    
                var myCenter = info; //new google.maps.LatLng(info.split(",", 3)[1], info.split(",", 3)[2]);
                var gc = new google.maps.Geocoder();
    
                gc.geocode({ 'location': myCenter }, function (results, status) {
                    if (status == google.maps.GeocoderStatus.OK) {
                        if (results[1]) {
                            document.getElementById('spanId').innerHTML = results[1].formatted_address + ', ' + distance + ' kms away from original point' ;
                        } else {
                            window.alert('No results found');
                        }
                    } else {
                        if (status == 'ZERO_RESULTS' )
                        {
                            var radiusInKm = 10;
                            distance += radiusInKm;
                            document.getElementById('spanId').innerHTML = 'Getting results from  ' + distance + ' kms away';
                            var pointB = pointA.destinationPoint(90, distance);
                            setTimeout(function(){
                                getLocation(pointB);
                            }, 2000);
                        }
    
                   }
                });
            }
    
    
        </script>
    </body>
    </html>
    
    如果有人有一个好的解决方案,

    真的很感激。

    JSFiddle Link:https://jsfiddle.net/hbybs68q/1/

    感谢。

2 个答案:

答案 0 :(得分:2)

您需要修改getLocation函数中的if条件。 检查结果[0]不是结果[1]。

if (status == google.maps.GeocoderStatus.OK) {
      if (results[0]) {
            document.getElementById('spanId').innerHTML = results[0].formatted_address + ', ' + distance + ' kms away from original point' ;
      } else {
              window.alert('No results found');
      }
} else {
       window.alert('Geocoder failed due to - ' + status)
}

答案 1 :(得分:0)

Google地理编码API中的反向地理编码的ZERO_RESULTS通常意味着latlng位于远离岸边的海水(海洋,海洋,真正的大湖等)或具有territorial dispute的区域。这是一个已知问题:https://code.google.com/p/gmaps-api-issues/issues/detail?id=8783