PostGIS技术问询:判断点是否在多面体内及查找最近点
嘿,针对你提出的两个PostGIS问题,我结合你的state表结构,整理了实用的解决方案,直接上代码和说明:
问题1:查找距离MultiPolygon最近的点
要找出哪个点离指定的MultiPolygon最近,核心是用ST_Distance计算点与多边形的空间距离,再通过排序筛选出最小距离的记录。
场景1:针对单个多边形找最近点
假设你有点表points_table,其中point_geom是通过ST_SetSRID(ST_MakePoint(longitude, latitude),4326)生成的点几何。如果要找离state表中gid=1的多边形最近的点,可以用这段SQL:
SELECT p.*, s.pa_name, ST_Distance(p.point_geom, s.geom) AS distance_degrees FROM points_table p, state s WHERE s.gid = 1 -- 指定目标多边形 ORDER BY distance_degrees ASC LIMIT 1;
注意:因为你的几何是4326(WGS84经纬度),
ST_Distance默认返回单位是度。如果需要米为单位的距离,可以用ST_DistanceSphere,或者先将几何转换为投影坐标系(比如3857)再计算。
场景2:给每个点匹配最近的多边形
如果要批量处理所有点,为每个点找到它最近的state多边形,可以用LATERAL关联子查询:
SELECT p.*, closest_poly.pa_name, closest_poly.distance_degrees FROM points_table p, LATERAL ( SELECT pa_name, ST_Distance(p.point_geom, geom) AS distance_degrees FROM state ORDER BY distance_degrees ASC LIMIT 1 ) AS closest_poly;
问题2:判断指定点是否在MultiPolygon内
判断点是否在多边形内,PostGIS提供了ST_Contains和ST_Within两个常用函数,两者逻辑等价,只是参数顺序不同:
ST_Contains(多边形几何, 点几何):判断多边形是否包含点ST_Within(点几何, 多边形几何):判断点是否在多边形内部
单个点判断示例
比如要判断坐标(116.397, 39.908)的点是否在gid=1的多边形内:
SELECT ST_Within( ST_SetSRID(ST_MakePoint(116.397, 39.908), 4326), s.geom ) AS is_inside FROM state s WHERE s.gid = 1;
查询结果会返回true(点在内部)或false(点在外部)。
批量点判断示例
如果要批量检查points_table中的点是否在state的多边形内,并且关联对应的多边形信息:
SELECT p.id, p.point_geom, s.pa_name, ST_Within(p.point_geom, s.geom) AS is_inside FROM points_table p LEFT JOIN state s ON ST_Within(p.point_geom, s.geom);
用LEFT JOIN可以保留所有点,即使点不在任何多边形内,对应的pa_name会是NULL。
内容的提问来源于stack exchange,提问作者Derek Lee
相关产品推荐
相关产品推荐

