Saya punya tabel tabel postgis isoline yang didefinisikan seperti ini:
CREATE TABLE myisolines
(
gid serial NOT NULL,
isotime timestamp without timezone,
val numeric(10,4),
geom geometry(LineString,4326)
);
Secara visual objek linestring ini terlihat seperti ini:
Saya tahu luas spasial data saya, jadi saya bisa menambahkan Bbox, jadi LineStrings bisa ditutup.
Saya ingin membuat tabel isopolygon myisopolygons
dari myisolines
tabel, dengan poligon, yang tidak akan tumpang tindih tetapi membuat permukaan yang kontinyu dan memiliki kolom val
dengan val
isolasi terendah , dari mana poligon dibentuk. Saya mengerti itu dapat dibentuk dari isoline tertutup sendiri (pulau), atau isoline ditutup dengan bbox, dalam hal ini val
harus diambil dari isoline tertentu. Secara visual seharusnya terlihat seperti ini:
Saya pikir saya bisa membuat topologi entah bagaimana dan kemudian mengubah wajah menjadi poligon, tetapi saya tidak mengerti bagaimana melakukannya dengan benar. Bagaimana ini bisa dilakukan?
Pilihan lain adalah menggunakan fungsi perbedaan secara rekursif antara bbox dan setiap poligon yang dibuat, tapi saya kira itu bukan cara yang tepat untuk melakukannya, dan jelas tidak cepat sama sekali.
sumber
Jawaban:
Inilah solusi menggunakan
ST_Polygonize
. Ini menghasilkan poligon untuk setiap batas, dan memberikan ketinggian minimum dan maksimum yang dicakup oleh poligon. Algoritme tidak dapat membedakan antara puncak dan depresi dan akan mengembalikan ketinggian yang sama untuk min dan maks dalam kasus ini.The
WITH
klausul dari query "menutup" setiap kontur terbuka dengan unioning mereka dengan tingkat yang sedikit-kontrak dari kontur yang ada. (Luasnya dikontrak untuk mencuci kesalahan pembulatan yang dihasilkan dari penggunaanST_Extent
, yang menghasilkan kotak presisi tunggal, denganST_Polygonize
, yang membutuhkan input tertutup sempurna dan mengangguk dalam presisi doulbe). Jika kontur Anda sudah ditutup (mis. Anda bekerja dengan sebuah pulau), maka langkah ini dapat dihilangkan.sumber
Saya tidak terlalu berpengalaman, tapi saya akan mencoba fungsi geometri ST_MakePolygon (geometri garis luar, geometri [] interiorlinestrings);
sumber
Menggunakan bbox Anda dan mengulangi setiap garis kontur, Anda dapat menggunakan
ST_ConcaveHull
untuk mengubah setiap wilayah menjadi poligon.sumber