本文介绍了表面网格模型的用途、基本构成和快速入门等内容。
模型用途
简介
表面网格模型是三维实体建模中常用的方法,通过一系列连续的面来对三维实体形状进行刻画。 同时,对于面信息支持可视化元素的设置,如材质,纹理等信息,使得在三维可视化时具有更好的视觉效果。
在Ganos中,使用标准的SQL语言来查询和处理表面模型类型的数据,支持数据基于文本和二进制的表达和数据交换。
Ganos Sfmesh是对象关系型数据库PostgreSQL兼容版本(PolarDB PostgreSQL版(兼容Oracle))的一个时空引擎扩展,提供了一组数据类型,函数和存储过程,帮助用户高效地管理、查询和分析表面三维数据。
功能概述
表面网格模型包括多种数据类型,支持构建、访问、编辑、处理、聚合、导入导出等多种方法,支持三维空间关系判断与三维分析计算操作,支持三维索引。
表面网格模型通过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参考。