Запрос Overpass работает на overpass-turbo.eu, но не локально

Я пытаюсь выполнить запросы Overpass из скрипта Python. Я практикуюсь на overpass-turbo.eu и обнаружил, что следующий запрос работает как положено:

[out:json][timeout:600];
{{geocodeArea:Niedersachsen}}->.searchArea;
(
  node[place=city](area.searchArea);  
  node[place=town](area.searchArea);  

);
out;

Однако, когда я отправляю точно такой же запрос из скрипта Python, я получаю сообщение об ошибке:

import requests
overpass_query = """
[out:json][timeout:600];
{{geocodeArea:Niedersachsen}}->.searchArea;
(
  node[place=city](area.searchArea);  
  node[place=town](area.searchArea);  

);
out;
"""
overpass_url = "http://overpass-api.de/api/interpreter"
response = requests.get(overpass_url, params={'data': overpass_query})
data = response.json()

/home/enno/events/docker/etl/venv/bin/python /home/enno/events/docker/etl/test2.py
Traceback (most recent call last):
  File "/home/enno/events/docker/etl/test2.py", line 16, in <module>
    data = response.json()
  File "/home/enno/events/docker/etl/venv/lib/python3.6/site-packages/requests/models.py", line 897, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/lib/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.6/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Process finished with exit code 1

Почему это? Кажется, это связано с фигурными скобками, но я не могу понять, как это решить.

Большое спасибо,

Энно


person mcenno    schedule 07.03.2019    source источник


Ответы (1)


Фигурные скобки (также известные как {{geocodeArea:Niedersachsen}}) являются специальной функцией overpass turbo и не являются частью Overpass API. См. расширенные турбо-запросы Overpass для получения списка этих сокращений.

{{geocodeArea:name}} сообщит Overpass Turbo выполнить запрос геокодирования, используя Nominatim. Затем он будет использовать первый результат для построения запроса area(id). Вы должны выполнить тот же шаг (используя Nominatim или любой другой геокодер) в своей программе.

person scai    schedule 07.03.2019
comment
Спасибо, теперь это имеет смысл! - person mcenno; 07.03.2019
comment
hello Scai hello mcenno - для полного понимания: фигурные скобки (также известные как {{geocodeArea:Niedersachsen}}) являются специальной функцией overpass turbo - поэтому они работают в Overpass-Turbo (например, в веб-интерфейсе), но если мы выполним запрос к конечной точке overpass-api - тогда нам нужно использовать другую номинацию (nominatim), чтобы добиться успеха!? - Если так - если я вас обоих правильно понял - тогда большое спасибо. В настоящее время я пытаюсь расширить свое понимание всего этого. - person zero; 07.05.2020
comment
Да, это правильно. overpass turbo использует Nominatim для преобразования именованной области в многоугольник. Вам нужно будет сделать то же самое, если вы хотите использовать именованные области напрямую с API Overpass (т.е. без интерфейса overpass turbo). В качестве альтернативы вы можете попробовать запросить область по тегам. В приведенном выше случае должно работать следующее: relation["boundary"="administrative"]["admin_level"="4"]["name"="Niedersachsen"];. - person scai; 08.05.2020