我正在尝试按照他们到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)
有人可以帮忙吗?我只想知道事情有多远。
答案 0 :(得分:1)
freenode的普通用户为我解答了这个问题。
GeoAlchemy2将转换Geometry类型的列,如果它们在select语句中。即使距离表达的结果是双倍的,而不是几何,GeoAlchemy2也不够聪明,无法解决这个问题。
该列需要在ORM中显式转换。
固定查询:
{{1}}