获取基于纬度和经度的邮政编码?

Posted

技术标签:

【中文标题】获取基于纬度和经度的邮政编码?【英文标题】:Get zip code based on lat & long? 【发布时间】:2011-12-04 00:23:31 【问题描述】:

是否有我可以 ping 通的服务或 API,并将 lat/long 作为参数传递,它会返回 lat/long 对所在的邮政编码?这是仅限美国,所以我不必担心国际代码等。

我觉得谷歌地图的反向地理编码对我来说太重了。如果可能的话,我更喜欢更轻的东西。这将在 javascript 中完成。

【问题讨论】:

Zip Code Database 的可能重复项 【参考方案1】:

它被称为Reverse Geocoding (Address Lookup)。要获取 lat: 40.714224, lng: -73.961452 的地址,使用参数 latlng=40.714224,-73.961452&sensor=true (example) 查询 http://maps.googleapis.com/maps/api/geocode/json 并返回 JSON 对象或使用 http://maps.googleapis.com/maps/api/geocode/xml 返回 XML 响应 (example)。它来自 Google,而且是免费的。

【讨论】:

应该注意的是,谷歌明确禁止使用地理编码而不将其放在地图上,根据他们的TOS 以上链接返回 404..所以这里是 Geocoding API 的最新链接 - developers.google.com/maps/documentation/geocoding/… 目前,它不是免费的。在这里查看developers.google.com/maps/documentation/geocoding/…【参考方案2】:

对于 Google API,您需要在 Google 地图中使用它,根据他们的网站:

注意:Geocoding API 只能与 Google 结合使用 地图;地理编码结果而不在地图上显示它们是 禁止。

【讨论】:

不知道为什么它一开始就被否决,但它提出了关于 Google API 上 TOS 的一个很好的观点 这不是真的。 “您可以在 Google 地图上显示 Geocoding API 结果,也可以不使用地图。如果您想在地图上显示 Geocoding API 结果,那么这些结果必须显示在 Google Map 上。禁止在地图上使用 Geocoding API 数据不是谷歌地图的地图。” developers.google.com/maps/documentation/geocoding/policies【参考方案3】:

请查看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 次查询。

【讨论】:

对我来说很漂亮。还没有实现它,但我将你的 jsfiddle 代码粘贴到我的视图中,它告诉我加载时我的邮政编码。 嗨,kubetz,我怎么去最近的城市,哪个州?那可能吗?您的 jsfiddle 代码在我的项目中就像一个魅力。【参考方案4】:

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

【讨论】:

【参考方案5】:

kubetz 的回答很好,但是由于我们必须使用 https 来获取地理位置工作 (Geolocation API Removed from Unsecured Origins in Chrome 50),所以对 http://api.geonames.org 的调用会失败,因为它没有通过 https。从 geonames.org 获取的通过 https 调用的本地 php 脚本解决了这个问题。

//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);
?>

【讨论】:

以上是关于获取基于纬度和经度的邮政编码?的主要内容,如果未能解决你的问题,请参考以下文章

从纬度,经度获取邮政编码

如何在 python 上从经度和纬度获取邮政编码?

在不使用地图 android 的情况下从邮政编码中获取纬度和经度

从邮政编码表(MySql)获取纬度和经度并加入另一个表

地理位置 API/服务

如何在 iOs 中使用 CLGeoCoder 使用邮政编码/邮政编码获取纬度经度?