Ganos表面模型支持以文本的方式进行表达,方便阅读理解,称为Well-Known Text(简称WKT)。
几何结构
Ganos表面模型中除了支持OGC Simple Feature模型外,还支持以下几何结构的WKT的表达,对应几何结构请参见表面网格模型数据模型。
INDEXSURFACE
IndexSurface WKT表述时由类型关键字INDEXSURFACE、顶点坐标关键字VERTEX以及索引关键字INDEX表示。VERTEX点坐标之间使用','
进行分隔,维度之间使用" "
进行分隔;面索引每个面使用"()"
进行包裹,索引间使用","
进行分隔,形式如下:
INDEXSURFACE(
VERTEX(x1 y1 z1,
x2 y2 z2,
...
),
INDEX(
(i1,i2,i3,...),
(j1,j2,j3,...),
....
)
)
示例如下:
INDEXSURFACE(
VERTEX(201755.424609375 241700.688720703 7025.00027160645,201755.424609375 241700.688720703 6774.9998336792,202255.431298828 241700.688720703 6774.9998336792,202255.431298828 241700.688720703 7025.00027160645,202255.431298828 243149.418896484 6774.9998336792,201755.424609375 243149.418896484 6774.9998336792,201755.424609375 243149.418896484 7025.00027160645,202255.431298828 243149.418896484 7025.00027160645),
INDEX((0,1,2),(2,3,0),(4,5,6),(6,7,4),(2,1,5),(5,4,2),(3,2,7),(4,7,2),(0,3,7),(7,6,0),(1,0,5),(6,5,0))
)
IndexSurface同样支持Z和M维度信息:
INDEXSURFACE Z(
VERTEX(201755.424609375 241700.688720703 7025.00027160645,201755.424609375 241700.688720703 6774.9998336792, 202255.431298828 241700.688720703 6774.9998336792,202255.431298828 241700.688720703 7025.00027160645,202255.431298828 243149.418896484 6774.9998336792,201755.424609375 243149.418896484 6774.9998336792,201755.424609375 243149.418896484 7025.00027160645,202255.431298828 243149.418896484 7025.00027160645),
INDEX((0,1,2),(2,3,0),(4,5,6),(6,7,4),(2,1,5),(5,4,2),(3,2,7),(4,7,2),(0,3,7),(7,6,0),(1,0,5),(6,5,0)))
INDEXSURFACE M(
VERTEX(201755.424609375 241700.688720703 7025.00027160645,201755.424609375 241700.688720703 6774.9998336792, 202255.431298828 241700.688720703 6774.9998336792,202255.431298828 241700.688720703 7025.00027160645,202255.431298828 243149.418896484 6774.9998336792,201755.424609375 243149.418896484 6774.9998336792,201755.424609375 243149.418896484 7025.00027160645,202255.431298828 243149.418896484 7025.00027160645),
INDEX((0,1,2),(2,3,0),(4,5,6),(6,7,4),(2,1,5),(5,4,2),(3,2,7),(4,7,2),(0,3,7),(7,6,0),(1,0,5),(6,5,0)))
TRIANGLESTRIP
TRIANGLESTRIP WKT由TriangleStrip关键字构成,后续包含所有的坐标串信息,示例如下:
TRIANGLESTRIP(0 0 1 1,0 10 2 2,10 10 3 3,10 0 4 4)
同样支持Z和M值:
TRIANGLESTRIP Z(0 0 1,0 10 2,10 10 3,10 0 4)
TRIANGLESTRIP M(0 0 1,0 10 2,10 10 3,10 0 4)
TRIANGLESTRIP ZM(0 0 1 1,0 10 2 2,10 10 3 3,10 0 4 4)
TRIANGLEFAN
TRIANGLEFAN WKT由TriangleStrip关键字构成,后续包含所有的坐标串信息,示例如下:
TRIANGLEFAN(0 0 1 1,0 10 2 2,10 10 3 3,10 0 4 4)
同样支持Z和M值:
TRIANGLEFAN Z(0 0 1,0 10 2,10 10 3,10 0 4)
TRIANGLEFAN M(0 0 1,0 10 2,10 10 3,10 0 4)
TRIANGLEFAN ZM(0 0 1 1,0 10 2 2,10 10 3 3,10 0 4 4)
MESHGEOM
MeshGeom WKT由关键字MESHGEOM构成,包含PATCH、NORMAL和TEXCOORD三类关键字:
PATCH
存储几何类型以及坐标信息。可以有一个或多个子对象构成,每个子对象之间使用
","
进行分隔。允许的子对象几何类型如下:Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon、IndexSurface、TriangleStrip、TriangleFan。
示例如下:
PATCH(POINT(0 0 1)) PATCH( POINT(0 0 1), TRIANGLESTRIP(0 0 1,0 10 2,10 10 3,10 0 4) )
NORMAL
包含法向量信息,类型为三维点坐标,坐标串间使用
","
进行分隔;使用"()"
对每一个子对象进行包裹;坐标点数必须与Patch子对象中顶点个数一致。示例如下:
NORMAL( (0 0 0, 1 1 1,2 2 2, 3 3 3) ) NORMAL( (0 0 0, 1 1 1,2 2 2, 3 3 3), (1 2 1, 3 3 4) )
TEXCOORD
包含纹理坐标信息,类型为二维点坐标,坐标串间使用
","
进行分隔;使用"()"
对每一个子对象进行包裹;坐标点数必须与Patch对应子对象顶点个数一致。示例如下:
TEXCOORD( (0 0, 1 1, 2 2, 3 3) ) TEXCOORD( (0 0, 1 1, 2 2, 3 3), (1 1, 0 0, 2 2, 3 3) )
Meshgeom示例
以下示例展示了Meshgeom的WKT的表示方法:
2个patch
MESHGEOM( PATCH( POINT(0 0 1), INDEXSURFACE(VERTEX(0 0 1,0 10 2,10 10 3,10 0 4), INDEX((0,1,2),(1,2,3))) ) )
带有NORMAL和TEXCOORD
MESHGEOM( PATCH( TRIANGLESTRIP(0 0 1,0 10 2,10 10 3,10 0 4) ), NORMAL( (0 0 0, 1 1 1,2 2 2, 3 3 3) ), TEXCOORD( (0 0, 1 1, 2 2, 3 3) ) )
Meshgeom同样支持Z和M维度,要求Meshgeom中所有patch的维度必须一致。
MESHGEOM( PATCH( POINT M(0 0 1), INDEXSURFACE M( VERTEX(0 0 1,0 10 2,10 10 3,10 0 4), INDEX((0,1,2),(1,2,3)) ) ) )
引用对象
Meshgeom支持对其他meshgeom对象的引用,包含schema, table,column和key四个关键字,其中后三个为必须的内容,字符串使用"@"
进行包裹,具体格式如下:
MESHGEOM(
schema(@schema_name@),
table(@table_name@),
column(@column_name@),
key(@where_clause@)
)
示例如下:
MESHGEOM(
schema(@public@),
table(@mytable@),
column(@mycolumn@),
key(@id=1@)
)
SFMESH
sfmesh使用JSON作为WKT的表示方法,包含以下节点信息:
version:sfmesh的版本,目前为1。
srid:空间参考ID。
lod:LOD的层级信息。
root:Node的根目录ID,默认为0。
meshgeoms:所有引用到的meshgeom对象的数组,可以为引用对象,采用meshgeom的WKT表示方法。
meshes:所有基于Node引用到的sfmesh对象的数组,可以为引用对象,采用sfmesh的WKT表示方法。
textures:所用的texture的对象数组。
materials:所有材质的对象数组。
primitives:所有的元组信息的数组,元组包含两种:meshgeom和mesh。 其中meshgeom可以带材质信息,通过material关键字进行绑定。
nodes:通过Node可以定义树状结构,进行组织构建。可以包含以下属性:
primitive:对应的primitive的信息。
children:子对象数组。
id:对象关联的ID信息。
matrix:变换矩阵,采用以下方式进行描述。
/ a b c xoff \ | d e f yoff | | g h i zoff | \ 0 0 0 1 /
Sfmesh示例
以下为一个典型的JSON表示sfmesh对象的示例:
{
"version": 1,
"root": 0,
"meshgeoms": ["MESHGEOM(PATCH(TRIANGLESTRIP(0 0,0 10,10 10,10 0)))"],
"meshes": [
"MESH(schema(@public@), table(@t_mesh@), column(@the_mesh@), key(@num=1@))"
],
"primitives": [
{
"mesh": 0
},
{
"meshgeom": 0
}
],
"nodes": [
{
"children": [1, 2],
"id": 100
},
{
"primitive": 0
},
{
"primitive": 1,
"matrix": [2, 0, 0, 1, 0, 2, 0, 3, 0, 0, 2, 4, 0, 0, 0, 1],
"id": 10
}
],
"materials": [
{
"type": "db",
"attributes": {
"schema": "public",
"table": "t_material",
"column": "the_material",
"key": "num=1"
}
}
],
"textures": [
{
"compressionType": "None",
"format": "JPEG",
"wrap": "Wrap",
"type": "Url",
"depth": 3,
"width": 256,
"height": 256,
"size": 15,
"data": "http://aaa.png"
}
]
}
引用对象
sfmesh支持对其他sfmesh对象的引用,包含schema, table,column和key四个关键字,其中后三个为必须的内容,字符串使用"@"
进行包裹,格式如下:
MESH(
schema(@schema_name@),
table(@table_name@),
column(@column_name@),
key(@where_clause@)
)
示例如下:
MESH(
schema(@public@),
table(@mytable@),
column(@mycolumn@),
key(@id=1@)
)
EWKT
EWKT在WKT的基础上增加了SRID和SOLID信息,每一段使用;
进行分隔:
SRID表示空间参考信息,具体请参见空间参考。
SOLID表示内部是否填充。取值如下:
true:表示内部填充。
false(默认):表示内部不填充。
示例如下:
SRID=4326;MESHGEOM(PATCH(INDEXSURFACE M(VERTEX(0 0 1,0 10 2,10 10 3,10 04), INDEX((0,1,2),(1,2,3)))))
SRID=4326;SOLID=true;MESHGEOM(PATCH(INDEXSURFACE M(VERTEX(0 0 1,0 10 2,1010 3,10 0 4), INDEX((0,1,2),(1,2,3)))))