我想运行一个查询,它返回一个矩形内的每个点,其中的点和矩形基于真实世界的经度和纬度。
这是失败的查询:
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) 函数 st_within(geography, geometry) 不存在第 3 行: WHERE ST_Within(store.location, ST_GeomFromEWKT('SRID=4326;P... ^ 提示:没有函数匹配给定名称和参数类型。您可能需要添加显式类型转换。[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'] [参数:{'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, Geoography)]。
这是我对位置列的 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