Мне необходимо получить отформатированный адрес заданных координат с помощью API Карт Google. Я использую кодирование Google Reverse Geo для поиска названия местоположения. Это прекрасно работает, когда в базе данных карт Google есть доступное имя для местоположения.
В большинстве случаев данные координаты находятся далеко от границ города (например, на шоссе). Функция возвращает ZERO_RESULTS
, так как на карте не определено имя. Требование состоит в том, чтобы найти ближайший известный адрес местоположения, который будет возвращен.
Функционально это приятно слышать, но технически, как это сделать?
В настоящее время я нахожу местоположение, которое находится в нескольких (кило) метрах от этой точки, проверяя, есть ли у местоположения имя, и рекурсивно иду, пока не получу имя.
Лично мне такой подход не понравился по следующим причинам:
Не могу угадать, в каком направлении идти, чтобы найти место с названием
Я мог бы пойти в каком-то направлении, но известное место находится всего в нескольких метрах в обратном направлении.
- Я мог бы зайти слишком далеко во время инкремента, так как в месте, которое находится в 15 км от него, есть имя. Я ищу имя на расстоянии 10 км и снова проверяю на расстоянии 20 км, так как идентификация приращения составляет 10 км.
Ниже приведен полный код, который работает, но с указанными выше проблемами.
<!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: https://jsfiddle.net/hbybs68q/1/
благодаря.