2016-07-29 4 views
0

Я получаю расположение от широты и долготы заданного:Google геокодер возвращается другую широту и долготу из значений запроса

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

Так я пропускаю что-нибудь? Почему не те же ценности?

+1

То, что вы пытаетесь сделать? LatLong для адреса или адреса для LatLong? –

+0

@ TuğcaEker - LatLong для адреса (который также содержит lat и long). – Manolo

+1

Хорошо. Вы используете ** Обратное геокодирование ** для преобразования координат в адрес. Вы не можете получить то же самое GeoLocation, потому что Google возвращает вам ближайшую запись. Как проверка i, есть только 20-30 метров между ожиданием и результатом. Не беспокойтесь, это нормально. –

ответ

1

Геокодирование или обратное геокодирование не может дать точный результат. Если вы укажете Geocode Address в LatLong, вы получите самую подходящую и самую близкую запись от Google. Это нормальное поведение. Также официальный пример 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(
 
     \t 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>

0

геокодирования (соответствующие места для широты долготы пар и наоборот) является точным только при поиске известного адреса или известное место. Имеются базы данных, которые предоставляют точную информацию для всех реальных адресов. И есть службы и API, которые специализируются на использовании таких данных. Например, службы проверки адресов выполняют поиск по списку реальных адресов. Они анализируют адрес ввода и могут определить, является ли вход реальным адресом или нет. Для людей, которые пользуются этими услугами (например, люди, которые имеют дело с доставкой), точная точность важна с их адресами.

Однако многие службы геокодирования предпочитают давать пользователю ответ, даже если он не является идеальным, т. Е. Если официальных данных не соответствует данным. Например, службы сопоставления Google дадут вам результат, даже если вход не является реальным адресом. Они используют хорошие алгоритмы, чтобы дать вам «приблизительную оценку» на карте. Есть много хороших вещей о сервисах Google, но одна из недостатков - некоторые ответы не будут точными.

В других случаях большие общественные места или другие именованные местоположения могут совпадать со многими парами широты и долготы, но данные, соответствующие названию, несколько отличаются от данных поиска.

В вашем конкретном случае, возможно, Google обнаружил, что ваш доступ к широте и долготе был очень близок к фактическому ориентиру или месту и предположил, что это то, что вы хотели. Или, место большое (как парк), и информация Google для этого парка указывает другое место как «среднее».

Результаты Google обычно близки, как уже упоминалось. Когда вы используете одну из этих служб и вводите широту и долготу, ищите соответствующее место, а затем конвертируете обратно в широту и долготу, вполне вероятно, что произошли небольшие изменения.


(Полное раскрытие: я работаю на SmartyStreets, Валидацию компании адрес.)