gpt4 book ai didi

python - Geoalchemy2 和 ST_Within - 点和多边形之间的类型不匹配?

转载 作者:行者123 更新时间:2023-11-29 12:18:03 28 4
gpt4 key购买 nike

我想运行一个查询,返回落在矩形内的每个点,其中点和矩形基于真实世界的经度和纬度。

这是失败的查询:

results = session.query(Store.id).filter(func.ST_Within(Store.location, func.ST_GeomFromEWKT('SRID=4326;POLYGON((150 -33, 152 -33, 152 -31, 150 -31, 150 -33))')))

它毫无怨言地运行,但在调用 results.first() 时,我看到以下错误和警告:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) function st_within(geography, geometry) does not exist LINE 3: WHERE ST_Within(store.location, ST_GeomFromEWKT('SRID=4326;P... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. [SQL: 'SELECT store.id AS store_id \nFROM store \nWHERE ST_Within(store.location, ST_GeomFromEWKT(%(ST_GeomFromEWKT_1)s )) \n LIMIT %(param_1)s'] [parameters: {'ST_GeomFromEWKT_1': 'SRID=4326;POLYGON((150 -33, 152 -33, 152 -31, 150 -31, 150 -33))', 'param_1': 1}]

但是,我可以通过在查询中创建一个虚拟点(这会导致每个商店都匹配)来使查询工作:

results = session.query(Store.id).filter(func.ST_Within(func.ST_GeomFromEWKT('SRID=4326;POINT(151 -32)'), func.ST_GeomFromEWKT('SRID=4326;POLYGON((150 -33, 152 -33, 152 -31, 150 -31, 150 -33))')))

这表明问题出在我的 Store.location 字段上,但我尝试过的任何东西 [包括 type_coerce(Store.location, Geeography)] 都没有用。

这是我对位置列的 SQLAlchemy 定义:

location = Column(Geography(geometry_type='POINT', srid=4326))

这是我将经度和纬度转换为位置的代码(我还尝试使用 func.ST_GeomFromEWKT() 强制类型):

stores = session.query(Store)
for store in stores:
store.location = 'SRID=4326;POINT({} {})'.format(store.longitude, store.latitude)
session.commit()

Python 告诉我 Store.location 的类型是“geoalchemy2.elements.WKBElement”,这是我希望从文档中得到的。

请问有人对如何修复查询有任何建议吗?

仅供引用,我正在运行:

  • PostgreSQL 9.6.1
  • psycopg2 2.6.2
  • SQLAlchemy 1.1.4,和
  • 地质炼金术 2 0.4.0

最佳答案

感谢其他地方(Mike Bayer 和 Greg Baker)的帮助,我可以发布答案。

问题是:

  1. 我的点是地理类型,我的多边形是几何类型,并且
  2. 许多其他 PostGIS 函数(包括 ST_Within)不支持地理(即它们仅支持几何)。

答案是在查询中将 Geography 转换为 Geometry。以下查询有效:

results = session.query(Store.id).filter(func.ST_Within(cast(Store.location, Geometry), func.ST_GeomFromEWKT('SRID=4326;POLYGON((150 -33, 152 -33, 152 -31, 150 -31, 150 -33))')))

关于python - Geoalchemy2 和 ST_Within - 点和多边形之间的类型不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42106271/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com