【问题标题】:How to get all power plants from Open Street Map using overpass api with python?如何使用带有python的立交桥api从Open Street Map获取所有发电厂?
【发布时间】:2016-06-19 16:18:29
【问题描述】:

这是我正在使用的代码:

import overpass
api = overpass.API(timeout=900)
response = api.Get('node["power" = "plant"]')
print(response)

我得到了一个嵌套的发电厂字典,但只有 187 个。我怀疑肯定还有更多。有谁知道更好的查询方式?我最终想帮助建立一个按国家/地区分类的发电厂数据库,并欢迎任何有关如何按国家/地区查询的帮助。

下面,我可以使用边界框查询节点:

import urllib

workspace = " "

# Make data queries to jXAPI
powerXml = urllib.request.urlopen("http://www.overpass-api.de/api/xapi?node%5Bpower=*%5D%5Bbbox=1.58203,4.56547,15.46875,14.94478%5D").read()

【问题讨论】:

    标签: python openstreetmap overpass-api


    【解决方案1】:

    您只获取nodes。根据taginfo,大约 7% 的发电厂被映射为ways(很少有人映射为relations)。您所在国家/地区的比例可能不同。

    您可以在overpass-turbo 的帮助下构建特定国家/地区的查询。它是 Overpass API 的一个很好的前端,有一个很好的向导和一个稍微改进的查询语言。使用向导并搜索“power=plant in France”会返回以下query

    /*
    This has been generated by the overpass-turbo wizard.
    The original search was:
    “power=plant in France”
    */
    [out:json][timeout:300];
    // fetch area “France” to search in
    {{geocodeArea:France}}->.searchArea;
    // gather results
    (
      // query part for: “power=plant”
      node["power"="plant"](area.searchArea);
      way["power"="plant"](area.searchArea);
      relation["power"="plant"](area.searchArea);
    );
    // print results
    out body;
    >;
    out skel qt;
    

    请注意,您必须增加超时时间(例如增加到 300 秒),因为对于此类大型查询,25 秒的默认超时时间非常低。

    此查询返回大约 800 个发电厂。如果你想从你的 python 脚本中调用这个查询,那么你必须将它转换回 Overpass 语言。 {{geocodeArea:France}} 是 overpass turbo 的扩展,Overpass API 不支持。去Export -> Overpass QL,你会得到这个查询:

    [out:json]
    [timeout:180]
    ;
    area(3602202162)->.searchArea;
    (
      node
        ["power"="plant"]
        (area.searchArea);
      way
        ["power"="plant"]
        (area.searchArea);
      relation
        ["power"="plant"]
        (area.searchArea);
    );
    out body;
    >;
    out skel qt;
    

    现在{{geocodeArea:France}} 已替换为area(3602202162)。区域是 Overpass API 中的一个特殊元素,在 OSM 中以不同的方式存在。区域 ID(在这种情况下)来自 2202162(法国的关系 ID)+ 3600000000。请注意,只要法国的关系 ID 发生变化(极不可能),您就必须更新此数字。

    您可以使用 this URL 直接从您的应用程序中调用此查询(也可以通过 overpass turbo 的导出功能使用)。

    【讨论】:

    • 非常感谢您的回答!如果我再烦你一件事 - 我可以查询比利时所有城市的 OSM:import overpass api = overpass.API(timeout=900) cities = api.Get('area[name="België - Belgique - Belgien"];(node[place="city"](area););out;') print(cities) 但我不能为发电厂做类似的事情。你知道为什么吗? api = overpass.API(timeout=900) power = api.Get('area[name="België - Belgique - Belgien"];(node[power="plant"](area););out;') print(power)再次感谢
    • 错误如下。当我指定边界框时,我能够获得发电厂和发电机,但我想要一种更有效的方式来从 API 获取国家级数据。 KeyError Traceback (最近一次调用最后) in () 1 C:\Users\julia.dills\AppData\Local\Continuum\Anaconda3\lib\site-packages\overpass\api .py in _asGeoJSON(self, elements) 129 elif elem_type == "way": 130 points = [] --> 131 for coords in elem["geometry"]: 132 points.append((coords["lon"], coords["lat"])) 133 几何 = geojson.LineString(points) KeyError: 'geometry'
    • @JuliaDills:请不要在多个地方发布相同的错误消息,例如:help.openstreetmap.org/questions/50424/…。这浪费了大家的时间。
    • 对不起,我不知道。不会再发生了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2014-05-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多