首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GeoAlchemy2按距离选择和排序。坏的ST_AsBinary包装

使用GeoAlchemy2按距离选择和排序。坏的ST_AsBinary包装
EN

Stack Overflow用户
提问于 2015-09-01 06:12:57
回答 1查看 1.3K关注 0票数 3

我试图选择和订购存储的距离到一个点与GeoAlchemy2 / PostGIS,但出于某种原因,我一直得到一个错误。

GeoAlchemy2似乎用ST_AsBinary包装东西,但当我试图选择距离时,它试图包装距离计算的结果。我不知道怎么解决这个问题。

我使用这个ORM查询。

代码语言:javascript
复制
distance = (
    Store.coordinates.cast(Geometry)
    .distance_centroid(query_centroid)
    .label('distance')
)

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

模型。

代码语言:javascript
复制
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'))

我犯的错误。

代码语言:javascript
复制
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

问题就在这部分..。

代码语言:javascript
复制
ST_AsBinary(
    CAST(stores.coordinates AS geometry(GEOMETRY,-1))
    <->
    ST_GeomFromEWKT(%(param_1)s)
) AS distance 

注意ST_AsBinary是如何包装两个点之间的距离而不是仅仅包装geom的,例如?(在这种情况下,我也不确定它是否应该包装geom )

有人能帮忙吗?我只想知道事情有多远。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-06 20:02:16

freenode的普通用户帮我回答了这个问题。

如果列在select语句中,GeoAlchemy2将转换几何类型的列。尽管距离表达式的结果是双倍的,而不是几何学的,但GeoAlchemy2还不够聪明,无法弄清楚这一点。

列需要在ORM中进行显式强制转换。

固定查询:

代码语言:javascript
复制
distance = (
    Store.coordinates.cast(Geometry)
    .distance_centroid(query_centroid)
    .cast(db.Float)
    .label('distance')
)

stores = stores.order_by(distance).add_columns(distance)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32324707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档