本文介紹了表面網格模型的用途、基本構成和快速入門等內容。
模型用途
簡介
表面網格模型是三維實體建模中常用的方法,通過一系列連續的面來對三維實體形狀進行刻畫。 同時,對於面資訊支援可視化元素的設定,如材質,紋理等資訊,使得在三維可視化時具有更好的視覺效果。
在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資料往往以專業格式按檔案儲存體,不利於結合其他二三維資料統一管理、聯集查詢,需要對其進行結構化拆解,提供業務/空間查詢的能力。
基於資料庫的儲存和查詢能力,可以在資料庫中進行屬性和空間一體化查詢,解決資料管理的問題。
例如,可以用標準的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模型中的尺寸與建築物一致。利用這些資訊,進行各類指標的計算,如容積率與建蔽率;各類指標檢查,如樓層淨高,面積檢測;與其他空間資料聯動檢查碰撞關係等,如與二三維的規劃紅線進行空間比對。

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

這些面通常由三角形(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)來進行描述。

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

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

表面網格模型資料類型
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 | 表面網格列的具體子類型,取值如下:
|
可以通過如下語句查詢當前資料庫中全部表面模型資料列:
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參考。