Получение площади населённого пункта через 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))

Ответы (0 шт):