Berdasarkan jawaban @ kazuhito, saya mengumpulkan satu ekspresi tunggal dalam Kalkulator Bidang QGIS yang seharusnya melakukan hal yang sama dalam satu langkah.
Namun saya dapat membayangkan ini akan menjadi sangat padat sumber daya pada dataset yang lebih besar. Saya pikir masalahnya paling cocok untuk implementasi Python, yang jelas menangani referensi dan iterasi yang jauh lebih baik daripada Field Calculator.
array_last(array_sort(array_foreach(
generate_series(1,num_points($geometry)-1),
line_locate_point(aggregate('lines','collect',$geometry),
point_n($geometry,@element))),1))
- array_first(array_sort(array_foreach(
generate_series(1,num_points($geometry)-1),
line_locate_point(aggregate('lines','collect',$geometry),
point_n($geometry,@element))),1))
Ini pertama kali membuat 'array' dari nomor node menggunakan generate_series()
, menentukan maksimum sebagai jumlah node di setiap poligon - ini adalah num_points($geometry)
, minus 1 untuk melewati simpul pertama / terakhir yang diulang.
Anda kemudian dapat meneruskan nilai-nilai array ini melalui fungsi untuk menghasilkan array lain menggunakan array_foreach()
. Di sini kita meneruskan nomor simpul poligon (diwakili sebagai @element
) ke point_n()
, yang mengembalikan geometri sebenarnya dari simpul itu, lalu kita masukkan itu ke dalam line_locate_point()
untuk menentukan panjangnya di sepanjang garis yang ditentukan (lihat Catatan Penting di bawah).
Array yang dihasilkan kemudian diurutkan dalam urutan naik menggunakan array_sort()
yang kemudian memungkinkan kita mendapatkan jarak "paling kiri" dan "paling kanan" di sepanjang garis menggunakan array_last()
dan array_first()
. Kurangi keduanya dan hasilnya adalah "panjang" poligon di sepanjang garis.
Lihat di bawah untuk contoh ekspresi di atas yang ditampilkan sebagai label dalam poligon (ditambah jarak garis "paling kiri" dan "paling kanan" terpisah dari ekspresi di atas). Sebagai perbandingan, saya juga menyertakan simpul yang diekstraksi dan nilai jarak garis yang relevan. Verteks hijau adalah simpul "paling kiri" dan "paling kanan" di sepanjang garis. Perhatikan poligon kiri-atas di mana titik hijau sebenarnya lebih jauh di sepanjang garis daripada titik di kanan di bawahnya, karena sudut garis ...
Catatan penting :
Geometri lapisan garis dirujuk di sini menggunakan aggregate()
. Anda akan perlu mengubah nama layer ( 'lines'
) seperti yang diperlukan, dan jika Anda memiliki beberapa baris, Anda harus menambahkan filter untuk menentukan jalur Anda ingin membandingkannya dengan, misalnya: aggregate('lines','collect',$geometry,"name"='TrainLine1')
. Untuk membuat ini bekerja secara otomatis pada baris terdekat saya sangat merekomendasikan SQL atau Python melalui Field Calc.
Juga, ini menghitung "panjang" dari Polygon SEPANJANG baris, termasuk jika garisnya ditekuk per contoh saya. Jika Anda ingin jarak garis lurus ... mungkin menghitung distance()
antara node yang relevan?