Name

ST_AsX3D — Renvoie une géométrie au format X3D xml node element : ISO-IEC-19776-1.2-X3DEncodings-XML

Synopsis

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

Description

Renvoie une géométrie sous la forme d'un élément de nœud X3D xml formaté http://www.web3d.org/standards/number/19776-1. Si maxdecimaldigits (précision) n'est pas spécifié, la valeur par défaut est 15.

[Note]

Il existe plusieurs options pour traduire les géométries PostGIS en X3D, car les types de géométrie X3D ne correspondent pas directement aux types de géométrie PostGIS, et nous avons évité certains types X3D plus récents qui pourraient constituer de meilleures correspondances, car la plupart des outils de rendu ne les prennent pas en charge actuellement. Ce sont les correspondances que nous avons choisies. N'hésitez pas à poster un ticket de bug si vous avez des idées sur l'idée ou sur la façon dont nous pouvons permettre aux gens de dénoter leurs correspondances préférées.

Voici comment nous faisons actuellement correspondre les types 2D/3D de PostGIS aux types X3D

L'argument 'options' est un champ de bits. Pour PostGIS 2.2+, il est utilisé pour indiquer si les coordonnées doivent être représentées avec le nœud géospatial X3D GeoCoordinates et si l'axe x/y doit être inversé. Par défaut, ST_AsX3D produit les données sous forme de base de données (long,lat ou X,Y), mais la valeur par défaut de lat/lon, y/x de X3D peut être préférée.

  • 0 : X/Y dans l'ordre de la base de données (par exemple long/lat = X,Y est l'ordre standard de la base de données), valeur par défaut, et coordonnées non spatiales (juste un bon vieux Coordinate tag).

  • 1 : Inverser X et Y. Si cette option est utilisée en conjonction avec l'option GeoCoordinate, la sortie sera par défaut "latitude_first" et les coordonnées seront également inversées.

  • 2 : Sortie des coordonnées enGeoSpatial GeoCoordinates. Cette option génère une erreur si les géométries ne sont pas en WGS 84 long lat (srid : 4326). C'est actuellement le seul type de GeoCoordinate pris en charge. Référence aux spécifications X3D spécifiant un système de référence spatiale.. La sortie par défaut sera GeoCoordinate geoSystem='"GD" "WE" "longitude_first"'. Si vous préférez la sortie par défaut X3D de GeoCoordinate geoSystem='"GD" "WE" "latitude_first"', utilisez (2 + 1) = 3

Type PostGIS Type 2D X3D Type 3D X3D
LINESTRING pas encore implémenté - sera PolyLine2D LineSet
MULTILINESTRING pas encore implémenté - sera PolyLine2D IndexedLineSet
MULTIPOINT Polypoint2D PointSet
POINT produit les coordonnées délimitées par l'espace produit les coordonnées délimitées par l'espace
(MULTI) POLYGON, POLYHEDRALSURFACE Balises X3D non valides IndexedFaceSet (les anneaux intérieurs sont actuellement édités sous la forme d'un autre jeu de faces)
TIN TriangleSet2D (Pas encore implémenté) IndexedTriangleSet
[Note]

La prise en charge de la géométrie 2D n'est pas encore terminée. Les anneaux intérieurs sont actuellement dessinés comme des polygones séparés. Nous y travaillons.

De nombreuses avancées ont lieu dans l'espace 3D, en particulier avec X3D Integration with HTML5

Il existe également une visionneuse X3D open source que vous pouvez utiliser pour visualiser les géométries rendues. Des binaires Wrl http://freewrl.sourceforge.net/ gratuits sont disponibles pour Mac, Linux et Windows. Utilisez le FreeWRL_Launcher pour visualiser les géométries.

Consultez également PostGIS minimalist X3D viewer qui utilise cette fonction et x3dDom html/js open source toolkit.

Disponibilité : 2.0.0: ISO-IEC-19776-1.2-X3DEncodings-XML

Amélioration : 2.2.0 : Prise en charge des coordonnées géographiques et de l'inversion des axes (x/y, long/lat). Voir les options pour plus de détails.

Cette fonction prend en charge la 3D et ne supprime pas l'indice z.

Cette fonction prend en charge les surfaces Polyhedral.

Cette fonction prend en charge les triangles et les réseaux irréguliers triangulés (TIN).

Exemple : Créer un document X3D entièrement fonctionnel - Cela permet de générer un cube qui peut être visualisé dans FreeWrl et d'autres visionneuses 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>

Bâtiments PostGIS

Copiez et collez le résultat de cette requête dans x3d scene viewer et cliquez sur Show

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);

Bâtiments formés par subdivision PostGIS et extrusion

Exemple : Un octogone élevé à 3 unités et une précision décimale de 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>

Exemple : 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>

Exemple : multiligne fermée (la limite d'un polygone avec des trous)

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>