我需要使用Google Maps API获取给定坐标的格式化地址。我使用Google Reverse Geo coding来查找位置名称。当Google地图数据库中有可用于该位置的名称时,此功能正常。
大多数情况下,给定的坐标来自远离城市边界的位置(例如在高速公路上)。该函数返回ZERO_RESULTS
,因为地图上没有定义名称。要求是找到要返回的最近的已知位置地址。
从功能上讲,这是一个很好听的,但从技术上讲,如何去做呢?
目前我找到距离这一点很少(千米)的位置,检查位置是否有名字,然后递归直到我得到一个名字。
就个人而言,由于以下原因,他们不喜欢这种方法:
无法猜测找到名称所在位置的方向
我可能朝着一个方向走,但是一个已知的地方只有几米的反方向。
以下是完整的代码,该代码正在运行,但存在上述问题。
<!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/
感谢。
答案 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