Как получить все электростанции из Open Street Map, используя overpass api с python?

Это код, который я использую:

import overpass
api = overpass.API(timeout=900)
response = api.Get('node["power" = "plant"]')
print(response)

Я получаю вложенный словарь электростанций, но только 187. Я подозреваю, что их должно быть намного больше. Кто-нибудь знает лучший способ сделать запрос? В конечном итоге я хочу помочь создать базу данных электростанций по странам и приветствую любую помощь в том, как делать запросы по странам.

Ниже я могу запросить узел, используя ограничивающую рамку:

import urllib

workspace = " "

# Make data queries to jXAPI
powerXml = urllib.request.urlopen("http://www.overpass-api.de/api/xapi?node%5Bpower=*%5D%5Bbbox=1.58203,4.56547,15.46875,14.94478%5D").read()

person zelda1234    schedule 15.06.2016    source источник


Ответы (1)


Вы получаете только узлы. Согласно taginfo, около 7% электростанций обозначены как пути (и очень мало, как отношения). Пропорции могут отличаться для вашей страны.

Вы можете создавать запросы для конкретных стран с помощью overpass-turbo. Это хороший интерфейс для Overpass API, с хорошим мастером, а также с немного улучшенным языком запросов. Использование мастера и поиск «power=plant in France» возвращает следующий запрос:

/*
This has been generated by the overpass-turbo wizard.
The original search was:
“power=plant in France”
*/
[out:json][timeout:300];
// fetch area “France” to search in
{{geocodeArea:France}}->.searchArea;
// gather results
(
  // query part for: “power=plant”
  node["power"="plant"](area.searchArea);
  way["power"="plant"](area.searchArea);
  relation["power"="plant"](area.searchArea);
);
// print results
out body;
>;
out skel qt;

Обратите внимание, что вам нужно увеличить время ожидания (например, до 300 секунд), потому что время ожидания по умолчанию в 25 секунд довольно мало для таких больших запросов.

Этот запрос возвращает около 800 электростанций. Если вы хотите вызвать этот запрос из своего скрипта Python, вам придется преобразовать его обратно в язык Overpass. {{geocodeArea:France}} является расширением Overpass Turbo и не поддерживается Overpass API. Перейдите в Export -> Overpass QL, и вы получите такой запрос:

[out:json]
[timeout:180]
;
area(3602202162)->.searchArea;
(
  node
    ["power"="plant"]
    (area.searchArea);
  way
    ["power"="plant"]
    (area.searchArea);
  relation
    ["power"="plant"]
    (area.searchArea);
);
out body;
>;
out skel qt;

Теперь {{geocodeArea:France}} заменено на area(3602202162). Области — это специальный элемент Overpass API, который не существует в OSM. Идентификатор области (в данном случае) происходит от 2202162 (идентификатор отношения Франции) + 3600000000. Примечание. что всякий раз, когда идентификатор отношения Франции изменяется (крайне маловероятно), вы должны обновить этот номер.

Вы можете вызвать этот запрос непосредственно из своего приложения, используя этот URL ( также доступно через функцию экспорта Overpass Turbo).

person scai    schedule 16.06.2016
comment
Большое спасибо за ваш ответ! Если я могу побеспокоить вас еще об одном, я могу запросить OSM для всех городов Бельгии: import overpass api = overpass.API(timeout=900) cities = api.Get('area[name="België - Belgique - Belgien"];(node[place="city"](area););out;') print(cities) но я не могу сделать то же самое для силовых установок. Ты знаешь почему? api = overpass.API(timeout=900) power = api.Get('area[name="België - Belgique - Belgien"];(node[power="plant"](area););out;') print(power) Еще раз спасибо - person zelda1234; 23.06.2016
comment
Дополнительные вопросы по адресу help.openstreetmap.org/questions/50424/ и github.com/mvexel/overpass-api-python-wrapper/issues/59. - person scai; 24.06.2016
comment
Ошибка ниже. Я могу получить электростанции и электрогенераторы, указав ограничивающую рамку, но мне нужен более эффективный способ получения данных на уровне страны из API. KeyError Traceback (последний последний вызов) ‹ipython-input-96-529c6ed17161› в ‹module›() 1 C:\Users\julia.dills\AppData\Local\Continuum\Anaconda3\lib\site-packages\overpass\api .py в _asGeoJSON(self, elements) 129 elif elem_type == way: 130 баллов = [] --› 131 для координат в elem[geometry]: 132 балла.append((coords[lon], coords[lat])) 133 геометрия = geojson.LineString(точки) KeyError: 'геометрия' - person zelda1234; 02.07.2016
comment
@JuliaDills: пожалуйста, не публикуйте одно и то же сообщение об ошибке в нескольких местах, например здесь: help.openstreetmap.org/questions/50424/. Это пустая трата времени каждого. - person mmd; 05.07.2016
comment
Извините, я не был в курсе. Больше не повторится. - person zelda1234; 06.07.2016