本文介紹了表面網格模型的用途、基本構成和快速入門等內容。
模型用途
簡介
表面網格模型是三維實體建模中常用的方法,通過一系列連續的面來對三維實體形狀進行刻畫。 同時,對于面信息支持可視化元素的設置,如材質,紋理等信息,使得在三維可視化時具有更好的視覺效果。
在Ganos中,使用標準的SQL語言來查詢和處理表面模型類型的數據,支持數據基于文本和二進制的表達和數據交換。
Ganos Sfmesh是對象關系型數據庫PostgreSQL兼容版本(PolarDB PostgreSQL版)的一個時空引擎擴展,提供了一組數據類型,函數和存儲過程,幫助用戶高效地管理、查詢和分析表面三維數據。
功能概述
表面網格模型包括多種數據類型,支持構建、訪問、編輯、處理、聚合、導入導出等多種方法,支持三維空間關系判斷與三維分析計算操作,支持三維索引。
表面網格模型通過Ganos Utility擴展支持多種三維數據格式的導入,如IFC、glTF、Obj等,也支持將表面網格模型轉換為三維瓦片形式(如3dtiles)。
功能詳情請參見SfMesh SQL參考。
主要業務場景
在實際應用中,表面網格類型可以用于空間數據的可視化和分析:
三維地圖制作和可視化
地圖可視化可以直觀地展現地理空間中數據的分布、趨勢和關系,有助于更好地理解空間數據的意義和背后的規律。三維空間數據可以表示三維空間中的對象,如建筑,管線等,配合材質、紋理等可視化元素,可以還原出真實的三維場景以供展示以及決策使用。
三維空間關系查詢
空間關系查詢可以用于多種場景,例如空間數據挖掘、城市規劃等。通過空間關系查詢,可以快速地找到滿足特定條件的空間實體,為決策提供有力的支持。
表面網格類型支持三維空間關系查詢,如相交、包含等。這可以用于確定兩個對象之間的關系,例如確定兩個物體是否相交。
三維空間分析和計算
三維空間分析和計算用于各種量測場景,例如計算建筑物的面積、體積等。
表面網格類型支持各種空間分析和計算,如計算面積、長度、距離,同樣也包括兩個對象的交集,并集等。
以下以BIM場景為例,介紹表面網格模型在BIM數據場景下的使用。
BIM數據
建筑信息模型(Building Information Modeling,簡稱BIM)是在建設工程及設施全生命期內,對其物理和功能特性進行數字化表達,并依此設計、施工、運營的過程和結果的總稱。
BIM數據中包含了大量的三維空間數據和屬性數據,適合數據庫中做統一的存儲,管理和查詢。
Ganos 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對象關聯到地球表面上某個具體位置。
Ganos使用稱為SRID來引用SRS定義。Sfmesh對象通過其自身的SRID值與SRS關聯。
更多內容請參見空間參考。
表面網格模型數據模型
Ganos表面網格模型在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)。
表面網格模型數據類型
Ganos中表面模型包含以下數據類型:
sfmesh:包含幾何、材質、紋理、紋理坐標等相關信息的數據類型集合。
meshgeom:幾何對象,用于記錄坐標點信息以及如何構面描述,以及對應的紋理坐標和法向量等信息。
texture:紋理貼圖信息,包含寬、高、壓縮方式及紋理二進制數據等。
material:材質,sfmesh對象表面各可視化屬性的集合,包括模型對象表面的色彩、紋理、光滑度、透明度、反射率、折射率、發光度等。
Ganos表面模型支持引用對象。引用對象是一種特殊數據結構,該對象中不存儲實際的數據值,只存儲到另外一個對象的地址信息。
表面網格交換格式
表面網格交換格式支持文本和二進制兩種格式。
方便閱讀的文本形式:Well-Known Text(以下簡稱為WKT)。詳情請參見WKT。
可以保留數據精度且方便傳輸的二進制形式:Well-Known Binary(以下簡稱為WKB)。詳情請參見WKB。
數據列視圖
在Ganos中,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';
索引
空間索引使Ganos處理大型空間數據集時避免對數據庫進行全局順序掃描。索引通過將數據組織到搜索樹中來加速搜索,可以快速遍歷該搜索樹以查找特定記錄。
Ganos為Sfmesh提供了一種基于GiST的三維空間索引。
可通過以下方式進行創建。
CREATE INDEX <index_name>
ON <table_name>
USING GIST(<column_name>);
快速入門
簡介
快速入門文檔幫助用戶快速理解Ganos Sfmesh引擎的基本用法,包括擴展創建、建表、插入數據、查詢結果、創建索引、空間查詢等內容。
更多專業用法可參考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參考。