Buat diagram voronoi dari segmen garis

14

Saya mencari cara untuk membuat diagram voronoi berdasarkan segmen garis, bukan titik. Lihat contoh di bawah ini (diambil dari presentasi ini ).

Idealnya saya ingin sesuatu yang saya bisa skrip dari Python, tetapi solusi menggunakan ArcGIS atau serupa juga akan diterima.

diagram voronoi dari segmen garis

Satu-satunya perpustakaan untuk melakukan ini yang saya temukan sejauh ini adalah openvoronoi , yang terlihat menjanjikan. Apakah ada yang lain?

Snorfalorpagus
sumber
1
Ini mungkin akan membantu: gis.stackexchange.com/questions/53414/…
Dan C
Terima kasih. Tidak yakin mengapa pertanyaan itu tidak muncul dalam pencarian saya.
Snorfalorpagus

Jawaban:

5

Kami (tim universitas) merancang implementasi untuk ini menggunakan ArcGIS 10.0 addin dan ArcObjects. Aplikasi ini sepenuhnya gratis. Implementasi menggunakan metodologi raster yang mengambil titik input, garis atau poligon untuk membuat diagram Voronoi biasa atau berlipat ganda (atau kombinasi dari yang di atas, yaitu Anda dapat menggunakan salah satu dari setiap jenis bentuk, membuat satu diagram set dari hingga tiga kelas fitur yang berbeda). Ini masih dalam pengembangan tetapi harus cukup stabil, terutama jika Anda hanya ingin membuat garis. Addin membutuhkan lisensi Analis Tata Ruang untuk beroperasi. Kode itu sendiri adalah open source, jadi silakan melakukannya sesuka Anda.

https://github.com/UNTGeography/VoronoiDiagramsGIS

Ia menggunakan metode yang sama seperti "Alokasi Euclidean" yang dijelaskan dalam jawaban @ radouxju dan menggunakan Flow Direction / Basin raster untuk membuat poligon vektor dari raster yang dihasilkan.

Conor
sumber
Bagian penting bagi mereka yang tertarik: github.com/UNTGeography/VoronoiDiagramsGIS/blob/master/…
Sancarn
3

Voronoi awalnya dirancang untuk poin. Berikut adalah dua metode yang dapat saya bayangkan untuk masalah Anda (mengutip alat-alat ArcGIS, tetapi mungkin memungkinkan dengan cantik):

1)

a) membuat titik di sepanjang garis (mis. memadatkan lalu menonjolkan simpul ke garis)

b) membuat poligon Thiessen

c) melarutkan poligon Thiessen berdasarkan garis yang berpotongan

2)

a) dengan analis spasial, hitung alokasi Euclidian ke garis

b) konversi setiap zona menjadi poligon

radouxju
sumber
3

Untuk beberapa pelanggan, beberapa rekan kerja dan saya telah berusaha membuat 2 alat geoproses yang melakukan itu. Meskipun alat geoprocessing tidak tersedia untuk umum, python dan C # yang kami gunakan adalah:

Baik C # dan pembungkus python benar-benar bergantung pada C ++ Boost Voronoi API: http://www.boost.org/doc/libs/1_54_0/libs/polygon/doc/voronoi_main.htm

Perhatikan bahwa API menghabiskan banyak memori. Ini bukan masalah jika Anda menggunakan Geoprocessing untuk 64 bit, ArcGIS Pro, atau QGIS. Ini adalah batasan jika Anda menggunakan ArcGIS Desktop karena 32 bit. (Jaringan jalan terperinci dengan 40.000 baris atau lebih harus cukup untuk mencapai batas memori)

Fabien Ancelin
sumber
1
Saya sebenarnya telah membuat alat geoprosesing untuk ArcMap dan ArcGIS Pro yang bergantung pada perpustakaan pyvoronoi
Fabien Ancelin
2

ET Geowizards (Plugin untuk Arc) memiliki alat untuk ini yang menerima Polylines (lihat tangkapan layar di bawah). Sayangnya Anda akan memerlukan produk berlisensi untuk menjalankan alat, tetapi saya pikir itu harus melakukan trik.

masukkan deskripsi gambar di sini

MAJ742
sumber
0

Ditambah satu cara lagi untuk menyelesaikan tugas Anda menggunakan PostgreSQL / PostGIS.

Jika garis pendek dan sederhana, jalankan skrip:

WITH
tbla AS (SELECT (ST_Dump(geom)).geom geom FROM <line_name_table>),
tblb AS (SELECT (ST_DumpPoints(geom)).geom geom FROM tbla
        UNION
        SELECT ST_Centroid(geom) geom FROM tbla),
tblc AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tblb)
SELECT ST_Union(a.geom) geom FROM tblc a JOIN tbla b ON ST_Intersects(a.geom, b.geom) GROUP BY b.geom;

Lihat hasilnya.

Jika garisnya panjang, jalankan skrip:

WITH
tbla AS (SELECT (ST_Dump(geom)).geom geom FROM <line_name_table>),
tblb AS (WITH btbl AS (SELECT (ST_Dump(geom)).geom geom FROM tbla),
intervals AS (SELECT generate_series (0, 9) as steps)
SELECT steps AS stp, ST_LineInterpolatePoint(geom, steps/(SELECT count(steps)::float-1 FROM intervals)) geom FROM btbl, intervals GROUP BY intervals.steps, geom),
tblc AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tblb)
SELECT ST_Union(a.geom) geom FROM tblc a JOIN tbla b ON ST_Intersects(a.geom, b.geom) GROUP BY b.geom;

Lihat hasilnya.

Jika perlu, pisahkan jumlah titik pada garis, dalam contoh saya ini adalah 10 poin.

Solusi asli.

Script ini disebut: ST_VoronoiDiagramsFromLines.

Cyril Mikhalchenko
sumber
Saya belum menjalankan ini, tetapi sepertinya ia menciptakan poligon voroni menggunakan simpul geometri kemudian menggabungkannya (dengan penyatuan) jika menyentuh geometri asli. Apakah itu benar? Jika demikian, ini merupakan perkiraan OK selama geometri asli Anda memiliki banyak simpul dan tidak ada segmen panjang tanpa itu.
Snorfalorpagus
Diuji oleh: PostgreSQL 11.1, PostGIS 2.5 USE_GEOS = 1 USE_PROJ = 1 USE_STATS = 1 ...
Cyril Mikhalchenko