PostGIS中ST_Union與ST_Collect的區(qū)別與使用詳解
前言
在地理空間數據庫領域,PostGIS作為PostgreSQL的擴展,為地理空間數據的存儲、查詢和分析提供了強大的功能。對于初入PostGIS世界的新手來說,眾多的地理空間函數可能會讓人感到眼花繚亂,不知從何下手。而ST_Union與ST_Collect這兩個函數,由于它們在功能上存在一定的相似性,常常容易被混淆。然而,它們在實際應用中又有著各自獨特的作用和適用場景。因此,深入理解它們的區(qū)別并掌握正確的使用方法,對于PostGIS新手來說至關重要。

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

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

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

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

| 方法 | 結果類型 | 面積計算 | 重疊處理 |
|---|---|---|---|
| ST_Collect | MULTIPOLYGON | 兩個區(qū)域面積簡單相加 (重疊部分計算兩次) | 保留原始邊界 不處理重疊 |
| ST_Union | POLYGON(或簡化MULTIPOLYGON) | 兩個區(qū)域合并后的總面積 (重疊部分只計算一次) | 融合邊界 消除重疊 |
四、總結
以上就是本文的主要內容,本文通過詳細的例子和SQL實戰(zhàn)對ST_Union與ST_Collect這兩個函數進行了詳細的介紹。通過對這兩個函數在融合展示和面積計算這兩個方面的對比和介紹。讓大家對這兩個函數有了基本的認識,通過本文,大家可以根據自己的實際情況選擇對應的函數進行調用。行文倉促,定有不足之處,歡迎各位朋友在評論區(qū)批評指正,不勝感激。
以上就是PostGIS中ST_Union與ST_Collect的區(qū)別與使用詳解的詳細內容,更多關于PostGIS ST_Union與ST_Collect的資料請關注腳本之家其它相關文章!
相關文章
PostgreSQL:string_agg?多列值聚合成一列的操作示例
PostgreSQL中的STRING_AGG()函數是一個聚合函數,用于連接字符串列表并在字符串之間放置分隔符,這篇文章主要介紹了PostgreSQL:string_agg多列值聚合成一列,需要的朋友可以參考下2023-08-08
PostgreSQL pg_ctl start啟動超時實例分析
這篇文章主要給大家介紹了關于PostgreSQL pg_ctl start啟動超時的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-01-01

