Как подсчитать количество удобств на уровне admin_level n в цикле foreach по уровню admin_level n + 2 с overpy - PullRequest
0 голосов
/ 30 мая 2019

Я бы хотел посчитать удобства (бары и пабы) на уровне admin_level 6 (департамент) с завышенной ценой.

Мне удалось создать CSV-файл с турбонаддувом overpass:

[out:csv(id, total )];
//All French départements (level 6) from FR-01 to FR-95 plus FR-2A and FR-2B
area[admin_level=6]["ISO3166-2"~"^FR-[0-9]|[1-8][0-9]|9[0-5]|2[A-B]"];

// Counts  bars and pubs in each dpt (level 6)
foreach->.dpt(
  // search for bars and pubs
  (
    way(area.dpt)[amenity=pub];
    way(area.dpt)[amenity=bar];
    node(area.dpt)[amenity=pub];
    node(area.dpt)[amenity=bar];
  );

  make count id = dpt.set(t["ref"]),
             total = count(ways) + count(nodes);
  out;
);

, но поскольку я понял, что overpy не работает с CSV-файлами, я хотел бы получить список пар (ссылка на площадь, количество баров и пабов).

Это:

import overpy

api = overpy.Overpass()

dpts = api.query("""
// All french departements (level 6)
area[admin_level=6]["ISO3166-2"~"^FR-[0-9]|[1-8][0-9]|9[0-5]|2[A-B]"];

// Find bars and pubs in each dpt
foreach->.dpt(
  // looks for bars and pubs
  (
    way(area.dpt)[amenity=pub];
    way(area.dpt)[amenity=bar];
    node(area.dpt)[amenity=pub];
    node(area.dpt)[amenity=bar];
  );
  out;
);
""")

дает мне все узлы и пути, но не отсортировано по area.dept.

Я получилвсе бары и пабы:

In [102]: len(dpts.ways + dpts.nodes)
Out[102]: 3895

Как я могу получить список типа [(area ref, number of pubs and bars)]?

1 Ответ

0 голосов
/ 31 мая 2019

Ну, я думаю, что легко использовать Python для цикла:

Bars = []
api = overpy.Overpass()
for d in range(21,96):
    dpt = api.query("""
    area[admin_level=6]["ISO3166-2" = "FR-{}"];
    (way(area)[amenity=bar];
    node(area)[amenity=bar];);
    (._;>;);
    out;""".format(d))
    Bars.append((d, len(dpt.ways + dpt.nodes)))
Bars

Но это создает запрос каждый раз. Это менее эффективно, чем зацикливание внутри запроса?

...