使用Open Street Maps获取特定邮政编码的街道

3
我想编写一段代码,输入国家代码和邮政编码,输出给定邮政编码的街道,使用一些使用GSM的API。我的策略如下:
1. 需要获取该区域的关系ID。例如,1991416是维也纳-奥地利第三区的关系ID。它由nominatim api提供:http://nominatim.openstreetmap.org/details.php?place_id=158947085
2. 将ID放入此api url中:http://polygons.openstreetmap.fr/get_wkt.py?id=1991416&params=0
3. 下载完成多边形后,可以将收集到的多边形放入overpass api中的查询中,以获得搜索区域的街道。
这个解决方案有两个问题: 1. 它需要时间,因为每次请求需要询问三个不同的API,并且对资源不好。 2. 我不知道如何自动从第一步中获取关系ID。当我输入Nominatim查询(例如http:// nominatim.openstreetmap.org/search?format=json&country=austria&postalcode=1030)时,我只能得到该区域的各种点,但没有搜索区域的关系ID,以便获得所需的多边形。
所以我的问题是:是否有人可以告诉我如何获取关系ID,以执行上述工作流程,或者是否有另一种、更好的方法解决这个问题。谢谢你的帮忙!

你试过普通的OSM地理编码器Nominatim吗?http://nominatim.openstreetmap.org/search.php?q=18055 - undefined
1个回答

4
您可以简化方法,只需进行一次Overpass API调用,假设您定义了一些相关标记以匹配所需的关系。特别是,您无需使用 poly,即不需要将关系转换为一组lat/lon对。现在可以使用区域(area)的概念来查询由way或relation定义的多边形中的某些对象。请查看有关区域的更多详细信息文件
为了获取关系1991416的匹配区域,我使用了postal_code=1030和boundary=administrative作为筛选条件。使用该区域,您可以在此特定多边形中搜索道路:
//uncomment the following line, if you need csv output
//[out:csv(::id, ::type, name)];

//adjust area to your needs, filter critera are the same as for relations
area[postal_code=1030][boundary=administrative]->.a;

// Alternative:  {{geocodeArea:name}} -> see
// http://wiki.openstreetmap.org/wiki/Overpass_turbo/Extended_Overpass_Queries

way(area.a)["highway"~"^(primary|secondary|tertiary|residential)$"]["name"];
(._;>;);out meta;

// just for checking if we're looking at the right area
rel(pivot.a);out geom;

试试在overpass turbo链接上:http://overpass-turbo.eu/s/6uN

注意:并非所有的路线/关系都有相应的区域,即一些区域生成规则适用(请参见上面的维基页面)。对于您的特定用例,您应该没问题。


2
哇!非常感谢。我已经阅读了很多关于Overpass Api的内容,但不知何故忽略了区域的原则。我一定会稍微研究一下这个概念。我还有一个额外的问题: 当我将您的查询简化为这个小查询:http://overpass-turbo.eu/s/6uS 我只得到了道路,这很好,因为我只需要街道的名称。是否有办法获取街道的唯一名称,因为查询的输出不是唯一的。谢谢! - undefined
哦,还有一个问题!你只是使用邮政编码来标识地区,这很好,但是据我所知,世界上的邮政编码并不是唯一的,所以有没有可能做类似于area[postal_code=1030][countrycode=AT][boundary=administrative]->.a;这样的操作呢? 可惜我找不到任何关于区域查询输入的文档。再次感谢你的帮助! - undefined
关于你的第二个问题:这样做是行不通的,因为countrycode=AT并没有直接包含在关系1991416中作为一个标签。不幸的是,我不知道ref:at:gkz在奥地利是否一致使用。如果是的话,你可以将["ref:at:gkz"]作为额外的过滤条件添加进去。你可能想要与奥地利的OpenStreetMap社区联系,了解他们关于邮政编码的标记规则。我对这个细节不太熟悉。Overpass API也有一些实验性的支持,可以查询区域内的区域(再次参考维基页面上的map_to_area示例)。 - undefined
1
关于你的第一个问题:就像我在代码中提到的那样,你可以使用CSV作为输出格式,只需输出名称即可。请注意,你仍然需要对这个结果进行排序并去除重复项。Overpass API无法为你完成这些操作。http://overpass-turbo.eu/s/6uY - undefined
当我访问那个Overpass链接并将postal_code替换为例如'1104BA'时,我没有得到任何结果。 - undefined
显示剩余4条评论

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