Измените долготу широты, пройдя почтовые индексы на maps.google.com, используя Javascript
У меня есть почтовый индекс в моей большой базе данных, который содержит такие значения, как SL5 9JH, LU1 3TQ и т.д.
Теперь, когда я вставляю над почтовым индексом на maps.google.com, он указывает на идеальное местоположение.
Мое требование - это то, что я хочу передать почтовые коды на maps.google.com, и он должен вернуть соответствующую широту и долготу этого остроконечного местоположения, которые я хочу сохранить в своей базе данных.
Итак, скорее всего, для этого должен быть какой-то javascript... Если у кого-то есть другая идея относительно этого, пожалуйста, предоставьте это.
Спасибо заранее...
Ответы
Ответ 1
Технический термин для описываемого процесса называется обратное геокодирование. Google предлагает Google Geocoding Web Service Новая рабочая геокодирующая ссылка Google, где вы можете делать обратное геокодирование на стороне сервера, а не на JavaScript на стороне клиента.
Например, если вы попробуете следующие URL-адреса в своем браузере, вы вернете широту и долготу почтового индекса, переданного в параметре q
, в формате CSV:
http://maps.google.com/maps/geo?q=SL59JH,+UK&output=csv&sensor=false
http://maps.google.com/maps/geo?q=LU13TQ,+UK&output=csv&sensor=false
Таким образом вы сможете отменить геокодирование своих почтовых индексов в php, например:
$url = 'http://maps.google.com/maps/geo?q=SL59JH,+UK&output=csv&sensor=false';
$data = @file_get_contents($url);
$result = explode(",", $data);
echo $result[0]; // status code
echo $result[1]; // accuracy
echo $result[2]; // latitude
echo $result[3]; // longitude
Обратите внимание, что как Пекка предложил в другом ответе, Условия использования Google Maps API кажется запретить сохранение результатов, если только хранилище не действует как кеш для данных, которые будут использоваться в Картах Google. Вы можете связаться с Google и узнать о Google Maps API Premier, чтобы иметь более гибкие условия использования для ваших требований к геокодированию.
Ответ 2
Быстрая заметка для тех, кто находит этот ответ SO. Ответ Дэниела Вассалло использует Google Geocoding API V2, который теперь устарел. Новый API v3 использует формат запроса следующим образом:
http://maps.googleapis.com/maps/api/geocode/output?parameters
Примером поиска почтового индекса, возвращающего данные в формате JSON, является:
http://maps.googleapis.com/maps/api/geocode/json?address=SL59JH,+UK&sensor=false
Это возвращает массив JSON, который включает в себя lat и long в результатах → geometry- > location- > lat и results- > geometry- > location- > lng
Пример ответа:
{
"results" : [
{
"address_components" : [
{
"long_name" : "SL5 9JH",
"short_name" : "SL5 9JH",
"types" : [ "postal_code" ]
},
{
"long_name" : "Windsor and Maidenhead",
"short_name" : "Windsor and Maidenhead",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "United Kingdom",
"short_name" : "GB",
"types" : [ "country", "political" ]
},
{
"long_name" : "Ascot",
"short_name" : "Ascot",
"types" : [ "postal_town" ]
}
],
"formatted_address" : "Ascot, Windsor and Maidenhead SL5 9JH, UK",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 51.39655490000001,
"lng" : -0.66024660
},
"southwest" : {
"lat" : 51.39457330,
"lng" : -0.6624574999999999
}
},
"location" : {
"lat" : 51.39539040,
"lng" : -0.66096740
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 51.39691308029150,
"lng" : -0.6600030697084980
},
"southwest" : {
"lat" : 51.39421511970851,
"lng" : -0.6627010302915021
}
}
},
"types" : [ "postal_code" ]
}
],
"status" : "OK"
}
Спецификация API доступна здесь: https://developers.google.com/maps/documentation/geocoding/
Ответ 3
В обзоре Ordnance Survey были опубликованы местоположения почтового индекса на лицензии Creative Commons (CC-BY v3, IIRC). Было бы намного меньше хлопот (и намного яснее юридически) использовать это вместо этого.
Там даже версия с координатами WGS84 (a.k.a. GPS) зеркалируется mySociety
Ответ 4
Google Geocoding API делает это, хотя, если я правильно помню, их условия предоставления услуг запрещают локальное хранение результатов геокодирования.
Ответ 5
Я знаю, что это старый вопрос, но просто вдавливается сюда с тем, как мне удалось добиться того же (в PHP, но должно быть довольно просто):
-
У меня была база данных из тысяч по-разному отформатированных почтовых индексов. Я очищал каждый из них, равномерно, с этой функцией и обновлениями пакетов:
function clean_postcode($postcode)
{
$out = preg_replace("/[^a-zA-Z0-9]/", '',strtoupper($postcode));
if(strlen($out)>3)
{
$out = substr($out, 0, (strlen($out) -3)).' '.substr($out, -3);
}
return $out;
}
-
Теперь, когда все почтовые индексы отформатированы равномерно, я загрузил и импортировал набор данных Code-Point Survey Survey (бесплатно) - https://www.ordnancesurvey.co.uk/opendatadownload/products.html
-
Я импортировал все свои CSV в мою базу данных в отдельной таблице codepoint
. Из каждого CSV я импортировал почтовый индекс, а значения Eastings и Northings.
-
Я снова запускал функцию clean_postcode()
в пакетном режиме во всех данных Surddance Survey в моей БД. Около 50% почтовых индексов имеют пробелы, а 50% - нет - после этого они были равномерно установлены.
-
Я запустил следующий PHP script для каждого почтового индекса в таблице codepoint
и сохранил значения широты и долготы, возвращенные в эту таблицу: http://bramp.net/blog/os-easting-northing-to-lat-long
-
Все сделано! Теперь вы можете совместить и вытащить значение Lat/Lon на основе хорошо отформатированных почтовых индексов.
Дополнительная литература: http://www.deepbluesky.com/blog/-/converting-os-coodinates-into-longitude-latitude_7/
Ответ 6
Отъезд ALgolia помещает здесь. Супер быстрый, с открытым исходным кодом и MIT