名稱

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 是標準資料庫順序),預設值,以及非空間座標(只是普通的座標標籤)。

  • 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 索引。

此函數支援多面體表面。

此函數支援三角形和三角不規則網路表面 (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>