文档

WKT

更新时间:

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)))))