游乐游手机版
首页/AI教程/文章详情

全面掌握PostGIS空间数据融合的实践方法与技巧

时间:2026-05-31 14:26
在GIS桌面软件里泡久了的同学都知道,要做两个或多个地理数据的融合,直接用工具就好。ArcGIS、QGIS、SuperMap这些主流桌面端都有成熟的功能,比如QGIS的工具包里就有合并工具,随手就能用。 不过工作中总会遇到更灵活的场景——数据已经存到了PostGIS空间数据库里,用户可能随机抽几个空

在GIS桌面软件里泡久了的同学都知道,要做两个或多个地理数据的融合,直接用工具就好。ArcGIS、QGIS、SuperMap这些主流桌面端都有成熟的功能,比如QGIS的工具包里就有合并工具,随手就能用。

不过工作中总会遇到更灵活的场景——数据已经存到了PostGIS空间数据库里,用户可能随机抽几个空间数据要动态融合,这时候总不能每次都去手动点工具吧?用SQL查询来解决就舒服多了。比如某个需求里,需要把几个城市的空间数据融合成一份新数据供查询分析,PostGIS里常用的两个函数就是ST_Union()ST_Collect()

这两个东西乍一看差不多,但实际用起来差别不小。官网的介绍吧,说得不算特别透,所以咱们直接上实例,用实际的面数据和场景来跑一遍,看看它们到底怎么用、区别在哪。

一、ST_Union()简介

先看PostGIS里st_union的定义,有几个入参版本:

函数定义长这样:

CREATE OR REPLACE FUNCTION "public"."st_union"("geom1" "public"."geometry", "geom2" "public"."geometry")
RETURNS "public"."geometry" AS '$libdir/postgis-3', 'ST_Union'
LANGUAGE c IMMUTABLE STRICT
COST 10000

1、方法说明

跟Ja va的方法重载差不多,st_union有5个重载版本:

序号方法
1st_union(geometry, geometry)
2st_union(geometry, geometry, float8)
3st_union(_geometry)
4st_union(geometry)
5st_union(geometry, float8)

2、参数介绍

geometry是空间对象,float8表示数据精度。注意:st_union运算后的结果是合并输入几何体,并且会消除重叠部分,输出可能是原子几何、多重几何或几何集合。关键点就是合并并消除重叠

二、ST_Collect()简介

再看st_collect的定义:

函数定义SQL:

CREATE OR REPLACE FUNCTION "public"."st_collect"("geom1" "public"."geometry", "geom2" "public"."geometry")
RETURNS "public"."geometry" AS '$libdir/postgis-3', 'LWGEOM_collect'
LANGUAGE c IMMUTABLE
COST 50

1、方法说明

序号函数说明
1geometry ST_Collect(geometry g1, geometry g2);接受两个输入几何
2geometry ST_Collect(geometry[] g1_array);接受几何图形数组
3geometry ST_Collect(geometry set g1field);接受几何图形行集的聚合函数

2、参数介绍

将几何收集(聚合)到几何集合中。结果是一个多*或一个GeometryCollection,取决于输入几何的类型相同还是不同(同构或异类)。输入几何图形在集合中保持不变。注意这里的用词是聚合,跟上面的合并,概念完全不同。

3、两者区别

光从字面看,“合并”和“聚合”有点接近,但在空间运算里差别很大。一句话概括:ST_Collect只是把几何图形收集到一块,不做任何修改;ST_Union则会合并重叠部分、在交点处拆分线串,溶解边界后可能返回单个几何。说白了,st_collect不改变数据本身,st_union会改变数据的几何形态。下面实战验证。

三、实际案例实践

用面数据来试。分两种情况:空间不重叠和空间重叠,看看两个函数不同空间关系下的结果。

1、不重叠融合

用PostGIS里的城市数据,对长株潭三个城市做融合。

biz_city表数据如下:

st_union融合:

select st_asgeojson(st_union(geom)) from biz_city where city_name in ('长沙市','株洲市','湘潭市');

查询结果:

在QGIS里看:

很明显,三个城市已经完全融合,边界消失,形成了一个全新的面数据。

再看看st_collect的效果:

select st_asgeojson(st_collect(geom)) from biz_city where city_name in ('长沙市','株洲市','湘潭市');

QGIS展示结果:

虽然三个城市也合在一起了,但各自的边界还在,并没有真正融合。从geojson的type上也能看出区别。

结论:在不重叠的情况下,st_unionst_collect的结果视觉差别不大,但对数据是否改变来说,影响很大。

2、空间重叠融合

准备两份空间重叠的数据,用模拟数据来演示:

-- A 图
select ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[120.52757263183594,31.495432803134843],[120.59211730957031,31.31199502365151],[120.89012145996094,31.35950051982242],[120.74729919466666,31.483245492650792],[120.52757263183594,31.495432803134843]]]}')
-- B 图
select ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[120.74386596679688,31.487235582017444],[120.84548950195312,31.269747790889888],[121.01783752441405,31.378261512889125],[120.91827392578125,31.487821121636433],[120.74386596679688,31.487235582017444]]]}')

转成geojson在QGIS里看,这是A图:

B图:

两者叠加后的空间关系:

st_union融合:

-- ST_Union在几何形状重叠的地方对其进行几何合并,并在相交处拆分线串。溶解边界时,它可能会返回单个几何。
select ST_Union (
  ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[120.52757263183594,31.495432803134843],[120.59211730957031,31.31199502365151],[120.89012145996094,31.35950051982242],[120.52757263183594,31.495432803134843]]]}'),
  ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[120.74386596679688,31.487235582017444],[120.84548950195312,31.269747790889888],[121.01783752441405,31.378261512889125],[120.91827392578125,31.487821121636433],[120.74386596679688,31.487235582017444]]]}')
)

st_collect融合:

-- ST_Collect将几何形状聚合到一个集合中,而无需进行任何更改。
select ST_Collect (
  ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[120.52757263183594,31.495432803134843],[120.59211730957031,31.31199502365151],[120.89012145996094,31.35950051982242],[120.74729919466666,31.483245492650792],[120.52757263183594,31.495432803134843]]]}'),
  ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[120.74386596679688,31.487235582017444],[120.84548950195312,31.269747790889888],[121.01783752441405,31.378261512889125],[120.91827392578125,31.487821121636433],[120.74386596679688,31.487235582017444]]]}')
)

实验结果同样印证:st_collect对原始数据没有丝毫改变,而st_union则把重叠部分溶解了,改变了数据的边界和几何形态。

总结

到这里应该真正理解了“合并”和“聚合”的区别。在实际项目里,根据需求选对函数非常关键:如果只需要把多个几何图形拼在一起、保留各自边界,用ST_Collect;如果需要消除重叠、生成一个连续完整的图形,就用ST_Union。选错了,结果可能差得很远。

来源:https://cloud.tencent.com.cn/developer/article/2678279
上一篇团队合作培训心得体会写作指南与范文提示词 下一篇开源Turix:微信等任意App都可作为Agent技能使用
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
aiab设计实验室专注AIGC电商设计提升工作效率与学习乐趣
AI教程 · 2026-05-31

aiab设计实验室专注AIGC电商设计提升工作效率与学习乐趣

aiab设计实验室:AIGC电商设计平台与学习工具介绍 若您正在寻找一个既能提升设计效率又能助力学习进阶的AIGC平台,那么aiab设计实验室值得您花几分钟深入了解。该平台专注于电商设计场景,核心逻辑简洁明了:通过整合一系列工具与资源,将设计师从繁琐的重复性工作中解放出来,同时支持边实践边学习。 多

喵呜提示词助手 可视化编辑Midjourney提示词提升效率
AI教程 · 2026-05-31

喵呜提示词助手 可视化编辑Midjourney提示词提升效率

喵呜提示词助手产品介绍对于频繁使用Midjourney生成图像的创作者而言,提示词的管理与迭代往往比想象中更耗费时间。一个词序的微调、一个参数的增减,都可能导致画面效果截然不同。喵呜提示词助手正是针对这一痛点而设计——它将复杂的提示词拆解为可视化模块,让创作者能够像搭积木一样灵活调整每个组成部分。在

用AI生成自己的策略激发创意提升个人品牌价值
AI教程 · 2026-05-31

用AI生成自己的策略激发创意提升个人品牌价值

一、AI生成自己:三种策略助你快速实现创意 如何在人工智能浪潮中脱颖而出?借助AI自我生成技术,有效提升个人品牌价值,已成为众多创作者和专业从业者关注的焦点。随着技术迭代,AI生成内容早已不再局限于基础文档处理,而是深入创意构思核心,成为激发灵感、提升效率的得力工具。 AI生成自己的广泛应用 AI生

推荐十大最好用的AI自动生成绘画软件
AI教程 · 2026-05-31

推荐十大最好用的AI自动生成绘画软件

谈及自动在线AI绘图软件平台,丹青AI绘画网站为用户打造了一套实用的组合方案:既保留了原汁原味的Midjourney操作教程,又为入门新手贴心准备了更易上手的“积分版”MJ绘画功能。无论是输入一段文字描述,还是上传一张本地图片,都能快速生成富有想象力的画作,让AI作画这件事变得轻松简单。 原版Mid

SimplifiedIQ标题长度硬性要求的六十字符三十汉字限制
AI教程 · 2026-05-31

SimplifiedIQ标题长度硬性要求的六十字符三十汉字限制

SimplifiedIQ Assessment Solution 全面解析:功能、优势与应用场景 通俗地讲,SimplifiedIQ Assessment Solution 是一套由 SimplifiedIQ 团队开发的端到端评估平台,其核心理念是通过自动化流程将教育工作者从繁重的行政任务中解放出来