2015-09-01 5 views
2

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

Кажется, 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 обертывания расстояние между двумя точками вместо оберточной только геометрию, например? (Я не уверен, что он должен обернуть геометру в этом случае)

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

ответ

1

Средний пользователь на freenode ответил мне.

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

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

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

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

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