You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于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

火山引擎 最新活动