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。
有多种选项可用于将 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(索引三角形集) |
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)。
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>
将此查询的输出复制并粘贴到 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);
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>
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>