Bagaimana mengubah sekumpulan segmen jalan menjadi blok kota, dengan PostGIS2?

8

Secara teoritis dimungkinkan untuk mendapatkan poligon blok kota (blok kota) dari jalan, ketika jalan diwakili oleh poros jalan ( LineStrings ).

Blok perkotaan dibatasi oleh jalan, sehingga ruas jalan dapat digunakan untuk membentuk poligon yang hanya berisi satu blok di ... Lihat ilustrasi.

Ada skrip (SQL) PostGIS 2.X untuk melakukan ini? Perangkat lunak plugin?
PS: perkiraan geometri blok kota sudah cukup.

Ilustrasi

Mulai proses dari "jala segmen jalur yang terhubung", dapat berupa: 1) mendapatkan poligon terkait; 2) mengisolasi poligon dengan buffer negatif dan pengurangan buffer garis.

masukkan deskripsi gambar di sini

Contoh: poligon 262 (mewakili blok kota) berasal dari segmen 2496, 2494, 2369, 1513, ... Dan poligon tetangga 263 dapat menggunakan beberapa segmen umum, tetapi selanjutnya (dengan st_buffer negatif atau operasi lain) akan menjadi poligon benar-benar terisolasi, jadi, presisi rendah sudah cukup.


(EDIT)

Saya pikir kita dapat menerjemahkan masalah khusus ini menjadi masalah yang lebih umum: rangkaian segmen jalan dapat dipandang sebagai semacam penghentian , yaitu segmen yang membagi pesawat menjadi wilayah yang bersebelahan - blok-blok perkotaan terletak di bagian dalam daerah. Setiap segmen adalah sisi dari dua wilayah.

Masalah utama adalah untuk mengubah "set segmen tessellation" menjadi poligon independen .

Peter Krauss
sumber
Mungkin, dengan modul topologi postgis baru, batas jalan, dapat dikelompokkan bersama untuk membentuk poligon ini (area tertutup).
cavila
Bagaimana Anda akan mengusulkan untuk mendapatkan blok? Jalanan (secara konseptual) berbentuk garis, sedangkan setiap blok adalah poligon. Bagaimana Anda menemukan satu blok perkotaan yang diberi garis garis, di hadapan keenakan, taman, cagar alam, blok battleaxe (mis. Anewhouse.com.au/2012/07/battleaxe-block ), blok di mana ada sungai / sungai / ridgeline antara jalan-jalan, dll?
BradHards
Terima kasih @Cila, saya sedang mencari contoh, dan menemukan beberapa seperti ini , sesuatu yang saya butuhkan, tetapi: semua dimulai dengan poligon, bukan dengan "segmen tesselation" (lihat generalisasi masalah saya). Input saya adalah sekumpulan segmen.
Peter Krauss
@BradHards, terima kasih atas ulasan Anda (!), Saya edit untuk menunjukkan fokus masalah saya. Ya ada banyak pengecualian seperti blok battleaxe; dan ya, saya perlu menambahkan segmen sungai, segmen kereta api, dll. untuk "tesselation lengkap". Saya hanya membutuhkan "perkiraan pertama" balok, bukan konstruksi yang lengkap dan otomatis.
Peter Krauss
Saya kira dia bersedia untuk mendapatkan blok atau sektor berdasarkan batas jalan. Tidak banyak perkotaan untuk satu properti. Salah satu solusinya bisa berupa uji ulang walker yang memplot simbol pada titik awal dan mulai berjalan berbelok ke kanan sampai ia kembali ke tempat awal di mana ia merencanakan simbol. Jadi, Anda akan mendapatkan poligon atau batas tertutup.
cavila

Jawaban:

8

The ST_Polygonizeagregat dalam PostGIS akan mengembalikan geometry_dumpberisi semua poligon yang mungkin dibentuk oleh satu set garis. Saya mengasumsikan ID blok yang ditunjukkan dalam contoh Anda tidak terkait dengan ID linework input. Jika ini masalahnya, Anda bisa mendapatkan poligon dan ID Anda dengan:

SELECT (st_dump).path[1] as poly_id, (st_dump).geom FROM
    (SELECT ST_Dump(ST_Polygonize(geom)) FROM 
        (SELECT ST_Union(geom) as geom FROM lines) mergedlines) polys

Bagian lambat di sini adalah ST_Union. Sepertinya ini akan berfungsi tanpa panggilan itu, selama jalur input benar-benar mengangguk, tapi saya belum berhasil melakukannya.

Buffer negatif tidak akan memberikan hasil yang tepat seperti pada contoh Anda, karena jalan buntu akan diabaikan oleh proses poligonisasi. Tetapi Anda dapat mengambil buffer positif dari garis asli, dan gunakan ST_Differenceuntuk menghapus area itu dari blok poligon.

dbaston
sumber