33. 拓樸與幾何表示法¶
在閱讀本文檔之前,請至少複習以下資源之一
擁有包含所有基本元素的拓樸很有用,但為了使其更實用,我們需要一種在表格中表示這些元素的方式。與我們擁有空間表格的方式類似,我們可以擁有拓樸表格。
33.1. 幾何表示法簡介¶
如果您曾經使用過拓樸來表示幾何的範例,您可能會記得這一點,當我們從幾何表格填充拓樸表格時,我們使用 TopoGeometry 而不是 Geometry,並且在某種程度上,每個 TopoGeometry 都能夠表示拓樸中包含的一個或多個基本元素。

重點是我們如何從 TopoGeometry 存取實際的基本元素,資料的結構如何,因此首先讓我們看看最全面的定義

一個 TopoGeometry 可以表示一組基本元素或其他 TopoGeometry,為了建立一個 TopoGeometry,您需要一個圖層。
圖層是最大的容器,它們儲存 TopoGeometry,TopoGeometry 也儲存 TopoElement,最後這些 TopoElement 表示基本元素或其他 TopoGeometry。
用兩種方式來寫
圖層包含
TopoGeometry,其中所有 TopoGeometry 都具有相同的 TopoElement 類型,每個 TopoGeometry 包含
TopoElement,其中每個 TopoElement 可以表示一個
其他圖層的 TopoGeometry
幾何集合
來自拓樸的基本元素
節點
邊
面
TopoGeometry 作為鍵公開,它們在圖層內具有唯一鍵,但也儲存其圖層鍵,這允許 PostGIS 將其儲存在任意欄位中,並且始終能夠找到其 TopoElement,並藉此了解它們所代表的內容。
您需要一個將要建立 TopoGeometry 的圖層,之後您不需要記住它屬於哪個圖層。
這個概念是用戶所使用的,從這一點開始,我們將解釋深入和技術細節。
順帶一提,PostGIS 拓樸在關於鍵時,內部有一些技巧,有助於優化許多部分,但同時也有很多多餘的資訊,如果您在兩個或多個地方發現相同的資訊,請不要感到驚訝。
33.2. 功能¶
TopoElement 可以表示 TopoGeometry 和基本元素,想想 TopoGeometry,如果將它們儲存在 TopoElement 中,它們仍然包含其他 TopoElement,如果我們追蹤其路徑,我們將始終以拓樸的基本元素結束。
功能將代表幾何集合的類型,如果您使用 TopoGeometry 或基本元素並不重要,最終一個圖層可以直接或間接地包含這些集合中的任何一個
節點
邊
面
幾何集合
數字很重要,在任何要求功能類型的函數中,您可以使用數字或名稱字串來指定它。
33.3. 分層圖層、子項和父項¶
我本來想稍後再介紹這個概念,但為了更好、更深入地解釋這個概念,您會發現這是必需的。

影像中的第一個方面是一個使用基本元素建構的表格,圖層 1 將擁有 TopoGeometry,其中其 TopoElement 僅參考拓樸的基本元素。
我們將圖層 1 和基本元素之間的關係定義為
圖層 1 是基本元素的父項
基本元素是圖層 1 的子項
父項和子項之間的關係是關於大小的,子項較小,當我們擁有一組子項時,我們會建立一個父項,一個更大的群組。
圖層 2 的子項是圖層 1,這表示此圖層的每個 TopoGeometry 都可以參考圖層 1 的一個或多個 TopoGeometry。
這也意味著您不能從圖層 1 中挑選一半的 TopoGeometry,挑選一半意味著您需要參考 TopoGeometry 的 TopoElement 之一,在本例中,它屬於基本元素(其子項),如果您真的需要這樣,則使用圖層 1 的子項(基本元素)建立圖層 2。
每個圖層只能有一個子圖層,這表示子項和父項共用相同的拓樸結構。
您會注意到階層的一些方面可能會改變,也許會支援類似一半 TopoGeometry 或混合圖層的功能,但目前尚未實作。
33.4. 圖層¶
為了儲存 TopoGeometry,我們需要一個圖層,因此當我們建立 TopoGeometry 的欄位時,我們也會建立一個圖層,這就是為什麼我們使用特殊函數來建立欄位的原因。
圖層和 TopoGeometry 欄位之間有特殊的關係,它們是連結的,但它們並不相同。
圖層有很多我們必須提供的資訊,以了解我們想要哪種類型的圖層。
圖層在每個拓樸中都有唯一的識別碼,此識別碼稱為 layer_id。
圖層鍵:由 [topology_id, layer_id] 組成的複合鍵
表格路徑:架構名稱、表格名稱和欄位名稱,以了解它連結到哪裡。
功能類型:圖層將包含的功能類型。
層級:此值從 0 開始,如果我們使用另一個圖層建構此圖層,它會加 1,因此我們知道我們離基本元素有多少個圖層,如果值為 0,則表示該圖層是使用基本元素而不是 TopoGeometry 建構的。
child_id:如果該圖層不是使用基本元素,而是使用另一個圖層作為基礎而建構的,我們需要此圖層的圖層識別碼 (layer_id),我們不需要 topology_id,因為我們已經從父項知道了它。
33.5. 關係表格¶
最後,您可能正在尋找的部分,PostGIS 拓樸如何從 TopoGeometry 轉到它們所包含的內容。
關係表格函數是父項和子項之間的橋樑。
可以在以下位置找到此表格:my_topology.relation
。
33.5.1. 我們現在知道的鍵和識別碼¶
我將使用「識別碼」這個詞作為特定內容中的唯一鍵。例如,每個圖層都有一個數字作為識別碼 (layer_id),它在其拓樸內容中是唯一的,但不足以在資料庫中找到圖層。
雖然識別碼可以在內容中使用,但鍵將是尋址元素的完整方式,例如任何圖層的鍵都是兩個值 [topology_id, layer_id]。

影像很好地總結了每個鍵的組成方式。
33.5.1.1. 鍵的隱式識別碼¶
PostGIS 在處理圖層和 TopoGeometry 時,在某種程度上使用隱式邏輯,這是因為它們具有一種內容,您不需要儲存完整的鍵即可知道它。
舉例來說
TopoGeometry 由以下元素組成
topology_id
layer_id
topogeometry_id
如前所述,關係表格儲存在拓樸架構中。此表格將包含 TopoGeometry 與 TopoElement 的關係,在此內容中進行參考,我們是否需要 topology_id?
我們可以跳過它!當我們在拓樸架構之外時,我們需要 id 來找到它,但當我們在其中時,我們可以查看架構名稱,並在表格 topology.topology
中找到其 id,該表格具有所有拓樸的 id 和名稱。
33.5.2. TopoGeometry¶
TopoGeometry 是由以下元素組成的複合鍵
topology_id:TopoGeometry 鍵的 topology_id
layer_id:TopoGeometry 鍵的 layer_id
id:TopoGeometry 鍵的 topogeometry_id
type:功能類型,以數字表示
33.5.3. 基本關係表格結構¶
每個架構拓樸都可以有自己的關係表格,當您建立第一個 TopoGeometry 時會建立此表格,該表格以 custom_topology.relation
的形式儲存在拓樸中。
表格的每一列都稱為「元件」,例如關係的元件。
元件儲存兩個項目的配對,一個 TopoGeometry 鍵和一個 TopoElement,請記住,每個 TopoElement 只能表示一個基本元素或 TopoGeometry,因此為了讓 TopoGeometry 能夠表示多個,該表格會儲存多個具有相同 TopoGeometry 鍵和不同 TopoElement 的列,這樣僅在表格中篩選,我們就可以獲得任何 TopoGeometry 的所有 TopoElement。

33.5.4. 尋找 TopoGeometry 的元件¶
尋找屬於 TopoGeometry 的元件有點棘手,因為這裡會使用隱式鍵。
一個元件具有以下元素
TopoGeometry 鍵
topogeom_id:來自 TopoGeometry 鍵的 topogeometry_id
layer_id:來自 TopoGeometry 鍵的 layer_id
TopoElement
element_id
element_type
我們可以注意到 TopoGeometry 鍵是不完整的,這是因為關係表格已經屬於一個拓樸,因此無需再次儲存拓樸識別碼。
要從 TopoGeometry 找到 Component,我們需要查看 TopoGeometry 的 topology_id,並在 topology.topology.id
中搜尋,取得 Topology 名稱。有了這個名稱,我們就可以在其各自的 schema 中找到關聯表格。

33.5.5. 讀取 TopoElements¶
分解 TopoGeometry 的最後一部分是能夠解析 TopoElements,這比其他鍵更複雜,因為它的含義可能會根據其儲存的圖層 (Layer) 而改變。
正如我們所討論的,一個圖層 (Layer) 可以有兩種子選項:Primitives 或 TopoGeometries。
我們首先需要知道它正在使用哪個子選項,為此,我們需要使用 TopoGeometry Key.layer_id
查看 topology.layer.id
,並取得 `topology.layer.child_id`
。
因此,情況取決於 child_id
如果為 NULL
element_id: Primitive 識別碼
element_type: 特徵編號,查看 Features 以了解要查看哪個 primitive 表格。
如果非 NULL
element_id:來自 TopoGeometry Key 的 topogeometry_id
element_type:來自 TopoGeometry Key 的 layer_id
第一種情況很簡單,只需查看其各自的 Primitive 表格,並使用識別碼來了解是哪個 primitive。
而第二種情況,TopoElement 用於建構新的 TopoGeometry Key,topology_id 是隱含的,正如我們所討論的,因此 Key 是完整的。要尋找新的元素,請再次查看關聯表格,但使用新的鍵。
