5

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

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

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

这个链接返回一个合理的响应,我使用 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 月起,请求必须包含有效的电子邮件,以便“提供您申请的充分身份证明”。

如果没有电子邮件,返回代码将不是 xml 或 json 格式,而是错误 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";
4

2 回答 2

7

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

查看文档:http ://wiki.openstreetmap.org/wiki/Nominatim

这是一个最小的使用示例:http: //jsfiddle.net/GWL7A/14/

于 2012-06-07T10:37:13.133 回答
1

我已经运行tonio 的解决方案4 年了。虽然它实现得很好并且我推荐它(即使已被批准为正确答案),但很明显答案是不完整的。

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

请注意,如果您按照他的回答中建议使用社区 Nominatim 服务器,则最佳做法是:

  1. 使用您确定的误差范围和/或缓存重复的地理点
  2. 运行您自己的 Nominatim 实例(公开可用,但可大量下载)
于 2016-07-06T15:17:58.913 回答