Получение площади населённого пункта через OSM в python
Есть код, который находит количество школ в населённом пункте, причём поиск по городу осуществляется через "городской округ", т. е. если нужно получить количество школ в Волгограде, нужно ввести "городской округ Волгоград". Нужно, чтобы программа также могла получить площадь данного населённого пункта
import overpy
from geopy.geocoders import Nominatim
def get_number_of_schools_and_area(city_name):
geolocator = Nominatim(user_agent="city_school_fetcher")
location = geolocator.geocode(city_name + ", Россия")
if not location:
return f"Город {city_name} не найден."
api = overpy.Overpass()
# Запрос для получения границ города и площади
query_area = f"""
[out:json];
area["name"="{city_name}"]["boundary"="administrative"]->.a;
(
way(area.a)["boundary"="administrative"];
relation(area.a)["boundary"="administrative"];
);
out body;
"""
query_schools = f"""
[out:json];
area["name"="{city_name}"]["boundary"="administrative"]->.a;
(
node(area.a)["amenity"="school"];
way(area.a)["amenity"="school"];
relation(area.a)["amenity"="school"];
);
out body;
"""
try:
# Запрашиваем данные для административной границы города
result_area = api.query(query_area)
# Запрашиваем данные для школ
result_schools = api.query(query_schools)
# Получаем количество школ
schools = len(result_schools.nodes) + len(result_schools.ways) + len(result_schools.relations)
# Получаем площадь города из границы
area = "Площадь не найдена."
for way in result_area.ways:
for tag in way.tags:
if tag == "area" and way.tags[tag] == "yes":
# Если данная территория имеет тег "area" с значением "yes", то это может быть объект с площадью
area = "Площадь города найдена, но точные данные не доступны в Overpass API."
if schools == 0:
schools_message = f"В н.п. {city_name} не найдено школ."
else:
schools_message = f"В н.п. {city_name} найдено {schools} школ."
return f"{schools_message}\nПлощадь города: {area}"
except Exception as e:
return f"Ошибка при запросе данных: {e}"
city = input("Введите название города: ")
print(get_number_of_schools_and_area(city))