Name

ST_AsX3D — 返回X3DXML节点元素格式的几何图形:ISO-IEC-19776-1.2-X3DEncoding-xml

Synopsis

text ST_AsX3D(geometry g1, integer maxdecimaldigits=15, integer options=0);

描述

将几何作为X3D XML格式的节点元素返回 http://www.web3d.org/standards/number/19776-1 。如果 maxdecimaldigits (精度)未指定,则默认为15。

[Note]

将PostGIS几何图形转换为X3D有多种选择,因为X3D几何图形类型不直接映射到PostGIS几何图形类型和一些较新的X3D类型,这些类型可能是我们避免的更好的映射,因为大多数渲染工具目前不支持它们。这些是我们已经确定的映射。如果您对我们的想法或方法有任何想法,或者我们可以让人们指明他们喜欢的映射,请随时发布错误罚单。

下面是我们当前如何将PostGIS 2D/3D类型映射到X3D类型

‘Options’参数是一个位字段。对于PostGIS 2.2+,这用于指示是否使用X3D地理坐标地理空间节点来表示坐标,以及是否翻转x/y轴。默认情况下, ST_AsX3D 数据库形式的输出(Long,Lat或X,Y),但X3D默认的经度/经度,y/x可能是首选。

  • 0:数据库顺序中的X/Y(例如,LONG/LAT=X,Y是标准数据库顺序)、默认值和非空间坐标(只是常规的旧坐标标记)。

  • 1:翻转X和Y。如果与地理坐标选项开关一起使用,则输出将是默认的“Latitude_First”,坐标也将被翻转。

  • 2:以地理空间地理坐标形式输出坐标。如果几何图形不在WGS 84 Long Late(SRID:4326)中,则此选项将引发错误。这是目前唯一受支持的地理坐标类型。 请参考指定空间参考系的X3D等级库。 。默认输出将为 GeoCoordinate geoSystem='"GD" "WE" "longitude_first"' 。如果您更喜欢X3D缺省值 GeoCoordinate geoSystem='"GD" "WE" "latitude_first"' 使用 (2 + 1) = 3

邮政编码类型2D X3D类型3D X3D类型
LINESTRING尚未实施-将为PolyLine2DLineSet
MULTILINESTRING尚未实施-将为PolyLine2DIndexedLineSet
MULTIPOINT多点二维PointSet
POINT输出以空格分隔的坐标输出以空格分隔的坐标
(多)多边形、多面体曲面无效的X3D标记IndexedFaceSet(内环当前作为另一个面输出)
TIN TriangleSet2D(尚未实现)IndexedTriangleSet
[Note]

二维几何图形支持尚未完成。内环当前仅绘制为单独的多边形。我们正在努力解决这些问题。

在3D空间中发生了许多进步,特别是 X3D与HTML5的集成

还有一个很好的开源X3D查看器,可以用来查看渲染的几何图形。免费WRL http://freewrl.sourceforge.net/ 可用于Mac、Linux和Windows的二进制文件。使用打包的FreeWRL_Launcher查看几何图形。

还可以结账 PostGIS极简主义X3D查看器 利用此函数并 X3dDom html/js开源工具包

可用性:2.0.0:ISO-IEC-19776-1.2-X3D编码-可扩展标记语言

增强:2.2.0:支持地理坐标和轴(x/y,经度/经度)翻转。请查看选项以了解详细信息。

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

示例:创建一个功能齐全的X3D文档--这将生成一个可在FreeWrl和其他X3D查看器中查看的立方体。

SELECT '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd">
<X3D>
  <Scene>
    <Transform>
      <Shape>
       <Appearance>
            <Material emissiveColor=''0 0 1''/>
       </Appearance> ' ||
       ST_AsX3D( ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)),
((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)),
((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)),
((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')) ||
      '</Shape>
    </Transform>
  </Scene>
</X3D>' As x3ddoc;

                x3ddoc
                --------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd">
<X3D>
  <Scene>
    <Transform>
      <Shape>
       <Appearance>
            <Material emissiveColor='0 0 1'/>
       </Appearance>
       <IndexedFaceSet  coordIndex='0 1 2 3 -1 4 5 6 7 -1 8 9 10 11 -1 12 13 14 15 -1 16 17 18 19 -1 20 21 22 23'>
            <Coordinate point='0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 0 1 1' />
      </IndexedFaceSet>
      </Shape>
    </Transform>
  </Scene>
</X3D>

PostGIS建筑

将此查询的输出复制并粘贴到 X3D场景查看器 然后单击显示

SELECT string_agg('<Shape>' || ST_AsX3D(ST_Extrude(geom, 0,0, i*0.5)) ||
    '<Appearance>
          <Material diffuseColor="' || (0.01*i)::text || ' 0.8 0.2" specularColor="' || (0.05*i)::text || ' 0 0.5"/>
        </Appearance>
    </Shape>', '')
FROM ST_Subdivide(ST_Letters('PostGIS'),20) WITH ORDINALITY AS f(geom,i);

由PostGIS细分和拉伸形成的建筑物

示例:八角形提升了3个单位,小数精度为6

SELECT ST_AsX3D(
ST_Translate(
    ST_Force_3d(
        ST_Buffer(ST_Point(10,10),5, 'quad_segs=2')), 0,0,
    3)
  ,6) As x3dfrag;

x3dfrag
--------
<IndexedFaceSet coordIndex="0 1 2 3 4 5 6 7">
    <Coordinate point="15 10 3 13.535534 6.464466 3 10 5 3 6.464466 6.464466 3 5 10 3 6.464466 13.535534 3 10 15 3 13.535534 13.535534 3 " />
</IndexedFaceSet>

示例:TIN

SELECT ST_AsX3D(ST_GeomFromEWKT('TIN (((
                0 0 0,
                0 0 1,
                0 1 0,
                0 0 0
            )), ((
                0 0 0,
                0 1 0,
                1 1 0,
                0 0 0
            ))
            )')) As x3dfrag;

                x3dfrag
                --------
<IndexedTriangleSet  index='0 1 2 3 4 5'><Coordinate point='0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0'/></IndexedTriangleSet>

示例:闭合多线串(带洞的多边形的边界)

SELECT ST_AsX3D(
                    ST_GeomFromEWKT('MULTILINESTRING((20 0 10,16 -12 10,0 -16 10,-12 -12 10,-20 0 10,-12 16 10,0 24 10,16 16 10,20 0 10),
  (12 0 10,8 8 10,0 12 10,-8 8 10,-8 0 10,-8 -4 10,0 -8 10,8 -4 10,12 0 10))')
) As x3dfrag;

                x3dfrag
                --------
<IndexedLineSet  coordIndex='0 1 2 3 4 5 6 7 0 -1 8 9 10 11 12 13 14 15 8'>
    <Coordinate point='20 0 10 16 -12 10 0 -16 10 -12 -12 10 -20 0 10 -12 16 10 0 24 10 16 16 10 12 0 10 8 8 10 0 12 10 -8 8 10 -8 0 10 -8 -4 10 0 -8 10 8 -4 10 ' />
 </IndexedLineSet>