Ini adalah pertanyaan sederhana dan sangat umum yang telah ditanyakan untuk tujuan yang berbeda (lihat tautan ini dan ini juga , misalnya), di sini, bagaimanapun, kami mencari bukan paket perangkat lunak tetapi algoritma yang dapat kami coba implementasikan katakan dalam Python .
Jadi, seperti yang ditunjukkan di bawah ini serangkaian garis dipetakan (mereka sudah dipangkas, BTW).
Algoritma / ide untuk menghasilkan poligon (seperti yang ditunjukkan merah) ?
algorithm
polygonize
geometry-conversion
Pengembang
sumber
sumber
Jawaban:
Baiklah, kami memberikan jawaban di sini yang bukan merupakan jawaban lengkap untuk pertanyaan kami, yaitu pertanyaan itu akan tetap " terbuka untuk dijawab ". Namun itu adalah solusi untuk masalah dalam pertanyaan. Inilah trik yang kami gunakan:
Pertama mari kita lihat hasilnya :
Jadi garis yang diberikan dalam
left
poligon yang dibangun ditunjukkan dalammiddle
. Mereka adalah poligon nyata seperti yang ditunjukkan padaright
;)Untuk algoritma yang diberikan di bawah ini kami menggunakan
Shapely
paket dalam Python .MultiLineString
{:: M}buffer
, katakaneps
{:: MB}Polygon
{:: P} (wilayah di sini adalah bujur sangkar)P.difference(MB)
{poligon yang dihasilkan}Perhatikan bahwa operasi ini sunyi dengan cepat. Namun, titik yang hilang adalah bahwa algoritma tersebut bukan metode asli untuk membangun poligon dari garis . Namun demikian itu bekerja dengan sempurna untuk masalah yang kami miliki di tangan kami.
sumber
JTS Topology Suite memiliki kelas Polygonizer, yang cukup banyak melakukan hal ini.
Anda dapat melihat kode sumbernya, tersedia di sini , dan mengonversinya menjadi Python.
sumber
Anda mungkin melihat paket Python Shapely, khususnya poligon ()
sumber
from shapely.ops import polygonize
) menggunakan GEOS.Poligonisasi dari GEOS . Jadi ini adalah tautan di mana ada tautan ke tautan ...: |polygonize
tidak berhasil sama sekali. Namun terima kasih telah mengingatkan kamiShapely
yang dengannya kami dapat menemukan solusi (tipuan, sebenarnya) sebagaimana diposting sebagai jawaban.Berikut ini solusi lain yang bisa kami temukan.
Untuk Python ada paket {di sini} . Ini adalah implementasi kecil dengan beberapa bug. Namun demikian dengan beberapa upaya dapat digunakan untuk masalah ini. Perhatikan juga tahapan-tahapan berikut:
Tahap pra-pemrosesan dengan mana semua persimpangan antara garis ditemukan. Maka dengan demikian semua garis dipecah menjadi segmen pada titik-titik interaksi. Daftar titik persimpangan dan daftar tepi terkait adalah yang diperlukan untuk DCEL.
sumber
difference
operasi sedang digunakan.