Измените долготу широты, пройдя почтовые индексы на 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/

Ответ 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