Buat poligon dari baris di PostGIS

13

Saya mencoba untuk membagi poligon dalam poligon yang lebih kecil dari satu baris, tetapi saya rasa saya tidak dapat menggunakan fungsi st_split. Yang saya butuhkan adalah membuat poligon kecil di dalamnya, menggunakan kisi linestring.

Saya sudah mencoba beberapa cara, tetapi saya tidak bisa mendapatkan hasilnya. Apa yang saya coba:

Membagi satu poligon dari LineString menggunakan st_split ()

Dari poligon batas.

masukkan deskripsi gambar di sini

Dan tabel Linestring:

masukkan deskripsi gambar di sini

Saya membutuhkan poligon berikut:

masukkan deskripsi gambar di sini

Masalah : Saya tidak dapat memisahkan poligon dari beberapa baris, juga poligon dari multilinestring.

Metode lain yang saya coba adalah membuat poligon dari baris dengan st_polygonize () SQL yang saya coba adalah:

SELECT 
   g.path[1] as gid, 
   g.geom::geometry(polygon, 22033) as geom 
FROM
   (SELECT 
     (ST_Dump(ST_Polygonize(geom))).* 
   FROM linestable
) as g;

Diekstraksi dari Membuat poligon dari segmen garis menggunakan PostgreSQL dan PostGIS

Masalah : Saya hanya bisa mendapatkan satu poligon (batas).

Dapatkah seseorang memberi tahu saya mana yang akan menjadi cara terbaik untuk mendapatkan poligon dari linestring, atau jika saya kehilangan sesuatu?

Catatan: Tabel berada dalam SRID yang sama, dan geometri dimasukkan ke dalam kisi. Di QGIS saya dapat menjalankan proses poligonisasi dari garis ke poligon dengan sempurna.

Seperti permintaan John, ini adalah tabel linestring. https://drive.google.com/file/d/0B603y_m735jfS014S0EyVnpMUEU/view?usp=sharing

Pablo Pardo
sumber
1
Bisakah Anda memposting geometri linestring di suatu tempat? ST_Polygonize bersama dengan ST_Dump harus bekerja.
John Powell
Tentu. Saya telah mengedit posting dengan tautan ke tabel.
Pablo Pardo
@ JohnPowellakaBarça dapatkah Anda melihat ini. Pertanyaan ini bagus. ST_Polygonize pada set sampelnya mengembalikan satu poligon. Kita pada dasarnya perlu menguraikan kekacauan LINESTRING-nya yang terbuka dan menemukan semuanya yang dapat membuat persegi panjang?
Evan Carroll
1
@EvanCarroll. Tentu. Aku atm sibuk sibuk, jadi mungkin tidak selama beberapa hari.
John Powell
1
@ppardoz. Espero que esto te ayude. Saya perhatikan bahwa kekurangan meja Anda semuanya dalam bahasa Spanyol :-)
John Powell

Jawaban:

4

Saya mendapatkan ini bekerja dengan menggunakan ST_Node pertama, bersama dengan ST_Collect , untuk mengubah garis menjadi seperangkat mengangguk linestrings dalam MultiLinestring .

Seperti yang tertulis dalam dokumen untuk ST_Node :

Sepenuhnya node set linestrings menggunakan jumlah node yang paling mungkin sambil mempertahankan semua yang input.

Apa artinya ini, adalah bahwa semua linestrings digabungkan dalam semua kemungkinan kombinasi, sehingga menjadi setara dengan cincin eksterior poligon. Sedangkan, jika Anda mencoba untuk ST_Polygonize satu set LineStrings, tidak ada yang sendiri menggambarkan poligon, Anda cukup mendapatkan LineStrings kembali. Jadi, ini berhasil:

WITH multi(geom) AS (
  SELECT ST_Node(ST_Collect(geom))
  FROM leyenda_digitalizar00
)
SELECT ST_AsText( (ST_Dump(ST_Polygonize(geom))).geom )
FROM multi;

Jika Anda hanya menjalankan bagian pertama dari ini, yaitu, CTE multi, hasilnya terlihat seperti:

MULTILINESTRING ((204.5 69.9000000000004.204.5 69.9000000000004), (204.5 68.9.205.4 68.9), (204.5 68.9.204.5 69.1204.5 69.1204.5 69.220.20.5 69.3.204.569.420.20.520.520 204.5 69.9000000000004), (209.5 68.9.209.5 68.8.209.5 68.7.209.5 68.6.209.5 68.4.209.5 68.3.209.5 68.2.209.5 68.1.209.5 68.20.20.5 67.9.20.20.5 67.520.567.520 , 209.5 .......

Sekarang, saat Anda memberi makan MultiLinestring ini ke ST_Polygonize berfungsi seperti yang diharapkan, misalnya,

POLYGON ((205.4 68.9.204.5 68.9.204.5 69.204.5 69.1.204.5 69.2.204.5 69.3.204.5 69.4.204.5 69.7.204.5 69.7.204.5 69.8.204.5 69.9.2000.5 69.9000000.300.495)

POLYGON ((204.5 69.9000000000004.204.5 70.204.5 70.1.204.5 70.2.204.5 70.3.204.5 70.4.2020.5 70.4.2020.5 70.3.20.20.5 70.2.20.20.5 70.1.209.5 70.20.20.500.900

POLYGON ((206,8 70,4,204,5 70,4,204,5 70,5,204,5 70,6,204,5 70,7,204,5 70,8,204,5 70,9,204,5 71,204,5 71,2,204,5 71,2,204,5 71,3,204,5 71,4,206,8 71,4,206,8 70,4))

Jelas, ST_AsText hanya untuk ilustrasi, dan Anda harus men-tweak, jika Anda menginginkan ID path juga.

Kuncinya adalah ST_Polygonize mengharapkan linestrings yang sudah menggambarkan garis besar poligon , seperti yang dilakukan oleh ST_Node (ST_Collect (.... di atas.

John Powell
sumber
Itu sangat keren, saya dapat mengkonfirmasi bahwa solusi ini berfungsi! Di sisi lain, saya bertanya-tanya mengapa ST_Polygonize()mengatakan itu membutuhkan string baris, atau apa gunanya untuk itu tanpa menelepon ST_Node()terlebih dahulu
Evan Carroll
1
@EvanCarroll. Saya pikir jawabannya adalah bahwa ST_Polygonize mengambil Linestrings yang sudah di set mewakili poligon, sedangkan linestrings dalam pertanyaan ini terdiri dari beberapa kemungkinan poligon. Pemahaman saya adalah inilah yang dilakukan ST_Node. Saya akan berusaha menyelidiki lebih lanjut dan memperbarui jawabannya.
John Powell