Я должен получить отформатированный адрес данных координат с помощью API Карт Google. Я использую Google Reverse Geo coding для поиска имени местоположения. Это отлично работает, когда есть имя, доступное для местоположения в базе данных карт Google.Найти ближайший из известных мест: Google Reverse Geocoding
В большинстве случаев данные координаты находятся вдали от городских границ (например, на шоссе). Функция возвращает 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/
спасибо.
статус сам показывает 'ZERO_RESULTS'. раздел результатов даже не выполняется. есть использование, изменяющее результаты [0] или результаты [1] –
Вы пытаетесь щелкнуть где-нибудь в океанах? Потому что для океанических результатов [0] будет нулевым. ZERO_RESULTS – shreeramk
Я пытаюсь щелкнуть по 32.6811,74.8732. См. Местоположение на [maps] (https://www.google.co.in/maps/@32.6811,74.8732,15z?hl=ru). Это где-то в штате Джамму и Кашмир в Индии. –