如何使用python的立交桥api从Open Street Map获取所有发电厂?

时间:2016-06-15 19:03:51

标签: python openstreetmap overpass-api

这是我正在使用的代码:

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()

1 个答案:

答案 0 :(得分:2)

您只提取nodes。根据{{​​3}},大约7%的发电厂被映射为taginfo(极少数为ways)。您所在的国家/地区的比例可能会有所不同。

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

/*
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不支持。转到导出 - >绕过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(在本例中)来自query(法国的关系ID)+ 3600000000。请注意,只要法国的关系ID发生变化(极不可能),您就必须更新此号码。

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