33. 拓樸與幾何表示法

在閱讀本文檔之前,請至少複習以下資源之一

擁有包含所有基本元素的拓樸很有用,但為了使其更實用,我們需要一種在表格中表示這些元素的方式。與我們擁有空間表格的方式類似,我們可以擁有拓樸表格。

33.1. 幾何表示法簡介

如果您曾經使用過拓樸來表示幾何的範例,您可能會記得這一點,當我們從幾何表格填充拓樸表格時,我們使用 TopoGeometry 而不是 Geometry,並且在某種程度上,每個 TopoGeometry 都能夠表示拓樸中包含的一個或多個基本元素。

_images/geomtable2topotable.png

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

_images/topology_main_concept.png

一個 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 或基本元素並不重要,最終一個圖層可以直接或間接地包含這些集合中的任何一個

    1. 節點

    1. 幾何集合

數字很重要,在任何要求功能類型的函數中,您可以使用數字或名稱字串來指定它。

33.3. 分層圖層、子項和父項

我本來想稍後再介紹這個概念,但為了更好、更深入地解釋這個概念,您會發現這是必需的。

_images/hierarchy1.png

影像中的第一個方面是一個使用基本元素建構的表格,圖層 1 將擁有 TopoGeometry,其中其 TopoElement 僅參考拓樸的基本元素。

我們將圖層 1 和基本元素之間的關係定義為

  • 圖層 1 是基本元素的父項

  • 基本元素是圖層 1 的子項

父項和子項之間的關係是關於大小的,子項較小,當我們擁有一組子項時,我們會建立一個父項,一個更大的群組。

圖層 2 的子項是圖層 1,這表示此圖層的每個 TopoGeometry 都可以參考圖層 1 的一個或多個 TopoGeometry。

這也意味著您不能從圖層 1 中挑選一半的 TopoGeometry,挑選一半意味著您需要參考 TopoGeometry 的 TopoElement 之一,在本例中,它屬於基本元素(其子項),如果您真的需要這樣,則使用圖層 1 的子項(基本元素)建立圖層 2。

每個圖層只能有一個子圖層,這表示子項和父項共用相同的拓樸結構。

您會注意到階層的一些方面可能會改變,也許會支援類似一半 TopoGeometry 或混合圖層的功能,但目前尚未實作。

33.4. 圖層

為了儲存 TopoGeometry,我們需要一個圖層,因此當我們建立 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]。

_images/topo_keys.png

影像很好地總結了每個鍵的組成方式。

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。

_images/components.png

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 中找到關聯表格。

_images/topogeo2components.png

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 是完整的。要尋找新的元素,請再次查看關聯表格,但使用新的鍵。

_images/read_topoelement.png