Stockage d'une surface GML dans PostGIS

9

J'utilise PostGIS 2.0.0 et j'aimerais stocker une surface GML de manière à permettre le calcul des intersections entre cette surface et divers points et lignes. Dans mon cas, la Surface aura un PolygonPatch sans anneaux intérieurs et un anneau extérieur qui peut être un LineStringSegment, un Geodesic, un Arc ou un Circle. Les distances peuvent être de l'ordre de quelques dizaines à plusieurs centaines de kilomètres. Je vois que PostGIS a CIRCULARSTRINGet CURVEPOLYGON, ce qui semble être un bon moyen de stocker un Arc, sauf qu'ils ne sont pas pris en charge par le geographytype, uniquement geometry. Quelle serait la meilleure façon de stocker cela? (Je suis assez nouveau sur PostGIS et SIG en général, il est donc tout à fait possible que je manque quelque chose d'évident.)

EM0
la source
Vous pouvez stocker GML tel quel dans postgis. postgis.refractions.net/documentation/manual-svn/…
Mapperz
Quelques explications ici sur la géométrie et les types de géographie de PostGIS postgis.refractions.net/docs/…
canisrufus

Réponses:

4

ST_GeomFromGML

Vous pouvez stocker vos entités GML en tant que type de données PostGIS Geometry en utilisant la fonction ST_GeomFromGML qui convertira votre GML en type de données geometry. FYI: Il existe des fonctions similaires pour KML, WKT, etc.

faites juste quelque chose comme:

INSERT into myTable (mygeomField) values (ST_GeomFromGML('
    <gml:LineString srsName="EPSG:4269">
        <gml:coordinates>
            -71.16028,42.258729 -71.160837,42.259112 -71.161143,42.25932
        </gml:coordinates>
    </gml:LineString>'));

Une fois que vous l'avez dans le champ géométrique, vous pouvez faire tous les intersections amusantes et tout ce que vous voulez faire dans PostGIS

Ensuite, vous pouvez cracher votre résultat au format GML à l'aide de ST_AsGML

EDIT # 1 Je crois que vous recherchez:

http://postgis.net/docs/ST_Distance_Sphere.html

http://postgis.net/docs/ST_Distance_Spheroid.html

EDIT # 2

J'utilise "POSTGIS =" 1.5.2 "(une version plus ancienne que vous) et la déclaration suivante fonctionne très bien:

select ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)')

Vous devez utiliser une combinaison de fonctions pour obtenir ce dont vous avez besoin.

distance_spheroid ne prend pas en charge CIRCULARSTRING car il prend en charge les types de données de géométrie.

Veuillez ajouter une MODIFICATION à votre question d'origine avec un échantillon de GML avec lequel vous rencontrez des problèmes et je vais écrire les déclarations pour vous.

CaptDragon
la source
Merci, mais l'importation à partir de GML n'est pas vraiment le problème principal. La principale question est de savoir comment stocker les données de manière à permettre des calculs précis. Si je comprends bien, le type de géométrie ne fonctionnerait pas bien pour cela, car il est basé sur un plan et le type de géographie ne prend pas en charge les courbes.
EM0
@EM: Vérifiez mon EDIT # 1
CaptDragon
Merci, j'ai essayé ceux-ci, mais malheureusement ils ne prennent pas en charge les CIRCULARSTRING.
EM0
@EM: Vérifiez mon EDIT # 2
CaptDragon
Oui, la déclaration pour créer un CIRCULARSTRING fonctionne, mais les calculs de distance sur cette chaîne utilisent un plan, si je comprends bien, car il est de type "géométrie". Quoi qu'il en soit, je vais essayer de stocker les données de deux manières - la valeur exacte en tant que CIRCULARSTRING (géométrie) et la valeur approximative (géographie) générée à l'aide de ST_CurveToLine.
EM0
2

En fin de compte, j'ai renoncé à stocker l'arc ou le cercle "exact". Lors de l'importation d'un arc GML (qui est défini par 3 points sur l'arc), je crée temporairement une géométrie CIRCULARSTRING, puis la convertis en géographie, comme ceci:

ST_RemoveRepeatedPoints(ST_CurveToLine(ST_GeomFromText('CIRCULARSTRING(...)', 4326)))::geography

Lors de l'importation d'un GML ArcByCenterPoint (qui est défini par le point central, le rayon et les angles de début et de fin), je l'approche directement en projetant les points à des intervalles de 1 degré de l'angle de départ à l'angle de fin. Cela se fait sur une sphère, pas sphéroïdale, donc ce n'est pas entièrement précis, mais il existe des tickets PostGIS pour implémenter l' azimut et la projection ponctuelle pour le type géographique. Pareil pour un cercle.

EM0
la source