将纬度/经度转换为城市名称? (反向地理定位)

时间:2010-08-02 22:03:20

标签: php jquery google-maps geolocation geocoding

我正在使用Codeigniter PHP + jQuery的工作板,雇主进入他们的位置,我们使用Google Maps API绘制它。虽然这具有令人敬畏的可用性结果,但问题是当我们试图向求职者展示这些位置时,他们感到困惑并难以在视觉上辨别(他们读起来像这样:“02905,2英里远”,“171 John St.,4几英里远“,”普罗维登斯,罗德岛,10英里远“。

我希望能够将经度/纬度的地理定位反转到设定级别(理想情况下,城市名称),以便在搜索结果中我可以将列表设置为:“Providence,RI,10英里远“,”普罗维登斯,罗德岛,5英里远“,”克兰斯顿,罗德岛,16英里远“。

有没有办法将地理编码反转到城市?我看到很多关于将地理编码反转到最近的可寻址位置的示例,但无法控制该级别。

希望很清楚!如果您需要澄清任何问题,请随时发表评论。

6 个答案:

答案 0 :(得分:37)

免费来源(例如知识共享)

<强>国地名

如果您正在寻找免费(自由)来源,可以使用Geonames API findNearbyPlaceName。

例如,以下内容返回最接近的地名:

http://api.geonames.org/findNearbyPlaceName?lat=47.3&lng=9&username=demo

此处提供更多信息

http://www.geonames.org/export/web-services.html#findNearbyPlaceName

<强>游离碱

而不是单点,它需要有界框。致电样本:

http://api.freebase.com/api/service/geosearch?location=[30.2,50.4,30.6,50.8]&location_type=/location/citytown&inside=true&indent=1

<强> Geocoder.ca

北美地址的反向地理编码。

信息:http://geocoder.ca/

示例电话:http://geocoder.ca/?latt=40.70771000786733&longt=-74.0109443664550&reverse=1&allna=1&geoit=xml&corner=1&jsonp=1&callback=test

映射Quest API

使用Open Street Map nominatim服务:

http://open.mapquestapi.com/nominatim/v1/search?q=50.4,30.4&format=json

非免费来源

Yahoo PlaceFinder

文档http://developer.yahoo.com/geo/placefinder/

示例电话:

http://where.yahooapis.com/geocode?q=38.898717,+-77.035974&gflags=R&appid=[yourappidhere]

Google Maps API

文档:

http://code.google.com/apis/maps/documentation/geocoding/#ReverseGeocoding

答案 1 :(得分:12)

支持reverse geocoding的Google地理编码器会返回address_components。如果您只想要城市名称,则只需提取标有localitypolitical的地址的组件即可。如果您还想要状态,则会使用administrative_area_level_1

标记

答案 2 :(得分:2)

难道你不能只做完整的地址,然后放弃街道和号码吗?

我会说使用完整地址更有价值,以便获得更准确的距离(即使您只显示城市,州)。

编辑:如果你这样做,至少应该以标准形式返回,然后你可以轻松地将你想要的数据复制出来。

答案 3 :(得分:0)

反向地理编码服务(例如Google,Yahoo和GeoNames)可以很好地用于此目的,但需要注意以下几点:

  • 虽然我无法确定商业服务是如何运作的,但上次我检查过GeoNames使用最近的兴趣点策略来确定城市。如果您的查询点稍微靠近两个城市之间的边界,并且GeoNames数据库中最近的条目位于该边界的另一侧,则可能会出现问题。这实际上在我的经验中发生了很多,所以这不仅仅是一些技术性。
  • 此外,如果您担心用户体验,任何Web API解决方案都会增加延迟并降低可靠性。

我运行一个提供大量商业地理Web API的网站,并销售我们为支持这些API而构建的Java库。其中一个(仅覆盖美国)使用美国城镇的正确多边形地图来返回包含查询点的结果。它准确而快速,因此如果这是您系统中的关键任务组件,我建议您查看我们的网站:

http://askgeo.com

特定于从lat / lon查找城市的页面是:

http://askgeo.com/database/UsPlace2010

答案 4 :(得分:0)

我正在搜索将lat / long转换为城市的API。看起来这也是这个帖子上的原始问题。

我看到数据“http://download.geonames.org/export/dump/”在另一个stackoverflow线程Given the lat/long coordinates, how can we find out the city/country?上共享,并实现了我自己的Web服务。

您可以在http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9看到它正在运行。只需更改您所在位置的纬度和经度即可。

它部署在OpenShift(RedHat平台)上。长时间闲置后的第一次通话可能需要一段时间,但通常表现令人满意。随意使用此服务...

此外,您可以在https://github.com/turgos/Location找到项目来源。

答案 5 :(得分:0)

Html5地理位置需要用户权限。如果您不想要此行为,可以使用https://geoip-db.com之类的外部提供商。他们提供基于ip-addresses的免费地理定位服务。

试试这个例子:

<!DOCTYPE html> 
<html> 
<head> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"/> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
<title>Geo City Locator</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
</head> 
<body > 
    <div>Country: <span id="country"></span></div>
    <div>State: <span id="state"></spa></div>
    <div>City: <span id="city"></span></div>
    <div>Latitude: <span id="latitude"></span></div>
    <div>Longitude: <span id="longitude"></span></div>
    <div>IP: <span id="ip"></span></div>    
    <script>
      $.getJSON('https://geoip-db.com/json/geoip.php?jsonp=?') 
         .done (function(location) {
            $('#country').html(location.country_name);
            $('#state').html(location.state);
            $('#city').html(location.city);
            $('#latitude').html(location.latitude);
            $('#longitude').html(location.longitude);
            $('#ip').html(location.IPv4);               
         });
    </script>
</body> 
</html>