PostgreSQL

关注公众号 jb51net

关闭
首页 > 数据库 > PostgreSQL > PostGIS ST_Union与ST_Collect

PostGIS中ST_Union与ST_Collect的区别与使用详解

作者:夜郎king

这篇文章主要介绍了PostGIS中ST_Union与ST_Collect的区别与使用,对于初入PostGIS世界的新手来说,众多的地理空间函数可能会让人感到眼花缭乱,不知从何下手,而ST_Union与ST_Collect这两个函数,由于它们在功能上存在一定的相似性,常常容易被混淆,需要的朋友可以参考下

前言

在地理空间数据库领域,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_CollectST_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_CollectMULTIPOLYGON两个区域面积简单相加
(重叠部分计算两次)
保留原始边界
不处理重叠
ST_UnionPOLYGON(或简化MULTIPOLYGON)两个区域合并后的总面积
(重叠部分只计算一次)
融合边界
消除重叠

四、总结

以上就是本文的主要内容,本文通过详细的例子和SQL实战对ST_Union与ST_Collect这两个函数进行了详细的介绍。通过对这两个函数在融合展示和面积计算这两个方面的对比和介绍。让大家对这两个函数有了基本的认识,通过本文,大家可以根据自己的实际情况选择对应的函数进行调用。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。

以上就是PostGIS中ST_Union与ST_Collect的区别与使用详解的详细内容,更多关于PostGIS ST_Union与ST_Collect的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文