You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:45:00