Задать вопрос
@belkinark

Как реализовать поиск ближайших точек GeoAlchemy2 одним запросом?

Здравствуйте. Сейчас у меня есть код, который выполняет поиск ближайшего аэропорта по координатам и в найденном аэропорту получает город, затем во всех аэропортах города обновляет строку rank. В проекте, поиск выполняется около 16 тысяч раз, что сильно бьёт по оптимизации (чтобы наполнить всю базу, потребуется примерно 9 часов). Вот функция, которая отвечает за поиск и обновления данных. Библиотеки которые здесь используются [GeoAlchemy2==0.14.3, SQLAlchemy~=2.0.29].
class Table_AirportIataInfo(Base):
    __tablename__ = "airport_iata_info"
    __table_args__ = {"schema": schema_manager.schema_name}

    icao = mapped_column(CHAR(4), primary_key=True)
    iata = mapped_column(CHAR(3))
    name = mapped_column(TEXT)
    city = mapped_column(TEXT, index=True)
    country = mapped_column(CHAR(2))
    lat = mapped_column(FLOAT)
    lon = mapped_column(FLOAT)
    location = mapped_column(Geometry('POINT'))
    rank = mapped_column(BIGINT)


class Query_AirportIataInfo:

    @staticmethod
    def update_rank_with_location(location: Geometry, rank: int):
        with session_factory() as session:
            nearest_airport = session.query(Table_AirportIataInfo).order_by(
                Table_AirportIataInfo.location.distance_box(location)
            ).first()
            airports = session.query(Table_AirportIataInfo).filter_by(
                city=nearest_airport.city, country=nearest_airport.country
            ).all()

            for airport in airports:
                airport.rank = rank

            session.commit()

Для ускорения кода, пытаюсь реализовать поиск по всем координатам 1 запросом в базу данных. То есть функция update_rank_with_location будет принимать List[Tuple[Geometry, int] и 1 запросом выискивать все ближайшие аэропорта по данным из массива, получать города и обновлять rank. Для наглядности приведу пример вызова функции:
data = [
    [f"POINT({40.71427} {-74.00597})", 600],
    [f"POINT({51.4706} {-0.46194})", 500]
]
Query_AirportIataInfo.update_rank_with_location(data)

Буду благодарен, если поможете или, если дадите полезные ресурсы на эту тему.
  • Вопрос задан
  • 70 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы