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

14
我正在使用Codeigniter PHP + jQuery制作一份招聘信息板块,雇主在其中输入他们的位置,我们使用Google Maps API绘制它。虽然这有很棒的可用性结果,但问题是当我们尝试向求职者展示这些位置时,它们会混乱且难以视觉辨别(它们读起来像这样:“02905,距离2英里”,“171 John St.,距离4英里”,“Providence,RI,距离10英里”)。
我想能够从经度/纬度反向地理定位到一个特定级别(最好是城市名),以便在搜索结果中,可以像这样列出位置:“Providence,RI,距离10英里”,“Providence,RI,距离5英里”,“Cranston,RI,距离16英里”。
是否有一种方法可以反向地理编码为城市?我看到许多示例可以将其反向地理编码为最近的可寻址位置,但没有控制级别的方法。
希望这清楚明白!如有需要澄清的任何问题,请随时发表评论。
6个回答

37

免费资源(例如创意共用)

Geonames

如果您正在寻找自由(作为自由权利)的资源,可以使用Geonames API findNearbyPlaceName。

例如,以下命令返回最近的地名:

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

更多信息可在此处获取:

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

Freebase

它需要一个有界框而不是单个点。调用示例:

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

Map 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


12
Google地理编码器支持逆地理编码,返回地址组件。如果您只想要城市名称,您只需要提取被标记为localitypolitical的地址组件即可。如果您还想要州的信息,它们被标记为administrative_area_level_1

11
请注意Google Maps API服务条款: http://code.google.com/apis/maps/documentation/geocoding/#Limits注意:地理编码API只能与谷歌地图一起使用;禁止在未显示在地图上的情况下使用地理编码结果。有关允许使用的完整细节,请参阅Maps API服务条款许可限制。 - sabbour

2

你不能只是对完整地址进行处理,然后删除街道和号码吗?

我认为使用完整地址更有价值,这样能获得更精确的距离(即使只显示城市,州)。

编辑:如果你确实这样做了,至少它应该以标准形式返回,这样你就可以轻松地从中提取所需数据。


很想这样做,但在我们的可用性测试中,许多小型雇主不喜欢发布具体地址。 - Walker
让雇主输入一个位置字符串“普罗维登斯的郊区”,而不是经纬度对。 - tpdi
我们实际上会自己将其转换为经纬度以便在地图上存储和绘制(用于结果页面/基于半径的搜索)。雇主在职位发布页面上输入一个自由格式的字符串。 - Walker

0

我正在寻找一个将经纬度转换为城市的API。似乎这也是本主题的最初问题。

我在另一个stackoverflow主题上看到了数据“http://download.geonames.org/export/dump/”,该主题是“给定经纬度坐标,如何找出城市/国家?”,并实现了自己的Web服务。

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

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

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


0

反向地理编码服务(如Google、Yahoo和GeoNames)可以很好地完成这个任务,但需要注意以下几点:

  • 虽然我不能确定商业服务是如何工作的,但上次我检查时,GeoNames使用最近的兴趣点策略来确定城市。如果您的查询点在两个城市之间的边界附近,并且GeoNames数据库中最近的条目位于该边界的另一侧,这可能会成为一个问题。根据我的经验,这种情况实际上经常发生,因此这不仅仅是一些技术细节。
  • 此外,如果您关心用户体验,任何Web API解决方案都会增加延迟并降低可靠性。

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

http://askgeo.com

查找经纬度对应城市的页面是:

http://askgeo.com/database/UsPlace2010


-2

Html5地理定位需要用户许可。如果您不想使用此行为,可以选择像https://geolocation-db.com这样的外部提供商。他们提供基于IP地址的免费地理定位服务。

尝试这个例子:

<!DOCTYPE html>
<html>
<head>
  <title>Geolocation DB - jQuery example</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>
<body>
  <div>Country: <span id="country"></span>
  <div>State: <span id="state"></span>
  <div>City: <span id="city"></span>
  <div>Latitude: <span id="latitude"></span>
  <div>Longitude: <span id="longitude"></span>
  <div>IP: <span id="IPv4"></span>
  <script>
    $.ajax({
      url: "https://geolocation-db.com/jsonp",
      jsonpCallback: "callback",
      dataType: "jsonp",
      success: 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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接