0

这是我正在使用的代码:

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

1 回答 1

2

您只是在获取节点。根据taginfo,大约 7% 的发电厂被映射为方式(很少被映射为关系)。您所在国家/地区的比例可能不同。

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

/*
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 发生变化(极不可能)时,您都必须更新此数字。

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

于 2016-06-16T07:03:30.963 回答