【问题标题】:Python wrapper to run requests on the endpoint of overpass-API在 overpass-API 的端点上运行请求的 Python 包装器
【发布时间】:2018-07-12 02:53:58
【问题描述】:

我们使用 Overpass API python wrapper 为 OpenStreetMap Overpass API https://github.com/mvexel/overpass-api-python-wrapper 提供了一个精简的 Python 包装器@

我们有一些简单的例子:

import overpass
api = overpass.API()
response = api.Get('node["name"="Salt Lake City"]')

请注意,您不必包含任何输出元语句。包装器将包装这些。 我们将得到我们的结果作为一个字典,它表示您将直接从 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 包装器向 overpass turbo 的端点执行如下请求吗?

[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']] )

你怎么看?

【问题讨论】:

    标签: python json linux openstreetmap overpass-api


    【解决方案1】:

    你可以试试这个。

    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', '', '', '', '', '', '', '']
    

    【讨论】:

      猜你喜欢
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多