如何使用overpy让{{geocodeArea:xxx}}查询在python中工作?

如何使用overpy让{{geocodeArea:xxx}}查询在python中工作?,python,openstreetmap,overpass-api,Python,Openstreetmap,Overpass Api,我想找到一个特定区域内的所有酒吧,使用并选择带有geocodeArea的区域 在上测试以下查询可以得到所需的结果: {{geocodeArea:berlin}}->.searchArea; ( node["amenity"="pub"](area.searchArea); way["amenity"="pub"](area.searchArea); relation["amenity"="pub"](area.searchArea); ); out body; >; ou

我想找到一个特定区域内的所有酒吧,使用并选择带有geocodeArea的区域

在上测试以下查询可以得到所需的结果:

{{geocodeArea:berlin}}->.searchArea;
(
  node["amenity"="pub"](area.searchArea);
  way["amenity"="pub"](area.searchArea);
  relation["amenity"="pub"](area.searchArea);
);
out body;
>;
out skel qt;
但是当我在python中使用

。。。我得到以下错误:

Traceback (most recent call last):
  File "testOP.py", line 15, in <module>
    """)
  File "/usr/local/lib/python2.7/dist-packages/overpy/__init__.py", line 119, in query
    msgs=msgs
overpy.exception.OverpassBadRequest: Error: line 2: parse error: Unknown type "{" 
Error: line 2: parse error: An empty query is not allowed 
Error: line 2: parse error: ';' expected - '{' found. 
代码

  • 是否对提名进行地理编码请求
  • 搜索结果中作为关系的第一个元素(最多3个)
  • 添加3600000000以从关系id获取区域id

  • 这不是一个非常干净的解决方案,我想知道是否有可能直接使用第一个结果(主要是城市作为点)用于我的目的。仍然欢迎提示。

    {{{geocodeArea:xxx}}
    是立交桥turbo的一个特殊功能,而不是立交桥API的一部分。overpy直接使用OverpassAPI,这意味着您不能使用此关键字


    然而,
    {{geocodeArea:xxx}}
    只是告诉立交桥turbo执行地理编码请求,即将地址转换为地理位置。您也可以这样做,例如,致电Namingm、Photon或任何其他地理编码器。

    您可以使用
    区域
    过滤器而不是
    地理编码区域
    获得类似的结果。例如:

    area[name="Berlin"]->.searchArea;
    (
      node["amenity"="pub"](area.searchArea);
      way["amenity"="pub"](area.searchArea);
      relation["amenity"="pub"](area.searchArea);
    );
    out body;
    >;
    out skel qt;
    

    这可能有效,但对于其他区域,您可能需要更具体地使用
    区域
    过滤器中使用的标签,请参阅立交桥的更多信息

    谢谢@scai!现在,我通过geopy在我的手机中添加了一个提名电话,它正在工作。唯一的问题是,它的出价笨拙,因为它需要在最初的几个结果正确的城市关系。
    from geopy.geocoders import Nominatim
    import overpy
    
    city_name = "berlin"
    
    # Geocoding request via Nominatim
    geolocator = Nominatim(user_agent="city_compare")
    geo_results = geolocator.geocode(city_name, exactly_one=False, limit=3)
    
    # Searching for relation in result set
    for r in geo_results:
        print(r.address, r.raw.get("osm_type"))
        if r.raw.get("osm_type") == "relation":
            city = r
            break
    
    # Calculating area id
    area_id = int(city.raw.get("osm_id")) + 3600000000
    
    # Excecuting overpass call
    api = overpy.Overpass()
    result = api.query("""
        area(%s)->.searchArea;
        (
          node["amenity"="pub"](area.searchArea);
          way["amenity"="pub"](area.searchArea);
          relation["amenity"="pub"](area.searchArea);
        );
        out body;
        """ % area_id)
    
    # Printing no. of pubs in nodes and ways
    print("Amenities in nodes: %d" % len(result.nodes))
    print("Amenities in ways: %d" % len(result.ways))
    
    area[name="Berlin"]->.searchArea;
    (
      node["amenity"="pub"](area.searchArea);
      way["amenity"="pub"](area.searchArea);
      relation["amenity"="pub"](area.searchArea);
    );
    out body;
    >;
    out skel qt;