名称

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]

将 PostGIS 几何图形转换为 X3D 有多种选项,因为 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,默认值,以及非空间坐标(只是常规旧坐标标记)。

  • 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尚未实现 - 将是 PolyLine2DLineSet
MULTILINESTRING尚未实现 - 将是 PolyLine2DIndexedLineSet
MULTIPOINTPolypoint2DPointSet
POINT输出以空格分隔的坐标输出以空格分隔的坐标
(MULTI) POLYGON, POLYHEDRALSURFACE无效的 X3D 标记IndexedFaceSet(目前将内部环输出为另一个面集)
TINTriangleSet2D(尚未实现)IndexedTriangleSet
[Note]

2D 几何支持尚未完成。目前只是将内部环绘制为单独的多边形。我们正在处理这些问题。

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

还有一个不错的开源 X3D 查看器,可用于查看渲染的几何图形。适用于 Mac、Linux 和 Windows 的免费 Wrl http://freewrl.sourceforge.net/ 二进制文件。使用 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 索引。

此功能支持多面体表面。

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