Speichern der GML-Oberfläche in PostGIS

9

Ich verwende PostGIS 2.0.0 und möchte eine GML-Oberfläche so speichern, dass Schnittpunkte zwischen dieser Oberfläche und verschiedenen Punkten und Linien berechnet werden können. In meinem Fall hat die Oberfläche ein PolygonPatch ohne Innenringe und einen Außenring, der ein LineStringSegment, eine Geodät, ein Bogen oder ein Kreis sein kann. Die Entfernungen können in der Größenordnung von zehn bis Hunderten von Meilen liegen. Ich sehe, dass PostGIS CIRCULARSTRINGund hat CURVEPOLYGON, was eine gute Möglichkeit zum Speichern eines Bogens zu sein scheint, außer dass sie nicht nur vom geographyTyp unterstützt werden geometry. Was wäre der beste Weg, dies zu speichern? (Ich bin ziemlich neu in PostGIS und GIS im Allgemeinen, daher ist es durchaus möglich, dass mir etwas Offensichtliches fehlt.)

EM0
quelle
Sie können GML unverändert in Postgis speichern. postgis.refractions.net/documentation/manual-svn/…
Mapperz
Einige Erklärungen hier zu den Geometrie- und Geografietypen von PostGIS postgis.refractions.net/docs/…
canisrufus

Antworten:

4

ST_GeomFromGML

Sie können Ihre GML-Features als PostGIS-Geometriedatentyp speichern, indem Sie die Funktion ST_GeomFromGML verwenden, mit der Ihre GML in den Geometriedatentyp konvertiert wird. Zu Ihrer Information: Es gibt ähnliche Funktionen für KML, WKT und so weiter.

mach einfach so etwas wie:

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

Sobald Sie es im Geometriefeld haben, können Sie alle lustigen Schnittpunkte und Dinge tun, die Sie in PostGIS tun möchten

Anschließend können Sie Ihr Ergebnis mit ST_AsGML wieder im GML-Format ausspucken

EDIT # 1 Ich glaube, Sie suchen:

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

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

EDIT # 2

Ich verwende "POSTGIS =" 1.5.2 "(ältere Version als Sie) und die folgende Anweisung funktioniert einwandfrei:

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

Sie müssen eine Kombination von Funktionen verwenden, um das zu erhalten, was Sie benötigen.

distance_spheroid unterstützt CIRCULARSTRING nicht, da es die Geometriedatentypen berücksichtigt.

Bitte fügen Sie Ihrer ursprünglichen Frage eine BEARBEITUNG mit einem Beispiel-GML hinzu, mit dem Sie Probleme haben, und ich werde die Aussagen für Sie aufschreiben.

CaptDragon
quelle
Danke, aber der Import aus GML ist nicht wirklich das Kernproblem. Die Hauptfrage ist, wie die Daten so gespeichert werden können, dass genaue Berechnungen möglich sind. Soweit ich weiß, würde der Geometrietyp dafür nicht gut funktionieren, da er auf einer Ebene basiert und der Geografietyp keine Kurven unterstützt.
EM0
@EM: Überprüfen Sie meine EDIT # 1
CaptDragon
Danke, habe es versucht, aber leider unterstützen sie keine CIRCULARSTRINGs.
EM0
@EM: Überprüfen Sie meine EDIT # 2
CaptDragon
Ja, die Anweisung zum Erstellen eines CIRCULARSTRING funktioniert, aber Entfernungsberechnungen für diese Zeichenfolge verwenden, wie ich verstehe, eine Ebene, da sie vom Typ "Geometrie" ist. Wie auch immer, ich werde versuchen, die Daten auf zwei Arten zu speichern - den genauen Wert als CIRCULARSTRING (Geometrie) und den mit ST_CurveToLine generierten ungefähren Wert (Geografie).
EM0
2

Am Ende gab ich es auf, den "exakten" Bogen oder Kreis zu speichern. Beim Importieren eines GML-Bogens (der durch 3 Punkte auf dem Bogen definiert ist) erstelle ich vorübergehend eine Geometrie CIRCULARSTRINGund konvertiere sie dann wie folgt in eine Geografie:

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

Beim Importieren eines GML ArcByCenterPoint (definiert durch den Mittelpunkt, den Radius sowie den Start- und Endwinkel) approximiere ich ihn direkt, indem ich Punkte in Intervallen von 1 Grad vom Startwinkel zum Endwinkel projiziere. Dies erfolgt auf einer Kugel, nicht auf einem Sphäroid, daher ist es nicht ganz genau, aber es gibt PostGIS-Tickets, um die Azimut- und Punktprojektion für den Geografietyp zu implementieren . Gleiches gilt für einen Kreis.

EM0
quelle