名称

ST_AsX3D — 以 X3D xml 节点元素格式返回几何图形:ISO-IEC-19776-1.2-X3DEncodings-XML

概要

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

描述

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

[Note]

由于 X3D 几何类型不能直接映射到 PostGIS 几何类型,并且某些更新的 X3D 类型可能具有更好的映射,但我们避免使用这些类型,因为大多数渲染工具目前不支持它们,因此存在将 PostGIS 几何图形转换为 X3D 的各种选项。 这些是我们确定的映射。 如果您对此想法有任何想法或有任何方法可以让人们表示他们首选的映射,请随时发布错误报告。

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

'options' 参数是一个位字段。 对于 PostGIS 2.2+,它用于指示是否使用 X3D GeoCoordinates 地理空间节点表示坐标,以及是否翻转 x/y 轴。默认情况下,ST_AsX3D 以数据库形式(经度、纬度或 X、Y)输出,但 X3D 默认的纬度/经度、y/x 可能更受欢迎。

  • 0:以数据库顺序排列的 X/Y(例如,经度/纬度 = X,Y 是标准数据库顺序),默认值,以及非空间坐标(只是普通的旧 Coordinate 标签)。

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

  • 2:以 GeoSpatial GeoCoordinates 输出坐标。如果几何图形不是 WGS 84 经度纬度(srid: 4326),则此选项将抛出错误。这是目前唯一支持的 GeoCoordinate 类型。 请参阅指定空间参考系统的 X3D 规范。 默认输出将为 GeoCoordinate geoSystem='"GD" "WE" "longitude_first"'。 如果您更喜欢 X3D 默认的 GeoCoordinate geoSystem='"GD" "WE" "latitude_first"',请使用 (2 + 1) = 3

PostGIS 类型 2D X3D 类型 3D X3D 类型
LINESTRING 尚未实现 - 将为 PolyLine2D LineSet
MULTILINESTRING 尚未实现 - 将为 PolyLine2D IndexedLineSet
MULTIPOINT Polypoint2D PointSet
POINT 输出以空格分隔的坐标 输出以空格分隔的坐标
(MULTI) POLYGON, POLYHEDRALSURFACE 无效的 X3D 标记 IndexedFaceSet(内部环当前作为另一个面集输出)
TIN TriangleSet2D(尚未实现) IndexedTriangleSet
[Note]

2D 几何支持尚未完成。 内部环目前仅作为单独的多边形绘制。 我们正在努力解决这些问题。

3D 空间正在发生许多进步,尤其是在 X3D 与 HTML5 的集成方面

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

另请查看 PostGIS 极简 X3D 查看器,它使用了此函数和 x3dDom html/js 开源工具包

可用性:2.0.0:ISO-IEC-19776-1.2-X3DEncodings-XML

增强功能:2.2.0:支持 GeoCoordinates 和轴(x/y,经度/纬度)翻转。 请查看选项了解详细信息。

此函数支持 3d,不会删除 z-index。

此函数支持多面体表面。

此函数支持三角形和三角不规则网络表面 (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>