ST_WITHIN 函数在 POSTGIS 中不起作用

问题描述 投票:0回答:1

当提供 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

我期望“找到位置”,因为我在谷歌地图上得到了一个点,该点位于这些多边形之一上

python postgresql flask postgis qgis
1个回答
0
投票

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°)。

© www.soinside.com 2019 - 2024. All rights reserved.