анализ геокода Google
-
06-07-2019 - |
Вопрос
Я использую Google geocoding api в своем приложении, но мне трудно надежно проанализировать возвращаемую информацию об адресе.Я надеюсь, что у кого-нибудь есть библиотека или способ анализа информации, чтобы мне не приходилось писать это самостоятельно и освещать каждый случай.
Я использую json api и могу достаточно легко извлечь адресную строку и координаты и сохранить их в базе данных, но проблема заключается в извлечении другой адресной информации надежным способом, чтобы я мог ее сохранить.
Я ознакомился со спецификацией структурированного адреса XAL, которую Google использует для геокодированных данных, но моя проблема заключается в том, что она может обслуживать любой тип адреса в любой стране, что затрудняет анализ результата.
Что-то такое простое, как почтовый индекс, может быть вложено довольно глубоко в любую комбинацию родительских тегов.даже внутри одной страны способ отображения дерева может варьироваться, что затрудняет его анализ, чем ожидалось.
По иронии судьбы, моя конечная цель - сохранить его в дереве (например, rails acts_as_tree или аналогичном) в моей базе данных, чтобы пользователи могли легко находить элементы позже.например, нажмите на страну, штат, затем регион, город, затем пригород и т. Д
Я работаю в rails
Решение
Существует гем и плагин, который инкапсулирует все это для вас. Он называется GeoKit .
Можно заставить его использовать Google или несколько других поставщиков услуг геокодирования. Если в ваших моделях есть подходящие поля, он также может выполнять расчеты расстояний (по-настоящему изящная математика для этого делается в SQL). Р>
Я давно использую его в одном из своих производственных приложений, например, для вычисления расстояний между почтовыми индексами. Как я уже упоминал, я уже давно использую его в производстве, поэтому у меня нет никаких сомнений по поводу надежности кода.
Другие советы
Я делал это пару раз.Их (Google) пример кода работает, но является хрупким, а данные геокодирования, которые вы получаете от Google, в лучшем случае неполны, а в худшем - противоречивы.
В любом случае.Все геокодеры отстой, но, по крайней мере, геокодер Google бесплатный и отстой меньше, чем другие..не слишком ли много требовать последовательности?Вздох.Попробуйте следующее;вы передаете ему метку (обратите внимание, что метод getLocations AJAX может возвращать несколько значений), и это нормализует результат.Если вы хотите пофантазировать, используйте поле placemark.address - иногда оно будет содержать больше информации, чем отдельные поля.Обычно он будет содержать только текст, который вы фактически отправили для геокодирования.
function Mark(placemark) {
this.latitude = 0.0;
this.longitude = 0.0;
this.accuracy = 0;
this.country = null;
this.region = null;
this.city = null;
this.postalCode = null;
this.street = null;
this.address = null;
this.placemark = placemark;
if (placemark) {
if (placemark.Point && placemark.Point.coordinates) {
this.latitude = placemark.Point.coordinates[0];
this.longitude = placemark.Point.coordinates[1];
}
var elem = placemark.AddressDetails;
if (elem) {
this.accuracy = elem.Accuracy;
if (elem.Country) {
elem = elem.Country;
this.country = elem.CountryNameCode;
}
if (elem.AdministrativeArea) {
elem = elem.AdministrativeArea;
this.region = elem.AdministrativeAreaName;
}
if (elem.SubAdministrativeArea) {
elem = elem.SubAdministrativeArea;
}
if (elem.Locality) {
elem = elem.Locality;
this.city = elem.LocalityName;
}
if (elem.PostalCode) {
this.postalCode = elem.PostalCode.PostalCodeNumber;
}
if (elem.Thoroughfare) {
this.street = elem.Thoroughfare.ThoroughfareName;
}
}
}
}