当提供 PostgreSQL/PostGIS 数据库中存储的多边形内的纬度和经度坐标时,为什么使用空间函数(例如 ST_Within)的 SQL 查询返回“未找到位置”而不是“找到位置”?
@app.get('/polygons/<latitude>/<longitude>')
def verify_polygon(latitude, longitude):
try:
conn = connect_db()
cur = conn.cursor()
cur.execute(f'SELECT id_0 FROM public."polygons-c3" WHERE ST_Within(ST_SetSRID(ST_MakePoint({longitude}, {latitude}), 4326), geom)')
result = cur.fetchone()
cur.close()
conn.close()
if result:
return jsonify({'status': 'Location found', 'lote': result[0]}), 200
else:
return jsonify({'status': 'Location not found'}), 404
except Exception as e:
return jsonify({'error': str(e)}), 500
我期望“找到位置”,因为我在谷歌地图上得到了一个点,该点位于这些多边形之一上
ST_MakePoint()
按顺序接受 x+y、lon+lat。
我敢打赌,您正在与直接来自 Google 地图的坐标进行比较,并且这些坐标的顺序与此相反:y+x,lat+lon。例如,如果您想看到北极附近的地方,那就
https://www.google.com/maps/@85.0,1.0,4.0z
参数对以及右键单击时显示的内容为北纬 85°、西经 1°(4.0 缩放)。要在 PostGIS 中获取该位置,您可以按相反的顺序使用坐标
ST_SetSRID(ST_MakePoint(1,85),4326)
确保您没有将纬度传递为经度,反之亦然。如果你不小心翻转了它们,上面就会变成:
ST_SetSRID(ST_MakePoint(85,1),4326)
位于斯里兰卡南部某处(西经 85°,北纬 1°)。