Przechowywanie powierzchni GML w PostGIS

9

Używam PostGIS 2.0.0 i chciałbym przechowywać powierzchnię GML w sposób, który pozwala na obliczenie przecięć między tą powierzchnią a różnymi punktami i liniami. W moim przypadku powierzchnia będzie miała jeden element PolygonPatch bez pierścieni wewnętrznych i pierścień zewnętrzny, którym może być LineStringSegment, Geodesic, Arc lub Circle. Odległości mogą być rzędu od dziesiątek do setek mil. Widzę, że PostGIS ma CIRCULARSTRINGi CURVEPOLYGON, co wydaje się być dobrym sposobem przechowywania Łuku, z wyjątkiem tego, że nie są obsługiwane tylko przez geographytyp geometry. Jaki byłby najlepszy sposób na przechowanie tego? (Jestem całkiem nowy w PostGIS i ogólnie GIS, więc jest całkiem możliwe, że brakuje mi czegoś oczywistego.)

EM0
źródło
Możesz przechowywać GML w postgis tak jak jest. postgis.refractions.net/documentation/manual-svn/…
Mapperz
Kilka wyjaśnień na temat geometrii i typów geograficznych PostGIS postgis.refractions.net/docs/…
canisrufus

Odpowiedzi:

4

ST_GeomFromGML

Możesz przechowywać swoje funkcje GML jako typ danych PostGIS Geometry, używając funkcji ST_GeomFromGML, która przekształci Twój GML na typ danych geometrii. FYI: Istnieją podobne funkcje dla KML, WKT i tak dalej.

po prostu zrób coś takiego:

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

Gdy znajdziesz go w polu geometrii, możesz robić wszystkie fajne skrzyżowania i rzeczy, które chcesz robić w PostGIS

Następnie możesz wypluć swój wynik z powrotem w formacie GML za pomocą ST_AsGML

EDYCJA 1 Myślę, że szukasz:

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

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

EDYCJA 2

Używam „POSTGIS =” 1.5.2 ”(starsza wersja niż ty), a następująca instrukcja działa dobrze:

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

Musisz użyć kombinacji funkcji, aby uzyskać to, czego potrzebujesz.

distance_spheroid nie obsługuje CIRCULARSTRING, ponieważ pobiera typy danych geometrii.

Dodaj EDYT do swojego oryginalnego pytania z fragmentem przykładowego GML, z którym masz problemy, a ja wypiszę dla ciebie wyciągi.

CaptDragon
źródło
Dzięki, ale importowanie z GML nie jest tak naprawdę głównym problemem. Główne pytanie dotyczy tego, jak przechowywać dane w sposób umożliwiający dokładne obliczenia. Jak rozumiem, typ geometrii nie działałby w tym przypadku dobrze, ponieważ jest oparty na płaszczyźnie, a typ geograficzny nie obsługuje krzywych.
EM0,
@EM: Sprawdź moją EDYCJĘ nr 1
CaptDragon
Dzięki, wypróbowałem te, ale niestety nie obsługują CIRCULARSTRING.
EM0,
@EM: Sprawdź moją EDYCJĘ nr 2
CaptDragon
Tak, instrukcja tworzenia CIRCULARSTRING działa, ale obliczenia odległości dla tego ciągu używają płaszczyzny, jak rozumiem, ponieważ ma ona typ „geometrii”. W każdym razie spróbuję zapisać dane na dwa sposoby - dokładną wartość jako CIRCULARSTRING (geometria) i przybliżoną wartość (geografię) wygenerowaną przy użyciu ST_CurveToLine.
EM0,
2

W końcu zrezygnowałem z przechowywania „dokładnego” łuku lub okręgu. Podczas importowania Łuku GML (który jest zdefiniowany przez 3 punkty na łuku) tymczasowo tworzę geometrię CIRCULARSTRING, a następnie przekształcam ją w geografię, jak poniżej:

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

Podczas importowania GML ArcByCenterPoint (który jest zdefiniowany przez punkt środkowy, promień oraz kąty początkowy i końcowy) przybliżam go bezpośrednio, rzutując punkty w odstępach 1 stopnia od kąta początkowego do kąta końcowego. Odbywa się to na kuli, nie na sferoidie, więc nie jest do końca dokładne, ale istnieją bilety PostGIS do implementacji azymutu i projekcji punktowej dla typu geograficznego. To samo dla koła.

EM0
źródło