第 9 章。拓樸

目錄

PostGIS 拓樸類型與函式是用於管理拓樸物件,例如面、邊和節點。

Sandro Santilli 在 2011 年巴黎 PostGIS Day 會議上的簡報,很好地概述了 PostGIS 拓樸及其未來發展方向PostGIS 2.0 拓樸投影片

Vincent Picavet 在PostGIS 拓樸 PGConf EU 2012中,很好地概述了拓樸的定義、使用方式以及支援它的各種 FOSS4G 工具。

一個基於拓樸的 GIS 資料庫範例是美國人口普查拓樸整合地理編碼和參考系統 (TIGER)資料庫。如果您想嘗試使用 PostGIS 拓樸並需要一些資料,請查看Topology_Load_Tiger

PostGIS 拓樸模組在 PostGIS 的先前版本中就已存在,但從未成為官方 PostGIS 文件的一部分。在 PostGIS 2.0.0 中,正在進行重大清理工作,以移除其中所有已棄用的函式、修正已知的可用性問題、更好地記錄特性和函式、新增函式,並加強以更符合 SQL-MM 標準。

此專案的詳細資訊可在PostGIS 拓樸 Wiki中找到

與此模組相關的所有函式和表格都安裝在名為topology的結構描述中。

在 SQL/MM 標準中定義的函式,其前綴為 ST_,而 PostGIS 特有的函式則沒有前綴。

拓樸支援預設從 PostGIS 2.0 開始建立,並且可以在建置時指定 --without-topology 組態選項來停用,如第 2 章,PostGIS 安裝中所述

9.1. 拓樸類型

摘要

本節列出 PostGIS 拓樸安裝的 PostgreSQL 資料類型。請注意,我們描述了這些資料類型的轉型行為,這在設計您自己的函式時非常重要。

9.2. 拓樸網域

摘要

本節列出 PostGIS 拓樸安裝的 PostgreSQL 網域。網域可以像物件類型一樣使用,作為函式或表格欄的傳回物件。網域與類型之間的區別在於,網域是具有約束條件的現有類型。

9.3. 拓樸與拓樸幾何管理

摘要

本節列出用於建立新的拓樸結構描述、驗證拓樸和管理 TopoGeometry 欄的拓樸函式

  • AddTopoGeometryColumn — 將拓樸幾何欄新增至現有表格,將此新欄註冊為 topology.layer 中的圖層,並傳回新的 layer_id。
  • RenameTopoGeometryColumn — 重新命名拓樸幾何欄
  • DropTopology — 請謹慎使用:刪除拓樸結構描述,並從 topology.topology 表格中刪除其參考,以及從 geometry_columns 表格中刪除該結構描述中表格的參考。
  • RenameTopology — 重新命名拓樸
  • DropTopoGeometryColumn — 從結構描述 schema_name 中名為 table_name 的表格中刪除拓樸幾何欄,並從 topology.layer 表格中取消註冊這些欄。
  • Populate_Topology_Layer — 藉由從拓樸表格讀取中繼資料,將遺失的項目新增至 topology.layer 表格。
  • TopologySummary — 採用拓樸名稱並提供拓樸中物件類型摘要總計。
  • ValidateTopology — 傳回一組 validatetopology_returntype 物件,詳細說明拓樸的問題。
  • ValidateTopologyRelation — 傳回關於無效拓樸關係記錄的資訊
  • FindTopology — 藉由不同的方式傳回拓樸記錄。
  • FindLayer — 藉由不同的方式傳回 topology.layer 記錄。

9.4. 拓樸統計資料管理

摘要

本節討論拓樸建立期間的資料庫統計資料管理。

將元素新增至拓樸會觸發許多資料庫查詢,以尋找將會分割的現有邊、新增節點和更新將與新線條相連的邊。因此,拓樸表格中資料的統計資料保持在最新狀態非常有用。

PostGIS 拓樸填入和編輯函式不會自動更新統計資料,因為在拓樸中的每次變更之後更新統計資料將會過度使用,因此呼叫者有責任負責處理此問題。

[Note]

由自動清理程式更新的統計資料對於在自動清理程式完成之前啟動的交易不可見,因此長時間執行的交易需要自行執行 ANALYZE,才能使用更新的統計資料。

9.5. 拓樸建構子

摘要

本節介紹用於建立新拓樸的拓樸函式。

  • CreateTopology — 建立新的拓樸結構描述並將其註冊在 topology.topology 表格中。
  • CopyTopology — 將拓樸 (節點、邊、面、圖層和拓樸幾何) 的副本複製到新的結構描述中
  • ST_InitTopoGeo — 建立新的拓樸結構描述並將其註冊在 topology.topology 表格中。
  • ST_CreateTopoGeo — 將幾何的集合新增至給定的空拓樸,並傳回詳細說明成功的訊息。
  • TopoGeo_AddPoint — 使用容差將點新增至現有拓樸,並且可能會分割現有邊。
  • TopoGeo_AddLineString — 使用容差將線字串新增至現有拓樸,並且可能會分割現有邊/面。
  • TopoGeo_AddPolygon — 使用容差將多邊形新增至現有拓樸,並且可能會分割現有邊/面。傳回面識別碼。
  • TopoGeo_LoadGeometry — 將幾何載入現有拓樸,並根據需要進行捕捉和分割。

9.6. 拓樸編輯器

摘要

本節介紹用於新增、移動、刪除和分割邊、面和節點的拓樸函式。所有這些函式都由 ISO SQL/MM 定義。

  • ST_AddIsoNode — 將隔離的節點新增至拓樸中的面,並傳回新節點的 nodeid。如果面為 Null,仍然會建立節點。
  • ST_AddIsoEdge — 將由幾何 alinestring 定義的隔離邊新增至拓樸,以連接兩個現有的隔離節點 anodeanothernode,並傳回新邊的邊 ID。
  • ST_AddEdgeNewFaces — 新增一個新邊,如果在新增邊時分割了面,則刪除原始面,並以兩個新面取代它。
  • ST_AddEdgeModFace — 新增一個新邊,如果在新增邊時分割了面,則修改原始面並新增一個新面。
  • ST_RemEdgeNewFace — 移除一個邊,如果移除的邊分隔了兩個面,則刪除原始面並以新面取代它們。
  • ST_RemEdgeModFace — 移除一個邊,如果該邊分隔了兩個面,則刪除一個面,並修改另一個面以覆蓋這兩個面的空間。
  • ST_ChangeEdgeGeom — 變更邊的形狀,而不影響拓樸結構。
  • ST_ModEdgeSplit — 藉由沿著現有邊建立新節點,修改原始邊並新增新邊來分割邊。
  • ST_ModEdgeHeal — 藉由刪除連接兩個邊的節點,修改第一個邊並刪除第二個邊來修復兩個邊。傳回刪除的節點 ID。
  • ST_NewEdgeHeal — 藉由刪除連接兩個邊的節點,刪除兩個邊,並以方向與所提供第一個邊相同的邊取代它們來修復兩個邊。
  • ST_MoveIsoNode — 將拓樸中的隔離節點從一個點移動到另一個點。如果新的 apoint 幾何作為節點存在,則會擲回錯誤。傳回移動的描述。
  • ST_NewEdgesSplit — 藉由沿著現有邊建立新節點、刪除原始邊並以兩個新邊取代它來分割邊。傳回所建立連接新邊的新節點 ID。
  • ST_RemoveIsoNode — 移除孤立節點並回傳動作描述。若節點非孤立(為邊緣的起點或終點),則會拋出例外。
  • ST_RemoveIsoEdge — 移除孤立邊緣並回傳動作描述。若邊緣非孤立,則會拋出例外。

9.7. 拓樸存取器

9.8. 拓樸處理

摘要

本節涵蓋以非標準方式處理拓樸的函數。

  • Polygonize — 尋找並註冊由拓樸邊緣定義的所有面。
  • AddNode — 在指定的拓樸綱要的節點表格中新增一個點節點,並回傳新節點的 nodeid。如果點已作為節點存在,則會回傳現有的 nodeid。
  • AddEdge — 將一個線字串邊緣新增至邊緣表格,並將關聯的起點和終點新增至指定拓樸綱要的點節點表格,使用指定的線字串幾何圖形,並回傳新(或現有)邊緣的 edgeid。
  • AddFace — 將面基本元素註冊到拓樸並取得其識別碼。
  • ST_Simplify — 使用 Douglas-Peucker 演算法回傳給定 TopoGeometry 的「簡化」幾何版本。
  • RemoveUnusedPrimitives — 移除定義現有 TopoGeometry 物件不需要的拓樸基本元素。

9.9. TopoGeometry 建構子

摘要

本節涵蓋建立新的拓樸幾何圖形的拓樸函數。

  • CreateTopoGeom — 從拓樸元素陣列建立新的拓樸幾何物件 - tg_type: 1:[多]點、2:[多]線、3:[多]多邊形、4:集合
  • toTopoGeom — 將簡單幾何圖形轉換為拓樸幾何圖形。
  • TopoElementArray_Agg — 回傳一組 element_id、type 陣列(拓樸元素)的 topoelementarray
  • TopoElement — 將拓樸幾何圖形轉換為拓樸元素。

9.10. TopoGeometry 編輯器

摘要

本節涵蓋編輯現有拓樸幾何圖形的拓樸函數。

9.11. TopoGeometry 存取器

  • GetTopoGeomElementArray — 回傳一個 topoelementarray(拓樸元素陣列),其中包含給定 TopoGeometry 的拓樸元素和類型(基本元素)。
  • GetTopoGeomElements — 回傳一組 topoelement 物件,其中包含給定 TopoGeometry 的拓樸 element_id、element_type(基本元素)。
  • ST_SRID — 回傳拓樸幾何圖形的空間參考識別碼。

9.12. TopoGeometry 輸出

  • AsGML — 回傳拓樸幾何圖形的 GML 表示法。
  • AsTopoJSON — 回傳拓樸幾何圖形的 TopoJSON 表示法。

9.13. 拓樸空間關係

摘要

本節列出用於檢查拓樸幾何圖形和拓樸基本元素之間關係的拓樸函數

  • Equals — 如果兩個拓樸幾何圖形由相同的拓樸基本元素組成,則回傳 true。
  • Intersects — 如果兩個拓樸幾何圖形的任何一對基本元素相交,則回傳 true。

9.14. 匯入和匯出拓樸

一旦您建立拓樸,並可能關聯了拓樸圖層,您可能需要將它們匯出為基於檔案的格式,以進行備份或傳輸到另一個資料庫。

使用 PostgreSQL 的標準傾印/還原工具是有問題的,因為拓樸由一組表格(基本元素的 4 個,圖層的任意數量)和中繼資料表格(topology.topology 和 topology.layer)中的記錄組成。此外,拓樸識別碼在不同資料庫之間並非唯一,因此在還原時需要變更拓樸的參數。

為了簡化拓樸的匯出/還原,提供了一對可執行檔:pgtopo_exportpgtopo_import。範例用法

pgtopo_export dev_db topo1 | pgtopo_import topo1 | psql staging_db

9.14.1. 使用拓樸匯出器

pgtopo_export 腳本會採用資料庫和拓樸的名稱,並輸出可用於將拓樸(和關聯圖層)匯入新資料庫的傾印檔案。

預設情況下,pgtopo_export 會將傾印檔案寫入標準輸出,以便可以透過管道傳送到 pgtopo_import 或重新導向到檔案(拒絕寫入終端機)。您可以選擇使用 -f 命令列切換指定輸出檔名。

預設情況下,pgtopo_export 會包含針對給定拓樸定義的所有圖層的傾印。這可能比您需要的資料更多,或者可能無法運作(如果您的圖層表格有複雜的依賴性),在這種情況下,您可以使用 --skip-layers 切換要求跳過圖層,並單獨處理這些圖層。

--help(或簡寫 -h)切換調用 pgtopo_export 將始終列印簡短的用法字串。

傾印檔案格式是 pgtopo_export 目錄的壓縮 tar 封存檔,其中至少包含一個帶有格式版本資訊的 pgtopo_dump_version 檔案。截至版本 1,目錄包含拓樸基本元素表格(node、edge_data、face、relation)的資料、與其關聯的拓樸和圖層記錄,以及(除非給定 --skip-layers)以自訂格式呈現的 PostgreSQL 傾印,其中包含回報為給定拓樸圖層的表格,這些資料為 Tab 分隔的 CSV 檔案。

9.14.2. 使用拓樸匯入器

pgtopo_import 腳本會採用 pgtopo_export 格式的拓樸傾印以及要賦予要建立的拓樸的名稱,並輸出重新建構拓樸和關聯圖層的 SQL 腳本。

產生的 SQL 檔案將包含建立具有給定名稱的拓樸、將基本元素資料載入其中、還原和註冊所有拓樸圖層的陳述式,方法是將所有 TopoGeometry 值正確連結到其正確的拓樸。

預設情況下,pgtopo_import 會從標準輸入讀取傾印,以便可以與管道中的 pgtopo_export 一起使用。您可以選擇使用 -f 命令列切換指定輸入檔名。

預設情況下,pgtopo_import 會在輸出 SQL 檔案中包含還原傾印中找到的所有圖層的程式碼。

如果您的目標資料庫已經有與傾印中的表格同名的表格,則這可能是非必要的或無法運作的。在這種情況下,您可以使用 --skip-layers 切換要求跳過圖層,並單獨處理這些圖層(或稍後處理)。

可以使用 --only-layers 切換產生僅載入圖層並將圖層連結到具名拓樸的 SQL。這對於在解決命名衝突後載入圖層,或將圖層連結到不同的拓樸(例如起始拓樸的空間簡化版本)可能很有用。