用于在 overpass-API 端点上运行请求的 Python 包装器

标签 python json linux openstreetmap overpass-api

我们有 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/

相关文章:

python - Pandas 数据帧 : mean of column B values within column A windows

javascript - 从 json 中删除 "checked"

c - recvmsg 的 Linux SocketCAN 行为

mysql - 与文件相比,为什么 GPG 在 bash var 中存储不同的东西

python - 将文本分成多列

python - 如何列出与每项事件相关的所有姓名和年龄

python - 使用 python 评估滤波器 matlab 函数

javascript - 过滤 JavaScript 对象

android - json 对象的 Volley Post 方法

linux - 在没有套接字的情况下“喂养”Netty 4 管道