使用Nominatim进行简单的反向地理编码

时间:2012-06-06 23:32:57

标签: openlayers openstreetmap reverse-geocoding nominatim

我正在使用OpenLayers + OpenStreetMaps开发在线地图应用程序。

我需要帮助在javascript(或php)中实现一个简单的反向地理编码功能,它接收纬度和经度并返回一个地址。

如果可能,我想与Nominatim合作。我不想使用Google,Bing或CloudMade或其他专有解决方案。

这个link返回一个合理的响应,我使用simple_html_dom.php来分解结果,但这是一个丑陋的解决方案。

<?php

include('simple_html_dom.php');

$url = "http://nominatim.openstreetmap.org/reverse?format=xml&lat=-23.56320001&lon=-46.66140002&zoom=27&addressdetails=1";
$html = file_get_html($url);
foreach ($html->find('road') as $element ) {
    echo $element;
}

?>  

有关更优雅解决方案的任何建议吗?

注意:截至2015年10月,请求必须包含valid email,以便“提供足够的申请标识”。

如果没有电子邮件,返回代码将不是xml或json格式,而是error 509 "Bandwidth Exceeded",请尝试使用html_dom库进行抓取。

$url = "http://nominatim.openstreetmap.org/reverse?email=myemail@myserver.com&format=xml&lat=-23.56320001&lon=-46.66140002&zoom=27&addressdetails=1";

2 个答案:

答案 0 :(得分:6)

您可以以JSON格式请求nominatim,并传递回调名称,以便响应为:callback(json)

查看文档:{​​{3}}

这是一个最小的使用示例:http://wiki.openstreetmap.org/wiki/Nominatim

答案 1 :(得分:1)

我已经运行了tonio's solution 4年了。虽然它很好地实现了,但我推荐它(即使已经批准为正确答案),但很明显答案是不完整的。

根据您的查询的实施方式,您可能会遇到可能导致拒绝服务的服务器问题。

请注意,如果您使用的是他的答案中提出的社区Nominatim服务器,最佳做法是:

  1. 使用您确定的误差范围和/或
  2. 缓存重复发生的地理位置
  3. 运行your own instance of Nominatim(公开发布,但是 大下载)