我们有 Overpass API python 包装器,一个围绕 OpenStreetMap Overpass API 的瘦 Python 包装器 https://github.com/mvexel/overpass-api-python-wrapper
我们有一些简单的例子:
import overpass
api = overpass.API()
response = api.Get('node["name"="Salt Lake City"]')
请注意,您不必包含任何输出元语句。 wrapper 会很好地包装它们。 我们将以字典形式获取结果,它代表您直接从 Overpass API 获取的 JSON 输出。
print [(feature['tags']['name'], feature['id']) for feature in response['elements']]
[(u'Salt Lake City', 150935219), (u'Salt Lake City', 585370637), (u'Salt Lake City', 1615721573)]
我们可以指定响应的格式。默认情况下,我们将使用responseformat参数获取GeoJSON。替代方案是纯 JSON (json) 和 OSM XML (xml),直接由 Overpass API 输出。
response = api.Get('node["name"="Salt Lake City"]', responseformat="xml")
更新的问题:我们还可以获取 cvs - 我们可以使用 python 包装器向立交桥涡轮的端点执行如下所示的请求吗?
[out:csv(::id,::type,"name","addr:postcode","addr:city",
"addr:street","addr:housenumber","website"," contact:email=*")][timeout:30];
area[name="Madrid"]->.a;
( node(area.a)[amenity=hospital];
way(area.a)[amenity=hospital];
rel(area.a)[amenity=hospital];);
out;
顺便说一句:不幸的是,我遇到了自述文本中的示例代码已损坏:当我尝试以下操作时:
print( [(feature['tags']['name'], feature['id']) for feature in response['elements']] )
我收到错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'elements'
This works, though:
print( [(feature['properties']['name'], feature['id']) for feature in response['features']] )
你觉得怎么样?
最佳答案
你可以试试这个。
import overpass
api = overpass.API()
query = """
[out:csv(::id,::type,"name","addr:postcode","addr:city",
"addr:street","addr:housenumber","website"," contact:email=*")][timeout:30];
area[name="Madrid"]->.a;
( node(area.a)[amenity=hospital];
way(area.a)[amenity=hospital];
rel(area.a)[amenity=hospital];);
out;
"""
resp = api._get_from_overpass(query)
data = [row.split('\t') for row in resp.text.split('\n')]
输出:
for x in data[:5]:
print(x)
# ['@id', '@type', 'name', 'addr:postcode', 'addr:city', 'addr:street', 'addr:housenumber', 'website', ' contact:email=*']
# ['597375537', 'node', 'Centro de especialidades Emigrantes', '', '', '', '', '', '']
# ['1437313175', 'node', '', '', '', '', '', '', '']
# ['1595068136', 'node', '', '', '', '', '', '', '']
# ['2320596216', 'node', '', '', '', '', '', '', '']
或者
api = overpass.API()
query = """
area[name="Madrid"]->.a;
( node(area.a)[amenity=hospital];
way(area.a)[amenity=hospital];
rel(area.a)[amenity=hospital];);
"""
fmt = 'csv(::id,::type,"name","addr:postcode","addr:city","addr:street","addr:housenumber","website"," contact:email=*")'
data = api.get(query, responseformat=fmt)
输出:
for x in data[:5]:
print(x)
# ['@id', '@type', 'name', 'addr:postcode', 'addr:city', 'addr:street', 'addr:housenumber', 'website', ' contact:email=*']
# ['597375537', 'node', 'Centro de especialidades Emigrantes', '', '', '', '', '', '']
# ['1437313175', 'node', '', '', '', '', '', '', '']
# ['1595068136', 'node', '', '', '', '', '', '', '']
# ['2320596216', 'node', '', '', '', '', '', '', '']
关于用于在 overpass-API 端点上运行请求的 Python 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48568555/