基于PostGIS从表中经纬度点生成凸包坐标的技术咨询
基于PostGIS从map5表生成凸包坐标的解决方案
嘿,刚好熟PostGIS的凸包生成操作,这就给你一步步讲清楚怎么弄!
首先,PostGIS里生成凸包核心靠ST_ConvexHull()函数,但得先把分散的点聚合起来,所以还要用到ST_Collect()来把多个点合并成一个几何集合。
1. 生成所有点的整体凸包
如果你的需求是把map5里所有的点生成一个全局凸包,直接用这条SQL就行:
SELECT ST_AsText(ST_ConvexHull(ST_Collect(points))) AS convex_hull_wkt FROM map5;
ST_Collect(points):把表中所有的points字段(点几何)合并成一个MULTIPOINT集合ST_ConvexHull():基于这个多点集合生成凸包,返回POLYGON类型的几何对象ST_AsText():把几何对象转换成人类可读的WKT格式,方便你查看坐标
2. 按id2分组生成凸包
看你插入数据的示例里有id2字段,推测可能需要按这个字段分组,给每组点单独生成凸包?那用分组查询就可以:
SELECT id2, ST_AsText(ST_ConvexHull(ST_Collect(points))) AS convex_hull_wkt FROM map5 GROUP BY id2;
这样每个id2对应的点组都会生成自己的凸包结果,非常适合分类生成的场景。
3. 将凸包结果存储到新表(可选)
如果需要把生成的凸包持久化存储,可以先创建一个新表,再插入数据:
-- 创建存储凸包的表,指定SRID和几何类型 CREATE TABLE map5_convex_hulls ( id2 VARCHAR(50) PRIMARY KEY, convex_hull geometry(POLYGON, 4326) ); -- 插入分组后的凸包数据 INSERT INTO map5_convex_hulls (id2, convex_hull) SELECT id2, ST_ConvexHull(ST_Collect(points)) FROM map5 GROUP BY id2;
这里特意指定了geometry(POLYGON, 4326),确保和你原数据的坐标系(WGS84,SRID=4326)一致,避免坐标系混乱。
小提醒
- 确保你的
points字段里的点都是有效的几何对象,可以用ST_IsValid(points)检查,过滤掉无效数据:SELECT * FROM map5 WHERE NOT ST_IsValid(points); - 如果表中数据量很大,给
points字段建个空间索引能大幅提升查询速度:CREATE INDEX idx_map5_points ON map5 USING GIST(points);
内容的提问来源于stack exchange,提问作者Jienan Tang




