当前位置: 代码网 > it编程>编程语言>Java > PostGIS中ST_Union与ST_Collect的区别与使用详解

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

2026年01月02日 Java 我要评论
前言在地理空间数据库领域,postgis作为postgresql的扩展,为地理空间数据的存储、查询和分析提供了强大的功能。对于初入postgis世界的新手来说,众多的地理空间函数可能会让人感到眼花缭乱

前言

在地理空间数据库领域,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的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com