目录
前言
一、演示数据构造
1、PostGIS空间表准备
2、测试数据准备
二、两个函数融合展示
1、ST_Collect融合
2、ST_Union融合
3、结果对比
三、面积计算
1、ST_Collect面积计算
2、ST_Union面积计算
3、结果对比
四、总结
前言
在地理空间数据库领域,PostGIS作为PostgreSQL的扩展,为地理空间数据的存储、查询和分析提供了强大的功能。对于初入PostGIS世界的新手来说,众多的地理空间函数可能会让人感到眼花缭乱,不知从何下手。而ST_Union与ST_Collect这两个函数,由于它们在功能上存在一定的相似性,常常容易被混淆。然而,它们在实际应用中又有着各自独特的作用和适用场景。因此,深入理解它们的区别并掌握正确的使用方法,对于PostGIS新手来说至关重要。
ST_Union函数的主要作用是将多个几何对象合并成一个单一的几何对象。它在处理几何数据时,会考虑几何对象之间的拓扑关系,例如相交、相邻等情况。通过ST_Union,可以将多个分散的几何形状融合在一起,形成一个更加完整和连贯的几何结构。这在许多地理空间分析场景中都非常有用,比如在进行区域合并、边界整合等操作时,ST_Union能够帮助我们得到一个统一且准确的几何结果。例如,当我们需要将多个相邻的地块合并为一个大型的开发区时,ST_Union可以将这些地块的边界进行融合,生成一个新的、完整的开发区边界。
而ST_Collect函数则侧重于将多个几何对象收集到一个几何集合中。它不会像ST_Union那样对几何对象进行融合,而是简单地将它们放在一起,形成一个包含多个几何对象的集合。在某些情况下,我们可能并不需要对几何对象进行合并,而是需要将它们作为一个整体来进行后续的操作或分析。这时,ST_Collect就显得非常方便。比如,在一个地理信息系统(GIS)项目中,我们可能需要将多个不同类型的地理要素(如道路、河流、建筑物等)收集到一起,以便进行统一的可视化展示或空间查询。使用ST_Collect,我们可以轻松地将这些要素组织成一个集合,然后在地图上进行绘制或进行空间关系的查询。
尽管ST_Union和ST_Collect在功能上都与几何对象的组合有关,但它们在处理方式和结果上存在明显的差异。ST_Union会改变几何对象的拓扑结构,生成一个新的几何对象;而ST_Collect则保持几何对象的原始形态,只是将它们组合到一个集合中。这种差异使得它们在不同的应用场景中各有优势。在实际使用过程中,我们需要根据具体的分析需求和数据特点来选择合适的函数。
对于PostGIS新手来说,理解ST_Union与ST_Collect的区别可能需要一些时间和实践。但只要我们通过具体的使用示例,逐步体会它们在不同场景下的应用效果,就能够更好地掌握这两个函数的精髓。在接下来的内容中,我们将通过一些简单易懂的示例,详细展示ST_Union与ST_Collect的使用方法,以及它们在实际地理空间数据处理中的具体应用。希望通过这些示例,能够帮助PostGIS新手更好地理解和区分这两个函数,从而在地理空间分析的道路上迈出更加坚实的步伐。
一、演示数据构造
为了在后续的例子中对ST_Union和ST_Collect这两个函数进行具体的介绍。因此首先需要设计一张空间表来存储相关数据。这里我们以两个存在重叠面的场景为例来进行讲解。
1、PostGIS空间表准备
首先创建一张用于测试空间面数据的空间表,表结构如下:
CREATE TABLE china_regions ( id SERIAL PRIMARY KEY, region_name VARCHAR(50), geom GEOMETRY(POLYGON, 4326) );为了演示方便,这里暂不设计复杂的空间字段,geom空间属性列中专门用于保存Polygon面数据。
2、测试数据准备
接下来准备两个存在重叠的区域的边界坐标,然后使用标准SQL插入到PostGIS空间数据库中。插入的标准SQL语句如下:
-- 插入区域一(简化版) INSERT INTO china_regions (region_name, geom) VALUES ( '模拟区域一', ST_GeomFromText( 'POLYGON((112.879114 28.18866, 112.882333 28.181397, 112.890959 28.186125, 112.888813 28.192518, 112.881432 28.190967, 112.879114 28.18866))', 4326 ) ); -- 插入区域二(简化版) INSERT INTO china_regions (region_name, geom) VALUES ( '模拟区域二', ST_GeomFromText( 'POLYGON((112.886152 28.186882, 112.89053 28.181473, 112.899714 28.186428, 112.898769 28.193047, 112.886367 28.193766, 112.886152 28.186882))', 4326 ) );为了验证是否成功将这两条SQL插入到空间数据库中,需要注意的是,在插入数据时,首尾的坐标一定要闭合,否则会报错。数据新增成功后可以使用下面SQL来进行查询验证:
select t.*,st_asgeojson(t.geom) from china_regions t;为了方便在客户端软件中看到空间面数据,我们使用pgAdmin4来进行空间数据的查看。
从上图中可以明显得看到,两个面的中间有一块明显重叠的区域。到此,空间物理表及两个模拟面的数据基本准备完毕,接下来可以进入正式的两个函数对比阶段。
二、两个函数融合展示
本节将使用实例对两个函数的融合展示进行深入介绍,通过详细的介绍。让大家了解这两个函数的具体区别,让大家在实际工作中可以有针对性的选择。
1、ST_Collect融合
首先来介绍ST_Collect,ST_Collect就像给你的地理数据准备的一个"收集盒"或"文件夹"。它把多个地理对象放在一起,但不改变它们本身。每个对象还是独立存在的,只是现在它们在一个容器里。st_collect的特点如下:
✅只收集,不改变:原封不动地把数据放一起
✅保留所有:重复的部分、重叠的区域都保留
✅速度快:因为没有复杂的计算
✅适合显示和传输:把所有数据打包,方便一次性显示或导出
下面来看看它的使用查询SQL,下面是对它的查询结果进行可视化:
select st_collect(geom) from china_regions;ST_Collect的 实际应用场景:
批量导出数据:把所有选定区域的地理数据打包
一次性显示:在地图上同时显示多个独立要素
中间步骤:先收集数据,后续再做其他处理
2、ST_Union融合
下面来说说st_union这个函数。ST_Union是一个真正的"融合器"。它不仅把数据放在一起,还会进行智能融合:消除重复边界、合并重叠区域。想象一下把几个相邻的土地合并成一块大土地。ST_Union的核心特点:
✅融合计算:进行空间计算,合并几何
✅消除重叠:重叠的部分只计算一次
✅创建新形状:可能生成全新的几何
✅计算精确:适合面积计算等需要精确性的场景
st_union的查询sql如下:
select st_union(geom) from china_regions;st_union的实际应用场景:
计算总面积:多个区域有重叠时,避免重复计算
创建连续区域:把相邻的小区域合并成大区域
数据清理:消除小缝隙和重叠
3、结果对比
下面针对数据融合方面对这两个函数进行一个简单的对比:
| 对比点 | ST_Collect | ST_Union |
|---|---|---|
| 主要目的 | 收集、打包 | 融合、合并 |
| 处理方式 | 简单收集 | 复杂计算 |
| 速度 | ⚡快(无计算) | 🐢较慢(需计算) |
| 内存使用 | 较少 | 较多 |
| 重叠处理 | 保留所有重叠 | 消除重叠 |
| 结果类型 | 集合(如MULTIPOLYGON) | 单个几何或简化集合 |
| 适合场景 | 显示、导出、中间步骤 | 分析、计算、数据清理 |
三、面积计算
对数据融合展示进行介绍之后,接下来就对两个函数的面积计算来进行一个对比。通过这个详细的对比让大家对两个函数的区别有更深入的了解。
1、ST_Collect面积计算
首先来看看st_collect的方式对两个面进行面积计算,得到的结果是多少?查询SQL如下:
-- 使用ST_Collect简单收集两个区域 SELECT ST_AsText(ST_Collect(geom)) as collected_geometry, ST_GeometryType(ST_Collect(geom)) as geometry_type, ST_Area(ST_Collect(geom)::geography) as total_area_sqkm_collect FROM china_regions;当程序执行完成后,我们贴出其计算的面积如下:
ST_MultiPolygon 2218914.0712889135
需要注意的是,这里计算出来的面积单位是平方米。
2、ST_Union面积计算
与前面的方式一样,接下来我们使用st_union来介绍其对应的面积计算,处理SQL如下:
-- 使用ST_Union合并两个区域 SELECT ST_AsText(ST_Union(geom)) as unioned_geometry, ST_GeometryType(ST_Union(geom)) as geometry_type, ST_Area(ST_Union(geom)::geography) as total_area_sqkm_union FROM china_regions;此时查询出来的结果如下:
ST_Polygon 1937843.3719904348
可以很明显的看到,这两个函数计算出来的面积完全是不一样的。而st_union计算的面积明显比另外一个函数小。
3、结果对比
为了验证两者的区别,我们使用以下SQL来进行两者的差别对比实验。可以使用以下SQL来进行重叠面积计算,处理SQL如下:
-- 对比两种方法的面积差异(证明重叠部分处理不同) WITH area_calc AS ( SELECT ST_Area(ST_Collect(geom)::geography) as area_collect, ST_Area(ST_Union(geom)::geography) as area_union, ST_Area(ST_Intersection( (SELECT geom FROM china_regions WHERE region_name = '模拟区域一'), (SELECT geom FROM china_regions WHERE region_name = '模拟区域二') )::geography) as overlap_area FROM china_regions ) SELECT area_collect, area_union, overlap_area, area_collect - area_union as area_difference, overlap_area * 100 / area_union as overlap_percentage FROM area_calc;执行以上SQL后可以看到如下结果:
| 方法 | 结果类型 | 面积计算 | 重叠处理 |
|---|---|---|---|
| ST_Collect | MULTIPOLYGON | 两个区域面积简单相加 (重叠部分计算两次) | 保留原始边界 不处理重叠 |
| ST_Union | POLYGON(或简化MULTIPOLYGON) | 两个区域合并后的总面积 (重叠部分只计算一次) | 融合边界 消除重叠 |
四、总结
以上就是本文的主要内容,本文通过详细的例子和SQL实战对ST_Union与ST_Collect这两个函数进行了详细的介绍。通过对这两个函数在融合展示和面积计算这两个方面的对比和介绍。让大家对这两个函数有了基本的认识,通过本文,大家可以根据自己的实际情况选择对应的函数进行调用。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。