全部產品
Search
文件中心

PolarDB:表面網格模型

更新時間:Oct 18, 2024

本文介紹了表面網格模型的用途、基本構成和快速入門等內容。

模型用途

簡介

表面網格模型是三維實體建模中常用的方法,通過一系列連續的面來對三維實體形狀進行刻畫。 同時,對於面資訊支援可視化元素的設定,如材質,紋理等資訊,使得在三維可視化時具有更好的視覺效果。

GanosBase中,使用標準的SQL語言來查詢和處理表面模型類型的資料,支援資料基於文本和二進位的表達和資料交換。

GanosBase Sfmesh是對象關係型資料庫PostgreSQL相容版本(PolarDB PostgreSQL版(相容Oracle))的一個時空引擎擴充,提供了一組資料類型,函數和預存程序,協助使用者高效地管理、查詢和分析表面三維資料。

功能概述

表面網格模型包括多種資料類型,支援構建、訪問、編輯、處理、彙總、匯入匯出等多種方法,支援三維空間關係判斷與三維分析計算操作,支援三維索引。

表面網格模型通過GanosBase Utility擴充支援多種三維資料格式的匯入,如IFC、glTF、Obj等,也支援將表面網格模型轉換為三維瓦片形式(如3dtiles)。

功能詳情請參見SfMesh SQL參考

主要業務情境

在實際應用中,表面網格類型可以用於空間資料的可視化和分析:

  • 三維地圖製作和可視化

    地圖可視化可以直觀地展現地理空間中資料的分布、趨勢和關係,有助於更好地理解空間資料的意義和背後的規律。三維空間資料可以表示三維空間中的對象,如建築,管線等,配合材質、紋理等可視化元素,可以還原出真實的三維情境以供展示以及決策使用。

  • 三維空間關係查詢

    空間關係查詢可以用於多種情境,例如空間資料挖掘、城市規劃等。通過空間關係查詢,可以快速地找到滿足特定條件的空間實體,為決策提供有力的支援。

    表面網格類型支援三維空間關係查詢,如相交、包含等。這可以用於確定兩個對象之間的關係,例如確定兩個物體是否相交。

  • 三維空間分析和計算

    三維空間分析和計算用於各種量測情境,例如計算建築物的面積、體積等。

    表面網格類型支援各種空間分析和計算,如計算面積、長度、距離,同樣也包括兩個對象的交集,並集等。

以下以BIM情境為例,介紹表面網格模型在BIM資料情境下的使用。

BIM資料

建築資訊模型(Building Information Modeling,簡稱BIM)是在建設工程及設施全生命期內,對其物理和功能特性進行數字化表達,並依此設計、施工、營運的過程和結果的總稱。

BIM資料中包含了大量的三維空間資料和屬性資料,適合資料庫中做統一的儲存,管理和查詢。

GanosBase Utility擴充支援IFC資料格式的匯入,並轉換為表面網格資料模型。

可視化

有別於以往2D圖,3D模型的真實性,直觀的表達,讓模型資訊的展現更符合人的直覺,更清楚地瞭解建造物的空間關係。

採用表面網格儲存的BIM資料,通過三維可視化技術,可以產生情境模型進行可視化操作,解決BIM資料,特別是大檔案資料直觀性差的問題。

bim.gif

屬性查詢

BIM資料往往以專業格式按檔案儲存體,不利於結合其他二三維資料統一管理、聯集查詢,需要對其進行結構化拆解,提供業務/空間查詢的能力。

基於資料庫的儲存和查詢能力,可以在資料庫中進行屬性和空間一體化查詢,解決資料管理的問題。

例如,可以用標準的SQL查詢類型為 'System Panel' 的組件:

SELECT project_uuid, project_name, parent_uuid, uuid, "family", "name", attrs, props_set
FROM ifc_demo_ifc_elem
WHERE
(((props_set->'Other')::json)->'Type')::text like '%System Panel: %'
空間分析

BIM模型中的尺寸與建築物一致。利用這些資訊,進行各類指標的計算,如容積率與建蔽率;各類指標檢查,如樓層淨高,面積檢測;與其他空間資料聯動檢查碰撞關係等,如與二三維的規劃紅線進行空間比對。

image

基本構成

表面網格模型概述

在實體建模和電腦輔助設計中,一個實體物件通常被表示為一組串連的表面元素,這些元素定義了內部和外部點之間的邊界。

image

這些面通常由三角形(triangle meshes)、四邊形(quads)或其他簡單的凸多邊形(n-gons)組成,可以對實體物件的輪廓邊界進行精確的描述。

這種由多個面來表示描述實體物件的模型稱為表面網格模型。

空間參考系統

空間參考系(Spatial Reference System,以下簡稱為SRS )定義了如何將Sfmesh對象關聯到地球表面上某個具體位置。

GanosBase使用稱為SRID來引用SRS定義。Sfmesh對象通過其自身的SRID值與SRS關聯。

更多內容請參見空間參考

表面網格模型資料模型

GanosBase表面網格模型在OGC Simple Feature標準模型的基礎上,新增以下資料模型:

INDEXSURFACE

IndexSurface用於基於索引的方式來描述多面體資訊,例如以下多面體,可以分別使用頂點座標串(p1, p2, p3, p4, p5)以及使用頂點描述的面(1,2,3),(2,4,3),(4,5,3)來進行描述。

image

TRIANGLESTRIP

TriangleStrip基於連續的點來描述多面體系統,例如以下多面體,可以分別使用頂點座標串(p1, p2, p3, p4, p5)來描述三個三角面(p1,p2,p3),(p2,p3,p4),(p3, p4, p5)。

image

TRIANGLEFAN

TriangleFan基於連續的點來描述多面體系統,例如以下多面體,可以分別使用頂點座標串(p3, p1, p2, p4, p5)來描述三個三角面(p3,p1,p2), (p3,p2,p4), (p3, p4, p5)。

image

表面網格模型資料類型

GanosBase中表面模型包含以下資料類型:

  • sfmesh:包含幾何、材質、紋理、紋理座標等相關資訊的資料類型集合。

  • meshgeom:幾何對象,用於記錄座標點資訊以及如何構面描述,以及對應的紋理座標和法向量等資訊。

  • texture:紋理貼圖資訊,包含寬、高、壓縮方式及紋理位元據等。

  • material:材質,sfmesh對象表面各可視化屬性的集合,包括模型對象表面的色彩、紋理、光滑度、透明度、反射率、折射率、發光度等。

GanosBase表面模型支援引用對象。引用對象是一種特殊資料結構,該對象中不儲存實際的資料值,只儲存到另外一個對象的地址資訊。

表面網格交換格式

表面網格交換格式支援文本和二進位兩種格式。

  • 方便閱讀的文本形式:Well-Known Text(以下簡稱為WKT)。詳情請參見WKT

  • 可以保留資料精度且方便傳輸的二進位形式:Well-Known Binary(以下簡稱為WKB)。詳情請參見WKB

資料列視圖

GanosBase中,sfmesh_columns是從資料庫系統目錄表中讀取全部表面網格相關列的視圖。該視圖遵循了OGC的Simple Features Specification for SQL標準並進行可對應的擴充。

該視圖結構如下:

列名

類型

說明

g_table_catalog

varchar(256)

所在資料庫的名稱。

g_table_schema

name

該表所在的schema。

g_table_name

name

該表的表名。

g_sfmesh_column

name

該表中某個表面網格列的列名。

g_sfmesh_type

name

表面網格列的具體子類型,取值如下:

  • sfmesh

  • meshgeom

  • texture

  • material

可以通過如下語句查詢當前資料庫中全部表面模型資料列:

SELECT * FROM sfmesh_columns;

或通過如下語句篩選出模型列。

SELECT * FROM sfmesh_columns
WHERE g_sfmesh_type = 'sfmesh';

索引

空間索引使GanosBase處理大型空間資料集時避免對資料庫進行全域順序掃描。索引通過將資料群組織到搜尋樹中來加速搜尋,可以快速遍曆該搜尋樹以尋找特定記錄。

GanosBase為Sfmesh提供了一種基於GiST的三維空間索引。

可通過以下方式進行建立。

CREATE INDEX <index_name>
ON <table_name>
USING GIST(<column_name>);

快速入門

簡介

快速入門文檔協助使用者快速理解GanosBase Sfmesh引擎的基本用法,包括擴充建立、建表、插入資料、查詢結果、建立索引、空間查詢等內容。

文法說明

  • 建立擴充。

    CREATE EXTENSION Ganos_sfmesh CASCADE;
    說明

    建議將擴充安裝在public模式下,避免許可權問題。

    CREATE extension Ganos_sfmesh WITH schema public cascade CASCADE;
  • 建立具有SFMesh欄位的表。

    CREATE TABLE t_mesh(
      id integer,
      mesh sfmesh
    );
  • 插入資料。

     --向表中插入資料
    INSERT INTO 
      t_mesh(id, mesh)
    VALUES 
      (1, '{   "version" : 1, "srid" : 4326, "root" : 0 , "meshgeoms" : [    "MESHGEOM(PATCH(TRIANGLESTRIP(0 0 0 ,0 10 10,10 10 10,10 0 0)))" ],  "primitives" : [    {"meshgeom": 0}],  "nodes" : [    {"primitive" : 0} ] }'::sfmesh),
      (2, '{   "version" : 1, "srid" : 4326, "root" : 0 , "meshgeoms" : [    "MESHGEOM(PATCH(INDEXSURFACE(VERTEX(0 0 1,0 10 2,10 10 3,10 0 4), INDEX((0,1,2),(1,2,3)))))" ],  "primitives" : [    {"meshgeom": 0}],  "nodes" : [    {"primitive" : 0} ] }'::sfmesh);
  • 查詢資料結果。

    SELECT id, ST_AsText(mesh)
    FROM t_mesh;
    
    -------------------------
    1 | {"version" : 1, "srid" : 4326, "root" : 0, "meshgeoms" : ["MESHGEOM(PATCH(TRIANGLESTRIP(0 0 0,0 10 10,10 10 10,10 0 0)))"], "primitives" : [{"meshgeom" : 0}], "nodes" : [{"primitive" : 0}]}
    2 | {"version" : 1, "srid" : 4326, "root" : 0, "meshgeoms" : ["MESHGEOM(PATCH(INDEXSURFACE Z (VERTEX(0 0 1,0 10 2,10 10 3,10 0 4),INDEX((0,1,2),(1,2,3)))))"], "primitives" : [{"meshgeom" : 0}], "nodes" : [{"pr
     imitive" : 0}]}
  • 建立索引。

     CREATE INDEX idx_t_mesh
     ON t_mesh
     USING GIST(mesh);
  • 空間查詢。

     -- 與某個三維空間對象相交
    SELECT id
    FROM t_mesh
    WHERE ST_3DIntersects(mesh, ST_SetSRID('BOX3D(0 0 0, 10 10 10)'::box3d::sfmesh, 4326));
  • 刪除擴充(可選)。

    DROP EXTENSION Ganos_SFMesh CASCADE;

SQL參考

詳細SQL手冊請參見SfMesh SQL參考