Name

ST_AsX3D — 返回 X3D xml 节点元素格式的几何图形:ISO-IEC-19776-1.2-X3DEncodings-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 类型

“选项”参数是一个位字段。 对于 PostGIS 2.2 ,这用于表示是否用 X3D GeoCooperatives 地理空间节点表示坐标以及是否翻转 x/y 轴。 默认情况下,ST_AsX3D 以数据库形式输出(long、lat 或 X、Y),但 X3D 默认为 lat/lon、y/x 可能是首选。

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

  • 1:翻转X和Y。如果与地理坐标选项开关结合使用,则输出将默认为“latitude_first”,并且坐标也会翻转。

  • 2:GeoSpatial GeoCoordinates 中的输出坐标。 如果几何图形不在 WGS 84 长纬度 (srid: 4326) 中,此选项将引发错误。 这是目前唯一支持的地理坐标类型。 请参阅指定空间参考系统的 X3D 规范。默认输出将为 GeoCoordinate geoSystem='"GD" "WE" "longitude_first"'。 如果您更喜欢 GeoCoordinate geoSystem='"GD" "WE" "latitude_first"' 的 X3D 默认值,请使用 (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:添加了对反转地理坐标和轴(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>