MySQL GEOMETRY如何查询点表中的点分别属于面表中的哪个多边形
操作步骤及实现代码
首先明确表结构假设,你可以替换为实际业务中的表名、字段名:
- 点数据表:
point_tbl,包含点唯一标识字段point_id、存储GEOMETRY类型点数据的字段point_geom - 多边形数据表:
polygon_tbl,包含多边形唯一标识字段poly_id、存储GEOMETRY类型多边形数据的字段poly_geom
核心查询语句
使用MySQL内置的空间函数ST_Contains()即可实现需求,该函数判断第一个几何参数是否完全包含第二个几何参数,匹配时返回1,不匹配返回0:
SELECT p.point_id, poly.poly_id AS belong_polygon_id -- 可在此处追加需要返回的点、多边形其他属性字段 FROM point_tbl p LEFT JOIN polygon_tbl poly ON ST_Contains(poly.poly_geom, p.point_geom)
优化及注意事项
- 数据量较大时一定要创建空间索引提升查询效率,建索引语句如下:
-- 给点表加空间索引 CREATE SPATIAL INDEX idx_point_geom ON point_tbl(point_geom); -- 给多边形表加空间索引 CREATE SPATIAL INDEX idx_poly_geom ON polygon_tbl(poly_geom); - 确保两张表的几何数据使用同一坐标参考系(SRID),否则会出现查询结果错误甚至无法匹配的问题
- 如果存在一个点同时落在多个多边形内部的情况,上述查询会返回该点对应的多条匹配记录;如果只需要取任意一条匹配结果,可以加分组逻辑:
SELECT p.point_id, MIN(poly.poly_id) AS belong_polygon_id FROM point_tbl p LEFT JOIN polygon_tbl poly ON ST_Contains(poly.poly_geom, p.point_geom) GROUP BY p.point_id - 如果需要把落在多边形边界上的点也判定为属于该多边形,可以额外搭配
ST_Touches(poly.poly_geom, p.point_geom)条件使用。
内容的提问来源于stack exchange,提问作者Pavel Kosov
相关产品推荐
相关产品推荐

