Memorizzazione della superficie GML in PostGIS


9

Sto usando PostGIS 2.0.0 e vorrei memorizzare una superficie GML in modo da consentire il calcolo delle intersezioni tra quella superficie e vari punti e linee. Nel mio caso, Surface avrà un PolygonPatch senza anelli interni e un anello esterno che può essere un LineStringSegment, un geodetico, un arco o un cerchio. Le distanze possono essere dell'ordine di decine a centinaia di miglia. Vedo che PostGIS ha CIRCULARSTRINGe CURVEPOLYGON, che sembra essere un buon modo per memorizzare un arco, tranne che non sono supportati dal geographytipo, solo geometry. Quale sarebbe il modo migliore per archiviarlo? (Sono abbastanza nuovo per PostGIS e GIS in generale, quindi è del tutto possibile che mi manchi qualcosa di ovvio.)


Puoi archiviare GML in Postgis così com'è. postgis.refractions.net/documentation/manual-svn/…
Mapperz

Alcune spiegazioni qui sui tipi di geometria e geografia di PostGIS postgis.refractions.net/docs/…
canisrufus,

Risposte:


4

ST_GeomFromGML

Puoi memorizzare le tue funzioni GML come un tipo di dati Geometria PostGIS usando la funzione ST_GeomFromGML che convertirà il tuo GML nel tipo di dati Geometria. Cordiali saluti: Esistono funzioni simili per KML, WKT e così via.

fai qualcosa come:

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

Una volta che lo hai nel campo della geometria, puoi fare tutte le intersezioni divertenti e le cose che vuoi fare in PostGIS

Quindi puoi restituire il risultato in formato GML usando ST_AsGML

EDIT # 1 Credo che tu stia cercando:

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

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

EDIT # 2

Sto usando "POSTGIS =" 1.5.2 "(versione precedente di te) e la seguente dichiarazione funziona bene:

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

Devi usare una combinazione di funzioni per ottenere ciò di cui hai bisogno.

distance_spheroid non supporta CIRCULARSTRING perché include i tipi di dati della geometria.

Aggiungi un EDIT alla tua domanda originale con un pezzo di GML di esempio con cui stai riscontrando problemi e scriverò le dichiarazioni per te.


Grazie, ma l'importazione da GML non è davvero il problema principale. La domanda principale riguarda come archiviare i dati in modo da consentire calcoli accurati. A quanto ho capito, il tipo di geometria non funzionerebbe bene, poiché si basa su un piano e il tipo di geografia non supporta le curve.
EM0

@EM: Controlla il mio EDIT n. 1
CaptDragon

Grazie, ho provato quelli, ma sfortunatamente non supportano CIRCULARSTRING.
EM0

@EM: Controlla il mio EDIT # 2
CaptDragon

Sì, l'istruzione per creare un CIRCULARSTRING funziona, ma i calcoli della distanza su quella stringa utilizzano un piano, a quanto ho capito, perché è di tipo "geometria". In ogni caso, proverò a memorizzare i dati in due modi: il valore esatto come CIRCULARSTRING (geometria) e il valore approssimativo (geografia) generato usando ST_CurveToLine.
EM0

2

Alla fine ho rinunciato a memorizzare l'arco o il cerchio "esatto". Quando si importa un arco GML (che è definito da 3 punti sull'arco) creo temporaneamente una geometria CIRCULARSTRING, quindi la converto in geografia, in questo modo:

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

Quando si importa un ArcByCenterPoint GML (che è definito dal punto centrale, dal raggio e dagli angoli iniziale e finale), lo approssimo direttamente proiettando i punti a intervalli di 1 grado dall'angolo iniziale a quello finale. Questo viene fatto su una sfera, non sferoide, quindi non è del tutto esatto, ma ci sono biglietti PostGIS per implementare l' azimut e la proiezione puntuale per il tipo di geografia. Lo stesso per un cerchio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.