Выбор и упорядочение по расстоянию с GeoAlchemy2. Плохая ST_As Бинарная упаковка

Я пытаюсь выбрать и упорядочить магазины по их расстоянию до точки с помощью GeoAlchemy2 / PostGIS, но по какой-то причине я продолжаю получать ошибку.

Кажется, GeoAlchemy2 оборачивает вещи с помощью ST_AsBinary, но когда я пытаюсь выбрать расстояние, он пытается обернуть результат вычисления расстояния. Я понятия не имею, как это исправить.

Я использую этот запрос ORM.

distance = (
    Store.coordinates.cast(Geometry)
    .distance_centroid(query_centroid)
    .label('distance')
)

stores = stores.order_by(distance).add_columns(distance)

Модель.

class Store(db.Model):
    __tablename__ = 'stores'

    store_id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)

    address_details = db.Column(db.String)
    coordinates = db.Column(Geography('POINT'))

Я получаю ошибку.

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) function st_asbinary(double precision) does not exist
LINE 1: ...Binary(stores.coordinates) AS stores_coordinates, ST_AsBinar...
                                                             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
[SQL: 'SELECT stores.store_id AS stores_store_id,
    stores.name AS stores_name,
    stores.address_details AS stores_address_details,
    ST_AsBinary(stores.coordinates) AS stores_coordinates,
    ST_AsBinary(CAST(stores.coordinates AS geometry(GEOMETRY,-1)) <-> ST_GeomFromEWKT(%(param_1)s)) AS distance
    FROM stores ORDER BY distance']13 -46.730347)'}]
[parameters: {'param_1': 'POINT(-23.3569

Проблема именно в этой части...

ST_AsBinary(
    CAST(stores.coordinates AS geometry(GEOMETRY,-1))
    <->
    ST_GeomFromEWKT(%(param_1)s)
) AS distance 

Заметьте, как ST_AsBinary оборачивает расстояние между двумя точками, вместо того, чтобы обернуть, например, только geom? (Я не уверен, что в этом случае это должно обернуть geom)

Кто-нибудь может помочь? Я просто хочу знать, как далеко.

1 ответ

Решение

Обычный пользователь на freenode ответил мне за это.

GeoAlchemy2 преобразует столбцы типа Geometry, если они находятся в операторе select. Несмотря на то, что результат выражения расстояния является двойным, а не Geometry, GeoAlchemy2 не достаточно умен, чтобы понять это.

Столбец должен быть явно приведен в ORM.

Фиксированный запрос:

distance = (
    Store.coordinates.cast(Geometry)
    .distance_centroid(query_centroid)
    .cast(db.Float)
    .label('distance')
)

stores = stores.order_by(distance).add_columns(distance)
Другие вопросы по тегам