【问题标题】:Getting all cities in a specific country using OpenStreetMap使用 OpenStreetMap 获取特定国家/地区的所有城市
【发布时间】:2021-11-02 23:30:54
【问题描述】:

我正在尝试找到一种方法来使用 OpenStreetMap API 来获取特定国家/地区所有城市的列表以及它们的经度和纬度,以便开发 iOS 应用程序。

但是我无法这样做。我一直在尝试使用 Overpass API,但找不到合适的参数来列出所有城市(而不仅仅是前 1000 名左右)。

有人知道返回正确 JSON 的方法吗?

【问题讨论】:

    标签: json openstreetmap


    【解决方案1】:

    对于 API,您的查询不是(恕我直言)一个好的查询,因为您的结果非常稀疏,但需要遍历所有数据(没有通用索引)。

    所以得到一个OSM extact,用osmosis 过滤它,然后对结果进行自己的处理。

    请记住,在 OSM 中可以对城镇进行不同的建模:

    • 作为标记节点,例如place=city
    • 作为土地使用区域(也带有额外的地点标签)
    • as boundary 所以,一个(多面体)关系

    您可能还想查看 nominatim 进行地理编码和查看 legal FAQ 以分发 OSM 数据。

    【讨论】:

    • "Planet.osm 是一个文件中的 OpenStreetMap 数据:构成我们地图的所有节点、路径和关系。每周发布一个新版本。这是一个大文件(超过 498GB 的​​ XML 变体)未压缩、36.1GB bz2 压缩和 25.2GB PBF)。” - 我认为最好只从 openstreetmap nominatim api 或类似的请求,因为没有多少人可以使用这么大的数据集
    【解决方案2】:

    使用 Overpass API。

    area["ISO3166-1"="CY"]->.a1;
    (
      nwr[place="city"](area.a1);
    );
    out body;
    

    Link。打开控制台,点击运行查看请求和响应。

    或者使用 curl

    curl 'https://lz4.overpass-api.de/api/interpreter' \
     --data-raw 'data=[out:json];area["ISO3166-1"="CY"]->.a1;
    (
    nwr[place="city"](area.a1);
    );
    out body;'
    

    【讨论】:

      【解决方案3】:

      试试Overpass_API

      例如,德国的所有州:

       http://overpass-api.de/api/interpreter?data=(rel[admin_level="4"](47,6,55,15););out;
      

      【讨论】:

      • 所以我设法通过curl 'http://overpass-api.de/api/interpreter' --data-raw 'data=(rel[admin_level="4"](47,6,55,15););out;' 运行它,但它带来了大量数据。可以更简洁吗?顺便说一句,它可以返回 JSON 吗?
      • (47,6,55,15) 不是国家/地区
      猜你喜欢
      • 2014-04-27
      • 2014-08-21
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      相关资源
      最近更新 更多