Armazenando superfície GML no PostGIS

9

Estou usando o PostGIS 2.0.0 e gostaria de armazenar uma superfície GML de uma maneira que permita calcular interseções entre essa superfície e vários pontos e linhas. No meu caso, o Surface terá um PolygonPatch sem anéis internos e um anel externo que pode ser um LineStringSegment, um Geodesic, um arco ou um círculo. As distâncias podem ser da ordem de dezenas a centenas de quilômetros. Vejo que o PostGIS possui CIRCULARSTRINGe CURVEPOLYGON, o que parece ser uma boa maneira de armazenar um arco, exceto que eles não são suportados apenas pelo geographytipo geometry. Qual seria a melhor maneira de armazenar isso? (Eu sou muito novo no PostGIS e GIS em geral, então é perfeitamente possível que eu esteja perdendo algo óbvio.)

EM0
fonte
Você pode armazenar o GML no postgis como está. postgis.refractions.net/documentation/manual-svn/…
Mapperz
Alguma explicação aqui sobre os tipos de geometria e geografia do PostGIS postgis.refractions.net/docs/...
canisrufus

Respostas:

4

ST_GeomFromGML

Você pode armazenar seus recursos GML como um tipo de dados PostGIS Geometry usando a função ST_GeomFromGML, que converterá seu GML no tipo de dados geometry. FYI: Existem funções semelhantes para KML, WKT e assim por diante.

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

Depois de tê-lo no campo de geometria, você pode fazer toda a diversão que se cruza e o que você deseja fazer no PostGIS

Em seguida, você pode cuspir seu resultado novamente no formato GML usando ST_AsGML

EDIT # 1 Eu acredito que você está procurando:

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

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

EDIT # 2

Estou usando "POSTGIS =" 1.5.2 "(versão mais antiga que você) e a seguinte instrução funciona perfeitamente:

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

Você precisa usar uma combinação de funções para obter o que precisa.

distance_spheroid não suporta CIRCULARSTRING porque recebe os tipos de dados geométricos.

Adicione uma edição à sua pergunta original com uma amostra de GML com a qual você está tendo problemas e eu escreverei as instruções para você.

CaptDragon
fonte
Obrigado, mas importar do GML não é realmente o principal problema. A principal questão é sobre como armazenar os dados de uma maneira que permita cálculos precisos. Pelo que entendi, o tipo de geometria não funcionaria bem para isso, pois é baseado em um plano, e o tipo de geografia não suporta curvas.
EM0 4/11/11
@EM: Verifique meu EDIT # 1
CaptDragon
Obrigado, tentei, mas infelizmente eles não suportam CIRCULARSTRINGs.
EM0 7/11/11
@EM: Verifique meu EDIT # 2
CaptDragon
Sim, a instrução para criar uma CIRCULARSTRING funciona, mas os cálculos de distância nessa sequência usam um plano, pelo que entendi, porque é do tipo "geometria". De qualquer forma, vou tentar armazenar os dados de duas maneiras - o valor exato como CIRCULARSTRING (geometria) e o valor aproximado (geografia) gerado usando ST_CurveToLine.
EM0
2

No final, desisti de armazenar o arco ou círculo "exato". Ao importar um arco GML (que é definido por 3 pontos no arco), crio temporariamente uma geometria CIRCULARSTRINGe depois a converto em geografia, da seguinte maneira:

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

Ao importar um GML ArcByCenterPoint (que é definido pelo ponto central, raio e ângulos de início e fim), eu o aproximo diretamente projetando pontos em intervalos de 1 grau, do ângulo inicial ao ângulo final. Isso é feito em uma esfera, não em um esferóide, por isso não é totalmente preciso, mas existem tickets PostGIS para implementar azimute e projeção de pontos para o tipo de geografia. O mesmo para um círculo.

EM0
fonte