表面网格模型

本文介绍了表面网格模型的用途、基本构成和快速入门等内容。

模型用途

简介

表面网格模型是三维实体建模中常用的方法,通过一系列连续的面来对三维实体形状进行刻画。 同时,对于面信息支持可视化元素的设置,如材质,纹理等信息,使得在三维可视化时具有更好的视觉效果。

在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.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对象关联到地球表面上某个具体位置。

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)来进行描述。

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

表面网格模型数据类型

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

表面网格列的具体子类型,取值如下:

  • sfmesh

  • meshgeom

  • texture

  • material

可以通过如下语句查询当前数据库中全部表面模型数据列:

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参考