Almacenar la superficie GML en PostGIS

9

Estoy usando PostGIS 2.0.0 y me gustaría almacenar una superficie GML de una manera que permita calcular las intersecciones entre esa superficie y varios puntos y líneas. En mi caso, la Surface tendrá un PolygonPatch sin anillos interiores y un anillo exterior que puede ser un LineStringSegment, un Geodesic, un Arc o un Circle. Las distancias pueden ser del orden de decenas a cientos de millas. Veo que PostGIS tiene CIRCULARSTRINGy CURVEPOLYGON, lo que parece ser una buena manera de almacenar un Arc, excepto que no son compatibles con el geographytipo, solo geometry. ¿Cuál sería la mejor manera de almacenar esto? (Soy bastante nuevo en PostGIS y GIS en general, por lo que es muy posible que me falte algo obvio).

EM0
fuente
Puede almacenar GML en postgis tal cual. postgis.refractions.net/documentation/manual-svn/…
Mapperz
Alguna explicación aquí sobre los tipos de geometría y geografía de PostGIS postgis.refractions.net/docs/…
canisrufus

Respuestas:

4

ST_GeomFromGML

Puede almacenar sus características GML como un tipo de datos de Geometría PostGIS utilizando la función ST_GeomFromGML que convertirá su GML al tipo de datos de geometría. FYI: Hay funciones similares para KML, WKT, etc.

solo haz algo como:

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 vez que lo tenga en el campo de geometría, puede hacer todas las intersecciones divertidas y las cosas que desea hacer en PostGIS

Luego puede escupir su resultado nuevamente en formato GML usando ST_AsGML

EDITAR # 1 Creo que estás buscando:

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

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

EDITAR # 2

Estoy usando "POSTGIS =" 1.5.2 "(versión anterior que usted) y la siguiente declaración funciona bien:

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

Debe usar una combinación de funciones para obtener lo que necesita.

distance_spheroid no es compatible con CIRCULARSTRING porque toma en los tipos de datos de geometría.

Agregue un EDITAR a su pregunta original con una muestra de GML con la que tiene problemas y escribiré las declaraciones por usted.

CaptDragon
fuente
Gracias, pero importar desde GML no es realmente el problema principal. La pregunta principal es cómo almacenar los datos de una manera que permita cálculos precisos. Según tengo entendido, el tipo de geometría no funcionaría bien para eso, ya que se basa en un plano, y el tipo de geografía no admite curvas.
EM0
@EM: Revisa mi EDIT # 1
CaptDragon
Gracias, probé esos, pero desafortunadamente no son compatibles con CIRCULARSTRING.
EM0
@EM: Revisa mi EDIT # 2
CaptDragon
Sí, la declaración para crear una CIRCULARSTRING funciona, pero los cálculos de distancia en esa cadena usan un plano, según tengo entendido, porque es de tipo "geometría". De todos modos, voy a intentar almacenar los datos de dos maneras: el valor exacto como CIRCULARSTRING (geometría) y el valor aproximado (geografía) generado usando ST_CurveToLine.
EM0
2

Al final dejé de almacenar el arco o círculo "exacto". Al importar un arco GML (que está definido por 3 puntos en el arco) creo temporalmente una geometría CIRCULARSTRING, luego la convierto a geografía, así:

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

Al importar un GML ArcByCenterPoint (que se define por el punto central, el radio y los ángulos de inicio y finalización), lo aproximo directamente proyectando puntos a intervalos de 1 grado desde el ángulo inicial hasta el ángulo final. Esto se hace en una esfera, no en un esferoide, por lo que no es del todo exacto, pero hay tickets de PostGIS para implementar el acimut y la proyección de puntos para el tipo de geografía. Lo mismo para un círculo.

EM0
fuente