PostGIS中ST_Union與ST_Collect的區(qū)別與使用詳解
前言
在地理空間數(shù)據(jù)庫(kù)領(lǐng)域,PostGIS作為PostgreSQL的擴(kuò)展,為地理空間數(shù)據(jù)的存儲(chǔ)、查詢(xún)和分析提供了強(qiáng)大的功能。對(duì)于初入PostGIS世界的新手來(lái)說(shuō),眾多的地理空間函數(shù)可能會(huì)讓人感到眼花繚亂,不知從何下手。而ST_Union與ST_Collect這兩個(gè)函數(shù),由于它們?cè)诠δ苌洗嬖谝欢ǖ南嗨菩裕3H菀妆换煜?。然而,它們?cè)趯?shí)際應(yīng)用中又有著各自獨(dú)特的作用和適用場(chǎng)景。因此,深入理解它們的區(qū)別并掌握正確的使用方法,對(duì)于PostGIS新手來(lái)說(shuō)至關(guān)重要。

ST_Union函數(shù)的主要作用是將多個(gè)幾何對(duì)象合并成一個(gè)單一的幾何對(duì)象。它在處理幾何數(shù)據(jù)時(shí),會(huì)考慮幾何對(duì)象之間的拓?fù)潢P(guān)系,例如相交、相鄰等情況。通過(guò)ST_Union,可以將多個(gè)分散的幾何形狀融合在一起,形成一個(gè)更加完整和連貫的幾何結(jié)構(gòu)。這在許多地理空間分析場(chǎng)景中都非常有用,比如在進(jìn)行區(qū)域合并、邊界整合等操作時(shí),ST_Union能夠幫助我們得到一個(gè)統(tǒng)一且準(zhǔn)確的幾何結(jié)果。例如,當(dāng)我們需要將多個(gè)相鄰的地塊合并為一個(gè)大型的開(kāi)發(fā)區(qū)時(shí),ST_Union可以將這些地塊的邊界進(jìn)行融合,生成一個(gè)新的、完整的開(kāi)發(fā)區(qū)邊界。
而ST_Collect函數(shù)則側(cè)重于將多個(gè)幾何對(duì)象收集到一個(gè)幾何集合中。它不會(huì)像ST_Union那樣對(duì)幾何對(duì)象進(jìn)行融合,而是簡(jiǎn)單地將它們放在一起,形成一個(gè)包含多個(gè)幾何對(duì)象的集合。在某些情況下,我們可能并不需要對(duì)幾何對(duì)象進(jìn)行合并,而是需要將它們作為一個(gè)整體來(lái)進(jìn)行后續(xù)的操作或分析。這時(shí),ST_Collect就顯得非常方便。比如,在一個(gè)地理信息系統(tǒng)(GIS)項(xiàng)目中,我們可能需要將多個(gè)不同類(lèi)型的地理要素(如道路、河流、建筑物等)收集到一起,以便進(jìn)行統(tǒng)一的可視化展示或空間查詢(xún)。使用ST_Collect,我們可以輕松地將這些要素組織成一個(gè)集合,然后在地圖上進(jìn)行繪制或進(jìn)行空間關(guān)系的查詢(xún)。
盡管ST_Union和ST_Collect在功能上都與幾何對(duì)象的組合有關(guān),但它們?cè)谔幚矸绞胶徒Y(jié)果上存在明顯的差異。ST_Union會(huì)改變幾何對(duì)象的拓?fù)浣Y(jié)構(gòu),生成一個(gè)新的幾何對(duì)象;而ST_Collect則保持幾何對(duì)象的原始形態(tài),只是將它們組合到一個(gè)集合中。這種差異使得它們?cè)诓煌膽?yīng)用場(chǎng)景中各有優(yōu)勢(shì)。在實(shí)際使用過(guò)程中,我們需要根據(jù)具體的分析需求和數(shù)據(jù)特點(diǎn)來(lái)選擇合適的函數(shù)。
對(duì)于PostGIS新手來(lái)說(shuō),理解ST_Union與ST_Collect的區(qū)別可能需要一些時(shí)間和實(shí)踐。但只要我們通過(guò)具體的使用示例,逐步體會(huì)它們?cè)诓煌瑘?chǎng)景下的應(yīng)用效果,就能夠更好地掌握這兩個(gè)函數(shù)的精髓。在接下來(lái)的內(nèi)容中,我們將通過(guò)一些簡(jiǎn)單易懂的示例,詳細(xì)展示ST_Union與ST_Collect的使用方法,以及它們?cè)趯?shí)際地理空間數(shù)據(jù)處理中的具體應(yīng)用。希望通過(guò)這些示例,能夠幫助PostGIS新手更好地理解和區(qū)分這兩個(gè)函數(shù),從而在地理空間分析的道路上邁出更加堅(jiān)實(shí)的步伐。
一、演示數(shù)據(jù)構(gòu)造
為了在后續(xù)的例子中對(duì)ST_Union和ST_Collect這兩個(gè)函數(shù)進(jìn)行具體的介紹。因此首先需要設(shè)計(jì)一張空間表來(lái)存儲(chǔ)相關(guān)數(shù)據(jù)。這里我們以?xún)蓚€(gè)存在重疊面的場(chǎng)景為例來(lái)進(jìn)行講解。
1、PostGIS空間表準(zhǔn)備
首先創(chuàng)建一張用于測(cè)試空間面數(shù)據(jù)的空間表,表結(jié)構(gòu)如下:
CREATE TABLE china_regions (
id SERIAL PRIMARY KEY,
region_name VARCHAR(50),
geom GEOMETRY(POLYGON, 4326)
);為了演示方便,這里暫不設(shè)計(jì)復(fù)雜的空間字段,geom空間屬性列中專(zhuān)門(mén)用于保存Polygon面數(shù)據(jù)。
2、測(cè)試數(shù)據(jù)準(zhǔn)備
接下來(lái)準(zhǔn)備兩個(gè)存在重疊的區(qū)域的邊界坐標(biāo),然后使用標(biāo)準(zhǔn)SQL插入到PostGIS空間數(shù)據(jù)庫(kù)中。插入的標(biāo)準(zhǔn)SQL語(yǔ)句如下:
-- 插入?yún)^(qū)域一(簡(jiǎn)化版)
INSERT INTO china_regions (region_name, geom) VALUES (
'模擬區(qū)域一',
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
)
);
-- 插入?yún)^(qū)域二(簡(jiǎn)化版)
INSERT INTO china_regions (region_name, geom) VALUES (
'模擬區(qū)域二',
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
)
);為了驗(yàn)證是否成功將這兩條SQL插入到空間數(shù)據(jù)庫(kù)中,需要注意的是,在插入數(shù)據(jù)時(shí),首尾的坐標(biāo)一定要閉合,否則會(huì)報(bào)錯(cuò)。數(shù)據(jù)新增成功后可以使用下面SQL來(lái)進(jìn)行查詢(xún)驗(yàn)證:
select t.*,st_asgeojson(t.geom) from china_regions t;
為了方便在客戶(hù)端軟件中看到空間面數(shù)據(jù),我們使用pgAdmin4來(lái)進(jìn)行空間數(shù)據(jù)的查看。

從上圖中可以明顯得看到,兩個(gè)面的中間有一塊明顯重疊的區(qū)域。到此,空間物理表及兩個(gè)模擬面的數(shù)據(jù)基本準(zhǔn)備完畢,接下來(lái)可以進(jìn)入正式的兩個(gè)函數(shù)對(duì)比階段。
二、兩個(gè)函數(shù)融合展示
本節(jié)將使用實(shí)例對(duì)兩個(gè)函數(shù)的融合展示進(jìn)行深入介紹,通過(guò)詳細(xì)的介紹。讓大家了解這兩個(gè)函數(shù)的具體區(qū)別,讓大家在實(shí)際工作中可以有針對(duì)性的選擇。
1、ST_Collect融合
首先來(lái)介紹ST_Collect,ST_Collect就像給你的地理數(shù)據(jù)準(zhǔn)備的一個(gè)"收集盒"或"文件夾"。它把多個(gè)地理對(duì)象放在一起,但不改變它們本身。每個(gè)對(duì)象還是獨(dú)立存在的,只是現(xiàn)在它們?cè)谝粋€(gè)容器里。st_collect的特點(diǎn)如下:
- 只收集,不改變:原封不動(dòng)地把數(shù)據(jù)放一起
- 保留所有:重復(fù)的部分、重疊的區(qū)域都保留
- 速度快:因?yàn)闆](méi)有復(fù)雜的計(jì)算
- 適合顯示和傳輸:把所有數(shù)據(jù)打包,方便一次性顯示或?qū)С?/li>
下面來(lái)看看它的使用查詢(xún)SQL,下面是對(duì)它的查詢(xún)結(jié)果進(jìn)行可視化:
select st_collect(geom) from china_regions;

ST_Collect的實(shí)際應(yīng)用場(chǎng)景:
- 批量導(dǎo)出數(shù)據(jù):把所有選定區(qū)域的地理數(shù)據(jù)打包
- 一次性顯示:在地圖上同時(shí)顯示多個(gè)獨(dú)立要素
- 中間步驟:先收集數(shù)據(jù),后續(xù)再做其他處理
2、ST_Union融合
下面來(lái)說(shuō)說(shuō)st_union這個(gè)函數(shù)。ST_Union是一個(gè)真正的"融合器"。它不僅把數(shù)據(jù)放在一起,還會(huì)進(jìn)行智能融合:消除重復(fù)邊界、合并重疊區(qū)域。想象一下把幾個(gè)相鄰的土地合并成一塊大土地。ST_Union的核心特點(diǎn):
- 融合計(jì)算:進(jìn)行空間計(jì)算,合并幾何
- 消除重疊:重疊的部分只計(jì)算一次
- 創(chuàng)建新形狀:可能生成全新的幾何
- 計(jì)算精確:適合面積計(jì)算等需要精確性的場(chǎng)景
st_union的查詢(xún)sql如下:
select st_union(geom) from china_regions;

st_union的實(shí)際應(yīng)用場(chǎng)景:
- 計(jì)算總面積:多個(gè)區(qū)域有重疊時(shí),避免重復(fù)計(jì)算
- 創(chuàng)建連續(xù)區(qū)域:把相鄰的小區(qū)域合并成大區(qū)域
- 數(shù)據(jù)清理:消除小縫隙和重疊
3、結(jié)果對(duì)比
下面針對(duì)數(shù)據(jù)融合方面對(duì)這兩個(gè)函數(shù)進(jìn)行一個(gè)簡(jiǎn)單的對(duì)比:
| 對(duì)比點(diǎn) | ST_Collect | ST_Union |
|---|---|---|
| 主要目的 | 收集、打包 | 融合、合并 |
| 處理方式 | 簡(jiǎn)單收集 | 復(fù)雜計(jì)算 |
| 速度 | ?快(無(wú)計(jì)算) | ??較慢(需計(jì)算) |
| 內(nèi)存使用 | 較少 | 較多 |
| 重疊處理 | 保留所有重疊 | 消除重疊 |
| 結(jié)果類(lèi)型 | 集合(如MULTIPOLYGON) | 單個(gè)幾何或簡(jiǎn)化集合 |
| 適合場(chǎng)景 | 顯示、導(dǎo)出、中間步驟 | 分析、計(jì)算、數(shù)據(jù)清理 |
三、面積計(jì)算
對(duì)數(shù)據(jù)融合展示進(jìn)行介紹之后,接下來(lái)就對(duì)兩個(gè)函數(shù)的面積計(jì)算來(lái)進(jìn)行一個(gè)對(duì)比。通過(guò)這個(gè)詳細(xì)的對(duì)比讓大家對(duì)兩個(gè)函數(shù)的區(qū)別有更深入的了解。
1、ST_Collect面積計(jì)算
首先來(lái)看看st_collect的方式對(duì)兩個(gè)面進(jìn)行面積計(jì)算,得到的結(jié)果是多少?查詢(xún)SQL如下:
-- 使用ST_Collect簡(jiǎn)單收集兩個(gè)區(qū)域
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;當(dāng)程序執(zhí)行完成后,我們貼出其計(jì)算的面積如下:
ST_MultiPolygon 2218914.0712889135
需要注意的是,這里計(jì)算出來(lái)的面積單位是平方米。
2、ST_Union面積計(jì)算
與前面的方式一樣,接下來(lái)我們使用st_union來(lái)介紹其對(duì)應(yīng)的面積計(jì)算,處理SQL如下:
-- 使用ST_Union合并兩個(gè)區(qū)域
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;此時(shí)查詢(xún)出來(lái)的結(jié)果如下:
ST_Polygon 1937843.3719904348
可以很明顯的看到,這兩個(gè)函數(shù)計(jì)算出來(lái)的面積完全是不一樣的。而st_union計(jì)算的面積明顯比另外一個(gè)函數(shù)小。
3、結(jié)果對(duì)比
為了驗(yàn)證兩者的區(qū)別,我們使用以下SQL來(lái)進(jìn)行兩者的差別對(duì)比實(shí)驗(yàn)??梢允褂靡韵耂QL來(lái)進(jìn)行重疊面積計(jì)算,處理SQL如下:
-- 對(duì)比兩種方法的面積差異(證明重疊部分處理不同)
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 = '模擬區(qū)域一'),
(SELECT geom FROM china_regions WHERE region_name = '模擬區(qū)域二')
)::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;執(zhí)行以上SQL后可以看到如下結(jié)果:

| 方法 | 結(jié)果類(lèi)型 | 面積計(jì)算 | 重疊處理 |
|---|---|---|---|
| ST_Collect | MULTIPOLYGON | 兩個(gè)區(qū)域面積簡(jiǎn)單相加 (重疊部分計(jì)算兩次) | 保留原始邊界 不處理重疊 |
| ST_Union | POLYGON(或簡(jiǎn)化MULTIPOLYGON) | 兩個(gè)區(qū)域合并后的總面積 (重疊部分只計(jì)算一次) | 融合邊界 消除重疊 |
四、總結(jié)
以上就是本文的主要內(nèi)容,本文通過(guò)詳細(xì)的例子和SQL實(shí)戰(zhàn)對(duì)ST_Union與ST_Collect這兩個(gè)函數(shù)進(jìn)行了詳細(xì)的介紹。通過(guò)對(duì)這兩個(gè)函數(shù)在融合展示和面積計(jì)算這兩個(gè)方面的對(duì)比和介紹。讓大家對(duì)這兩個(gè)函數(shù)有了基本的認(rèn)識(shí),通過(guò)本文,大家可以根據(jù)自己的實(shí)際情況選擇對(duì)應(yīng)的函數(shù)進(jìn)行調(diào)用。行文倉(cāng)促,定有不足之處,歡迎各位朋友在評(píng)論區(qū)批評(píng)指正,不勝感激。
以上就是PostGIS中ST_Union與ST_Collect的區(qū)別與使用詳解的詳細(xì)內(nèi)容,更多關(guān)于PostGIS ST_Union與ST_Collect的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
postgresql 如何查看pg_wal目錄下xlog文件總大小
這篇文章主要介紹了postgresql 如何查看pg_wal目錄下xlog文件總大小的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
PostgreSQL圖(graph)的遞歸查詢(xún)實(shí)例
這篇文章主要給大家介紹了關(guān)于PostgreSQL圖(graph)的遞歸查詢(xún)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用PostgreSQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
sqoop 實(shí)現(xiàn)將postgresql表導(dǎo)入hive表
這篇文章主要介紹了sqoop 實(shí)現(xiàn)將postgresql表導(dǎo)入hive表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
postgresql如何查詢(xún)重復(fù)計(jì)數(shù)及去重查詢(xún)
這篇文章主要介紹了postgresql如何查詢(xún)重復(fù)計(jì)數(shù)及去重查詢(xún)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
PostgreSQL遷移的幾種實(shí)現(xiàn)方式
本文主要介紹了PostgreSQL遷移的幾種實(shí)現(xiàn)方式,包括邏輯備份、物理復(fù)制、文件系統(tǒng)快照及邏輯復(fù)制這四種方式,具有一定的參考價(jià)值,感興趣的可以了解一下2025-06-06
在 PostgreSQL中解決圖片二進(jìn)制數(shù)據(jù)由于bytea_output參數(shù)問(wèn)題導(dǎo)致顯示不正常的問(wèn)題
無(wú)論 bytea_output 參數(shù)設(shè)置為 hex 還是 escape,你都可以通過(guò) C# 訪(fǎng)問(wèn) PostgreSQL 數(shù)據(jù)庫(kù),并且正常獲取并顯示圖片,本篇隨筆介紹這個(gè)問(wèn)題的處理過(guò)程,感興趣的朋友跟隨小編一起看看吧2024-03-03

