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

时间:2014-12-11 17:58:12

标签: openstreetmap nominatim overpass-api

我想编写一个代码,其中包含国家代码和邮政编码作为输入,输出是使用某些使用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. 下载多边形后,我可以将聚集的多边形放在此查询中的立交桥api

    ( 办法 (poly:" polygone data") ["公路"〜" ^(主|副|叔|住宅)$"] ["名称"];

    ); 出geom;

  4. 这给了我搜索区的街道。我解决这个问题的两个问题是 1.它需要相当长的时间,因为每个请求要求三个不同的API并不容易在资源和 2.我不知道如何自动从第一步收集关系Id。当我输入像http:// nominatim.openstreetmap.org/search?format=json&country=austria&postalcode=1030这样的Nominatim查询时,我只是在区中获得了各种点,但没有按顺序搜索搜索区的关系ID获得所需的多边形。

    所以我的问题是,如果有人可以告诉我如何获得relation_Id以便执行上述工作流程,或者是否有其他可能更好的方法来解决这个问题。

    感谢您的帮助!

    最诚挚的问候 丹尼尔

1 个答案:

答案 0 :(得分:3)

您可以相当简化您的方法,直到单个Overpass API调用,假设您定义了一些相关标签以匹配相关关系。特别是,您根本不必使用poly,即无需将关系转换为纬度/经度对列表。现在,可以使用区域的概念来查询由方式或关系定义的多边形中的某些对象。请查看documentation for more details on areas

为了获得关系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;

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

注意:并非所有方式/关系都有相应的区域,即适用某些区域生成规则(请参阅上面的wiki页面)。但是,对于您的特定用例,您应该没问题。