Mam tabelę tabeli postgis izolinii, która jest zdefiniowana w następujący sposób:
CREATE TABLE myisolines
(
gid serial NOT NULL,
isotime timestamp without timezone,
val numeric(10,4),
geom geometry(LineString,4326)
);
Wizualnie te obiekty liniowe wyglądają tak:
Znam zasięg przestrzenny moich danych, więc mogę dodać Bbox, aby LineStrings mogło być jakby zamknięte.
Chcę utworzyć tabelę izopoligonów myisopolygons
z myisolines
tabeli z wielobokami, które nie będą się nakładać, ale utworzą ciągłą powierzchnię i będą miały kolumnę val
z najniższą val
z izolinii, z której powstał wielokąt. Rozumiem, że można go wytworzyć z samozamykającej izoliny (wyspy) lub izoliny zamkniętej za pomocą bbox, w takim przypadku val
należy ją pobrać z tej konkretnej izolat. Wizualnie powinno to wyglądać tak:
Myślałem, że mogę jakoś stworzyć topologię, a następnie przekształcić twarze w wielokąty, ale nie rozumiem, jak to zrobić poprawnie. Jak można to zrobić?
Inną opcją byłoby rekurencyjne użycie funkcji różnicy między bbox a każdym utworzonym wielokątem, ale myślę, że nie jest to właściwy sposób na zrobienie tego i zdecydowanie nie jest szybki.
źródło
Odpowiedzi:
Oto rozwiązanie za pomocą
ST_Polygonize
. Generuje wielobok dla każdej granicy i zapewnia min. I maks. Rzędną pokrywaną przez wielobok. Algorytm nie może rozróżnić piku i depresji i w tych przypadkach zwróci tę samą wysokość dla wartości minimalnej i maksymalnej.WITH
Klauzula kwerendy „zamyka” otwarte kontury przez unioning im lekko zamówienia stopniu istniejących konturów. (Zakontraktowano zakres, aby zmyć wszelkie błędy zaokrągleń wynikające z użyciaST_Extent
, który tworzy pudełko o pojedynczej precyzji, zST_Polygonize
, który wymaga idealnie zamkniętych i ukośnych danych wejściowych z dokładnością doulbe). Jeśli twoje kontury są już zamknięte (tzn. Pracujesz z wyspą), ten krok można pominąć.źródło
Nie jestem bardzo doświadczony, ale spróbowałbym funkcji geometrii ST_MakePolygon (geometria zewnętrzna linia, geometria [] wewnętrzna linia);
źródło
Za pomocą bbox i iteracji po każdej linii konturu możesz użyć
ST_ConcaveHull
do przekształcenia każdego regionu w wielokąt.źródło