2. 簡介

2.1. 什麼是空間資料庫?

PostGIS 是一個空間資料庫。Oracle Spatial 和 SQL Server (2008 和更新版本) 也是空間資料庫。不過是什麼意思?是什麼讓一個普通資料庫成為空間資料庫?

簡短的回答是……

空間資料庫儲存和處理空間物件,就像資料庫中的任何其他物件一樣。

以下簡要介紹空間資料庫的演變,然後檢閱與資料庫相關的三個面向,即資料型態、索引和函數。

  1. 空間資料類型是指點、線和多邊形等形狀;

  2. 多維度空間索引用於有效率地處理空間運算;

  3. 空間函數會以 SQL 提出,用於查詢空間屬性和關係。

空間資料型態、索引和函數加起來,提供了一個彈性的架構,用於最佳化效能和分析。

2.1.1. 在最開始

在傳統的第一代 GIS 實作中,所有空間資料都儲存在平面檔案,需要特別的 GIS 軟體來解讀和處理資料。這些第一代的管理系統旨在滿足使用者的需求,使用者組織領域內的所有所需資料都在其中。它們是專有、獨立的系統,特別建置是用於處理空間資料。

第二代的空間系統將部分資料儲存在關係資料庫(通常是「屬性」或非空間部分),但仍然缺少直接整合帶來的彈性。

當人們開始將空間特徵視為第一類資料庫物件時,真正的空間資料庫才誕生。

空間資料庫將空間資料與關係資料庫完全整合。系統定位會從以 GIS 為中心轉變為以資料庫為中心。

_images/beginning.png

注意

空間資料庫管理系統可以用在地理世界以外的應用程式。空間資料庫用於管理與人體解剖、大規模整合電路、分子結構和電磁場等相關的資料。

2.1.2. 空間資料類型

一般的資料庫包含**文字、數字和日期**,而時空資料庫會加入附加的(時空)類型來呈現**地理屬性**。這些時空資料類型會抽象化並封裝**界線與尺寸**等時空架構。在許多情況下,時空資料類型可以簡單地理解為形狀。

_images/hierarchy.png

時空資料類型依據類型階層組織,每種類型都繼承其父類型的結構(屬性)與行為(方法或函數)。

2.1.3. 時空索引與邊界框

一般的資料庫提供**索引**以快速且隨機存取資料的子集,對於標準類型(數字、文字、日期)的編製索引通常使用B 樹索引。

B 樹使用自然排序基準將資料分割,以建立階層式樹狀結構。數字、文字和日期的自然排序基準很簡單,每個值都小於、大於或等於其他值。

但由於多邊形可能會重疊、彼此包含,並排列在二維(或更高)空間中,因此無法使用 B 樹有效為其編製索引。真正的時空資料庫會提供**時空索引**,用來回答「特定邊界框內有哪些物件?」這個問題。

**邊界框**是指可以容納指定特徵的最小矩形,且平行於座標軸。

_images/boundingbox.png

之所以使用邊界框,是因為對多邊形來說,「A 是否位於 B 內?」這個問題運算量很大,但對矩形來說非常快。即使最複雜的多邊形和線串,也可以用一個簡單的邊界框表示。

索引必須執行得夠快才有用。因此時空索引不像 B 樹一樣提供精確的結果,而是提供近似結果。「這個多邊形內有哪些線段?」這個問題會被時空索引解譯為「有哪些線段的邊界框位於這個多邊形的邊界框內?」

各種資料庫實作的實際時空索引差異很大,最常見的實作是R 樹四叉樹(PostGIS 使用),但也有格點索引GeoHash 索引在其他時空資料庫實作中。

2.1.4. 時空函數

一般的資料庫會提供**函數**來處理查詢期間的資料,例如連結文字、對文字執行雜湊作業、對數字進行數學運算,以及從日期中萃取資訊。

空間資料庫提供一組用於分析幾何組件、判斷空間關係和處理幾何的完整功能。這些空間資料庫做為任何空間專案的基礎架構。

所有空間功能主要可分為下列 5 種類別之一

  1. 轉換:在幾何和外部資料格式之間進行轉換的功能。

  2. 管理管理空間資料表和 PostGIS 管理資訊的功能。

  3. 擷取擷取幾何屬性和測量值的功能。

  4. 比較:針對兩個幾何的空間關係進行比較的功能。

  5. 產生:從其他幾何產生新幾何的功能。

可能的函數清單非常龐大,但是 OGC SFSQL 定義了一組常見的功能,PostGIS 也已實作(和其他有用的附加功能)這些功能。

2.2. 什麼是 PostGIS?

PostGIS 將 PostgreSQL 資料庫管理系統轉換成空間資料庫,方式是加入支援三項功能:空間類型、空間索引和空間功能。因為 PostGIS 建立在 PostgreSQL 之上,因此 PostGIS 自動繼承重要的「企業」功能以及供實作用的開放標準。

2.2.1. PostgreSQL 是什麼?

PostgreSQL 是強大的關聯式資料庫管理系統 (RDBMS)。此系統使用類 BSD 授權釋出,因此是免費且開放原始碼的軟體。與其他許多開放原始碼程式一樣,PostgreSQL 不受任何單一公司控制,但有 全球開發人員 和公司持續開發。

PostgreSQL 從一開始就針對型別延伸設計,也就是在執行階段新增新資料類型、函數和索引的能力。因此,PostGIS 延伸模組可由獨立的開發團隊開發,並能嚴密整合到 PostgreSQL 資料庫核心。

2.2.1.1. 為什麼選擇 PostgreSQL?

熟悉開放原始碼資料庫的人常見問題為:「為什麼 PostGIS 不是建立於 MySQL 之上?」

PostgreSQL 具備

  • 經過驗證的可靠性和預設的交易完整性 (ACID)

  • 小心支援 SQL 標準(完整 SQL92)

  • 可外掛的類型延伸和函數延伸

  • 以社群為導向的開發模式

  • 沒有資料行大小限制(「可 TOAST」的元組),可支援大型 GIS 物件

  • 一般性的索引結構(GiST)可允許 R-Tree 索引

  • 容易加入自訂函數

PostgreSQL 提供了非常便捷的開發路徑來新增空間類型。在專有軟體領域中,只有 Illustra(現在為 Informix Universal Server)允許如此簡便的擴充。這並非巧合;Illustra 是 1980 年代原始 PostgreSQL 程式碼庫的專有再建構。

由於在 PostgreSQL 中新增類型非常直接,因此從這裡開始是有道理的。當 MySQL 在第 4.1 版中釋出基本空間類型時,PostGIS 團隊查看了他們的程式碼,並且這項作業強化了當初使用 PostgreSQL 的決定。

由於 MySQL 空間物件必須以特殊案例的形式建立在字串類型之上,因此 MySQL 程式碼分散在整個程式庫中。PostGIS 0.1 的開發花費不到一個月時間。執行「MyGIS」0.1 會花費更久的時間,而且因此可能永遠無法問世。

2.2.2. 為什麼不用檔案?

自 GIS 軟體首次撰寫以來,Shapefile(以及其他格式,例如 Esri File Geodatabase 和 GeoPackage)一直是儲存和互動空間資料的標準方式。然而,這些「平面」檔案有下列缺點

  • 檔案需要特殊軟體才能讀取和寫入。 SQL 是用於隨機資料存取和分析的抽象化。在沒有這個抽象化的情況下,您需要自行撰寫所有存取和分析程式碼。

  • 同時間有多個使用者可能會導致資料損毀和效能變差。雖然可以寫入額外的程式碼來確保對同一個檔案的多筆寫入不致損毀資料,但當您解決了這個問題並同時解決相關的效能問題時,您已經建構了一個資料庫系統的主要部分。為什麼不乾脆使用標準資料庫?

  • 複雜的程式碼需要複雜的軟體來回答。在資料庫中可以用一行 SQL 表示的複雜而有趣的程式碼(空間關聯、彙總等)如果針對檔案進行編寫,需要數百行的特殊程式碼才能回答。

大多數 PostGIS 使用者都在建立系統,需要讓多個應用程式存取資料,因此使用標準 SQL 存取方法可以簡化部署和開發。有些使用者處理大型資料集;如果使用檔案,它們可能會分割成多個檔案,但在資料庫中,它們可以儲存為單一大型表格。

總而言之,支援多個使用者、複雜的臨時查詢和大資料集效能的組合,是將空間資料庫與基於檔案的系統區分開來的關鍵。

2.2.3. PostGIS 的簡史

2001 年 5 月,Refractions Research 發布了第一個版本的 PostGIS。PostGIS 0.1 有物件、索引和少數功能。結果是一個適用於儲存和擷取的資料庫,但無法進行分析。

隨著功能數量增加,組織架構的需求越來越明顯。開放地理空間聯盟的「用於 SQL 的簡單功能」(SFSQL) 規範提供了這樣的架構,其中包含功能命名和需求的準則。

PostGIS 支援簡單分析和空間聯結後,Mapserver 成為第一個用於提供資料庫中資料視覺化的外部應用程式。

在後續的幾年中,PostGIS 功能數量有所增加,但其功能仍然有限。許多最有趣的功能 (例如,ST_Intersects()、ST_Buffer()、ST_Union()) 非常難以編碼。從頭開始編寫會花上數年的人力。

幸運的是,第二個專案「開源幾何引擎」或 GEOS 問世了。GEOS 函式庫提供了實作 SFSQL 規範所需的演算法。透過連結 GEOS,PostGIS 在 0.8 版中提供了對 SFSQL 的完整支援。

隨著 PostGIS 資料容量的增加,另一個問題浮現:用於儲存幾何圖形的表示法證明相對沒有效率。對於點和短線等小型物件來說,表示法中的元資料的不必要開銷最高達 300%。考量效能因素,有必要對表示法進行精簡。透過縮小元資料標頭和所需的尺寸,大為減少了不必要開銷。在 PostGIS 1.0 中,這款新的、更快速且輕量化的表示法成為預設格式。

PostGIS 的最新版本持續增加功能,並改善效能,同時也支援 PostgreSQL 核心系統的新功能。

2.2.4. 誰在使用 PostGIS?

有關個案研究的完整清單,請參閱 PostGIS 個案研究 頁面。

2.2.4.1. 法國國家地理局

IGN 是法國的國家製圖機構,並使用 PostGIS 來儲存法國的高解析度地形圖「BDUni」。BDUni 擁有逾 1 億個特徵,並由 100 多位現場工作人員維護,這些工作人員每天驗證觀察結果並將新的繪圖新增至資料庫中。IGN 安裝採用資料庫交易系統以確保在更新程序期間維持一致性,並採用 熱備份系統,在發生系統故障時維持正常運作時間。

2.2.4.2. RedFin

RedFin 是一家房地產仲介公司,提供一個探索房地產並估算價值的網路服務。他們的系統最初架構在 MySQL 上,但他們發現轉移到 PostgreSQL 和 PostGIS 在 效能與可靠度方面有巨大的好處

2.2.5. 哪些應用程式支援 PostGIS?

PostGIS 已成為廣泛使用的空間資料庫,支援使用它儲存及擷取資料的協力廠商程式數量也有所增加。支援 PostGIS 的程式包括伺服器和桌面系統上的開源和專有軟體。

下表列出一些使用 PostGIS 的軟體列表

開放/免費

封閉/專有/付費服務

  • 載入/萃取

    • Shp2Pgsql

    • ogr2ogr

    • Dxf2PostGIS

    • GeoKettle

  • 網路

    • Mapserver

    • GeoServer /geoNode

    • pg_tileserv

    • pg_featureserv

    • Deegree

    • Carto

    • QGIS Server

    • MapGuide 開源軟體(使用 FDO)

  • 桌面

    • QGIS

    • OpenJUMP

    • GRASS

    • pgAdmin

    • DBeaver

    • GvSIG

    • SAGA

    • uDig

  • 載入/萃取

    • Safe FME Desktop 翻譯/轉換器

    • Dbt

  • 網路

    • Cadcorp GeognoSIS

    • ESRI ArcGIS Server / Online

  • 服務/DbaaS

    • 適用於 PostgreSQL 的 Aiven

    • 適用於 PostgreSQL 的 Amazon RDS / Aurora

    • Carto

    • Crunchy Bridge

    • 適用於 PostgreSQL 的 Microsoft Azure

    • 適用於 PostgreSQL 的 Google Cloud SQL

  • 桌面

    • Cadcorp SIS

    • ESRI Desktop/Pro

    • GeoConcept

    • Global Mapper

    • Manifold

    • MapInfo

    • Microimages TNTmips GIS