【问题标题】:Getting Streets of a specific postcode using Open Street Maps使用 Open Street Maps 获取特定邮政编码的街道
【发布时间】:2021-08-06 21:41:05
【问题描述】:

我想编写一个将 Countrycode 和 Postcode 作为输入的代码,输出是使用一些使用 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:“多边形数据”) ["高速公路"~"^(小学|中学|大学|住宅)$"] [“名称”];

    ); 出几何;

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

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

感谢您的帮助!

最好的问候 丹尼尔

【问题讨论】:

标签: openstreetmap nominatim overpass-api


【解决方案1】:

假设您定义了一些相关标签以匹配相关关系,您可以大大简化您的方法,只需调用一次 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;

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

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

【讨论】:

  • 哇!太感谢了。我已经阅读了很多关于 Overpass Api 的内容,但不知何故忽略了一个地区的原则。我肯定会阅读一下这个概念。我还有一个问题:当我将您的查询简化为overpass-turbo.eu/s/6uS 的这个小查询时,我只知道方法,这很好,因为我只需要街道的名称。由于查询的输出不是唯一的,有什么方法可以获得街道的唯一名称。谢谢!
  • 哦,还有一个问题!您仅使用邮政编码来识别该地区,它工作正常,但据我所知,邮政编码在世界上并不是独一无二的,所以有可能做类似 area[postal_code=1030][countrycode=AT] 之类的事情[边界=行政]->.a; ?遗憾的是,我找不到任何有关区域查询输入的文档。再次感谢您的帮助!
  • 关于您的第二个问题:这不会起作用,因为 countrycode=AT 没有直接包含在关系 1991416 作为标签中。不幸的是,我不知道 ref:at:gkz 是否在奥地利一直使用。如果是这样,您可以添加 ["ref:at:gkz"] 作为附加过滤条件。您可能想与奥地利的 OpenStreetMap 社区联系,了解他们的标记规则 wrt postal_codes。我不熟悉那个细节。在 Overpass API 中查询区域中的区域也有一些实验性支持(请再次参见 wiki 页面以获取 map_to_area 示例)。
  • 关于您的第一个问题:就像我在代码中提到的那样,您可以使用 CSV 作为输出格式并只输出名称。请注意,您仍然需要对此结果进行排序并删除重复项。 Overpass API 无法为您做到这一点。 overpass-turbo.eu/s/6uY
  • 太好了,谢谢。问题是,不知何故,这个查询只适用于维也纳的邮政编码。例如,当我在德国柏林输入一个邮政编码(例如 10115)时,没有输出。你知道任何这样的查询适用于更多的邮政编码吗?再次感谢!
猜你喜欢
  • 2014-09-26
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
相关资源
最近更新 更多