Получить почтовый индекс, основанный на лат и лонг? - PullRequest
8 голосов
/ 04 декабря 2011

Существует ли служба или API, которые я могу пропинговать и передавать в качестве параметров широту / долготу, где он возвращает почтовый индекс, в котором находится пара широта / длинная позиция? Это только для США, поэтому мне не нужно беспокоиться о международных кодах и т. Д.

Мне кажется, что обратное геокодирование Карт Google слишком тяжело для меня. Я бы предпочел что-нибудь более легкое, если это возможно. Это будет сделано в JavaScript.

Ответы [ 5 ]

18 голосов
/ 04 декабря 2011

Это называется Обратное геокодирование (поиск адреса) .Чтобы получить адрес для lat: 40.714224, lng: -73.961452 запрос http://maps.googleapis.com/maps/api/geocode/json с параметрами latlng=40.714224,-73.961452&sensor=true ( пример ) и возвращает объект JSON или используйте http://maps.googleapis.com/maps/api/geocode/xml для возврата XML-ответа ( пример *)1009 *).Это от Google, и это бесплатно.

7 голосов
/ 10 сентября 2012

Для API Google вам необходимо использовать его на карте Google в соответствии с их сайтом:

Примечание. API геокодирования можно использовать только в сочетании с картой Google;результаты геокодирования без отображения их на карте запрещены.

6 голосов
/ 04 декабря 2011

Пожалуйста, посмотрите на http://geonames.org. Есть веб-сервис findNearbyPostalCodes (международный).

Пример : findNearbyPostalCodesJSON? Lat = 47 & lng = 9 & username = demo

Сокращенный вывод :

{
  "postalCodes": [{
    "adminCode3": "1631",
    "distance": "2.2072",
    "postalCode": "8775",
    "countryCode": "CH",
    "lng": 8.998679778165283,
    "placeName": "Luchsingen",
    "lat": 46.980169648620375
  }]
}

Лимит демо-счета составляет 2000 запросов в час.

1 голос
/ 30 августа 2017

Google Maps API может получить почтовый индекс, связанный с геолокацией. Однако, если вы находитесь где-то посреди джунглей, этот API не будет ничего возвращать, так как почтовый код сопоставлен с почтовыми адресами. В этом случае вам необходимо получить почтовый индекс ближайшего города.

Вы можете использовать этот метод для этого

  //Reverse GeoCode position into Address and ZipCOde
  function getZipCodeFromPosition(geocoder, map,latlng,userLocationInfoWindow) {

   geocoder.geocode({'location': latlng}, function(result, status) {
     if (status === 'OK') {
       if (result[0]) {

            console.log("GeoCode Results Found:"+JSON.stringify(result));

            //Display Address
            document.getElementById("address").textContent  = "Address: " +result[0].formatted_address;

           //Update Info Window on Server Map
           userLocationInfoWindow.setPosition(latlng);
           userLocationInfoWindow.setContent('<IMG BORDER="0" ALIGN="Left" SRC="https://media3.giphy.com/media/IkwH4WZWgdfpu/giphy.gif" style ="width:50px; height:50px"><h6 class ="pink-text">You Are Here</h4> <p class = "purple-text" style ="margin-left:30px;">'+result[0].formatted_address+'</p>');
           userLocationInfoWindow.open(map);
           map.setCenter(latlng);

            //Try to Get Postal Code
            var postal = null;
            var city = null;
            var state = null;
            var country = null;

          for(var i=0;i<result.length;++i){
              if(result[i].types[0]=="postal_code"){
                  postal = result[i].long_name;
              }
              if(result[i].types[0]=="administrative_area_level_1"){
                  state = result[i].long_name;
              }
              if(result[i].types[0]=="locality"){
                  city = result[i].long_name;
              }
              if(result[i].types[0]=="country"){
                  country = result[i].long_name;
              }
          }
          if (!postal) {
            geocoder.geocode({ 'location': result[0].geometry.location }, function (results, status) {
              if (status == google.maps.GeocoderStatus.OK) {

                //Postal Code Not found, Try to get Postal code for City
                var result=results[0].address_components;

                for(var i=0;i<result.length;++i){
                 if(result[i].types[0]=="postal_code"){
                    postal = result[i].long_name;
                 }
                }
                  if (!postal) {

                    //Postal Code Not found
                     document.getElementById("postal").textContent  = "No Postal Code Found  for this location";
                  }else
                  {
                     //Postal Code found
                      document.getElementById("postal").textContent  = "Zip Code: "+postal;
                  }
              }
          });
          } else
              {
              //Postal Code found
              document.getElementById("postal").textContent  = "Zip Code: "+postal;
              }
          console.log("STATE: " + state);
          console.log("CITY: " + city);
          console.log("COUNTRY: " + country);

             } else {
           window.alert('No results found');
         }
       } else {
         window.alert('Geocoder failed due to: ' + status);
       }
     });
 }
</script>

Рабочий пример

https://codepen.io/hiteshsahu/pen/gxQyQE?editors=1010

enter image description here

0 голосов
/ 09 марта 2017

Ответ от kubetz великолепен, но поскольку мы должны использовать https, чтобы заставить работать геолокацию ( API геолокации удален из незащищенных источников в Chrome 50 ), вызов http://api.geonames.org терпит неудачу, потому что это не по https. Локальный php-скрипт, который вызывается через https и доставляется с geonames.org, решает проблему.

//javascript function
function getZipFromLatLong() {
    var url = "getzip.php";
    var formData = new FormData();
    formData.append("lat", current_lat);
    formData.append("long", current_long);

    var r = new XMLHttpRequest();
    r.open("POST", url, true);
    r.onreadystatechange = function () {
        if (r.readyState != 4 || r.status != 200) {
            return;
        } else {
            data = r.responseText;
            var jdata = JSON.parse(data);
            document.getElementById("zip").value = jdata.postalCodes[0].postalCode;
        }
    }
    r.send(formData);
}

//getzip.php script
<?php

$lat = $_POST["lat"];
$long = $_POST["long"];

$url = "http://api.geonames.org/findNearbyPostalCodesJSON?username=demo&lat=" . $lat .  "&lng=" . $long;

$content = file_get_contents($url);

//the output is json, so just return it as-is
die($content);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...