Mendapatkan atribut point-touch-a-line kembali ke lapisan garis menggunakan QGIS?
12
Saya menggunakan QGIS 2.14.4-Essen. Saya memiliki dua lapisan:
points.shp yang berisi poin dengan kolom TAHUN
lines.shp yang berisi garis yang secara tepat menghubungkan titik dari points.shp
Saya ingin mendapatkan atribut YEAR dari points.shp kembali ke lines.shp. Setiap baris adalah satu segmen dengan satu titik di setiap ujungnya (lihat gambar di bawah). Yang ingin saya dapatkan adalah TAHUN dari titik pertama dan TAHUN dari titik kedua kembali ke setiap atribut garis.
Misalnya: baris 1 menyentuh titik pertama dengan YEAR = 2010 dan titik kedua dengan YEAR = 2011. Saya ingin mengembalikan sesuatu seperti '2010-2011' ke atribut baris 1. Hasilnya akan terlihat seperti ini:
Meskipun jawaban @radouxju valid, saya akan menjelaskannya sedikit lebih rinci.
Anda perlu memastikan bahwa fitur polyline terpecah persis di atas lokasi titik.
Gunakan Join attribute by location. Pilih fitur garis perpecahan di lokasi titik sebagai lapisan target - dalam kasus saya beri nama "meledak".
Di bagian ringkasan, pilih "Ambil ringkasan fitur berpotongan". Di sini, alih-alih menjalankan alat dua kali; satu untuk Min dan waktu lain untuk Max, Anda dapat menjalankannya satu kali dan memilih Min dan Max.
File keluar akan memiliki atribut berikut:
Tambahkan bidang baru tipe string dengan nama "Tahun" ke shapefile baru dari langkah 4.
Gunakan Kalkulator bidang, dan buka untuk memperbarui bidang yang ada. Pilih "Tahun" dan tulis ungkapan berikut:
Tabel di sebelah kiri adalah data titik setelah membuat bidang baru tipe integer, dan tabel di sebelah kanan setelah bergabung dengan garis dengan data titik menggunakan langkah 2 yang disebutkan di atas. Kemudian saya menggunakan langkah 5-6 untuk membuat data akhir.
Memperbarui
Saya mencoba mengkonversi bidang YEAR dari string ke integer menggunakan ekspresi to_int () dan berhasil. Jadi Anda tidak perlu melakukannya secara manual. Namun, tipe bidang harus tipe Integertidak Integer64. Pastikan bahwa panjang bidang hingga 9. Jika Anda memilih panjang bidang 10, itu akan dikonversi menjadi Interger64, dan itu tidak akan bekerja dengan Interger64. Kemudian Anda dapat mengikuti proses dari langkah 2-6
Ini adalah hasil akhir setelah menggunakan ekspresi to_int ():
Pada tabel atribut di atas di sebelah kiri, YEAR bertipe string dan YEAR2 bertipe integer yang dikonversi menggunakan ekspresi to_int (). Anda dapat melihat pada tabel atribut di sebelah kanan setelah mengikuti langkah 2-6, saya mendapatkan MINYEAR2 dan MAXYEAR2, kemudian dikonversi ke string kembali lagi untuk menyatukan semuanya bersama di bidang YEAR.
Terima kasih banyak! Itulah tepatnya yang saya lakukan beberapa kali. Saya kira fitur polyline terpecah tepat di atas lokasi poin karena saya membuat garis dari lapisan poin menggunakan plugin Points2One. Bisakah Anda mencoba dengan subset data ini: drive.google.com/file/d/0B7ZWEFkkfYgheG92Q29sa0I3LW8/view ? Terima kasih lagi!
wiltomap
Bidang YEAR dalam tabel atribut bertipe string. Anda perlu menambahkan bidang integer tipe baru dan memasukkan tahun secara manual. Setelah membuat bidang tipe bilangan bulat dan menyimpan hasil edit, hapus bidang string lama. Kemudian, ikuti proses terperinci di atas.
ahmadhanb
Saya mencoba mengkonversi bidang YEAR dari string ke integer menggunakan ekspresi to_int (), tetapi juga tidak berhasil. Ketika saya memasukkan tahun secara manual, itu bekerja seperti yang diharapkan.
ahmadhanb
Penjelasan yang jelas @ahmadhanb
Shiko
Terima kasih @ ahmadhanb! Faktanya adalah bahwa data yang saya bagikan di atas adalah subset. Saya memiliki beberapa ribu garis dan poin sehingga memasuki tahun secara manual akan cukup banyak pekerjaan! Apakah ini bug?
wiltomap
5
Ketika bergabung, gabungkan poin ke garis, Anda akan memiliki banyak hubungan. Dengan "gabung atribut berdasarkan lokasi", Anda akan dapat meminta metode ringkasan yang diberikan. Dalam kasus Anda, lakukan ini dua kali: sekali dengan minimum dan sekali dengan maksimum. Setelah itu Anda dapat menggabungkan dua bidang dalam bidang baru dan Anda berakhir dengan apa yang Anda butuhkan.
Metode ini mengembalikan kolom tambahan bernama COUNTdan berisi nilai 2untuk setiap baris. Pilihan Min dan Max mengembalikan informasi ini. Saya telah memilih layer garis sebagai layer target dan layer poin sebagai layer gabungan, apakah saya benar?
wiltomap
apakah Anda tahun angka bidang atau teks?
radouxju
The YEARlapangan integer. Saya mencoba membuat kolom baru dengan to_string("YEAR")tetapi hasilnya persis sama ...
wiltomap
Saya membuat tes cepat untuk memastikan (QGIS 2.8.3) dan berhasil. Jika jumlah Anda 2, itu berarti Anda memiliki 2 poin untuk setiap segmen, yang benar. Tetapi dengan saya, saya memiliki nilai atribut MINYEAR MAXYEAR di vektor garis baru yang dibuat oleh gabungan spasial. Saya tidak mengerti mengapa itu tidak berhasil dalam kasus Anda. Bisakah Anda mencoba dengan file lain?
radouxju
4
Dengan asumsi topologi sempurna, menciptakan bidang 'WKT' dengan ekspresi
geom_to_wkt( $geometry)
di layer titik Anda, Anda bisa menggunakan ekspresi:
di kalkulator bidang lapisan pipa, membuat string teks.
attribute (feature, attribute_name) Mengembalikan nilai atribut yang ditentukan dari fitur, di sini, tahun dari fitur poin yang
diperoleh.
get_feature (layer, atribut, value) mengembalikan fitur pertama dari sebuah layer yang cocok dengan nilai atribut yang diberikan. Di sini kami memeriksa apakah kami dapat menemukan titik dengan koordinat yang sama (dalam format WKT) dengan titik
awal dan titik akhir garis Anda.
start_point (geometri) mengembalikan simpul pertama dari geometri. Di sini titik pertama dari baris Anda.
end_point (geometry) mengembalikan simpul terakhir dari geometri. Di sini titik terakhir dari baris Anda.
geom_to_wkt (geometry) mengembalikan representasi geometri Teks yang Dikenali dengan Baik.
Anda bahkan dapat memperbaruinya ke:
CASE
WHEN attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry) )),'year') = attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry) )),'year')
THEN attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry) )),'year')
ELSE min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry) )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry) )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry) )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry) )),'year'))
END
untuk menunjukkan hanya satu tahun jika dua poin dengan tahun yang sama terhubung (mendapatkan 200X bukannya 200X-200X).
Keuntungan utama dari metode ini adalah bahwa jika data Anda berubah dalam poin Anda, Anda dapat memperbaruinya dengan sangat cepat hanya dengan satu kalkulator bidang.
Anda bahkan bisa menambahkan aturan ini sebagai Autofield ketika Anda membuat baris baru.
Bersulang,
Ketika bergabung, gabungkan poin ke garis, Anda akan memiliki banyak hubungan. Dengan "gabung atribut berdasarkan lokasi", Anda akan dapat meminta metode ringkasan yang diberikan. Dalam kasus Anda, lakukan ini dua kali: sekali dengan minimum dan sekali dengan maksimum. Setelah itu Anda dapat menggabungkan dua bidang dalam bidang baru dan Anda berakhir dengan apa yang Anda butuhkan.
Kalkulator dalam bidang:
sumber
COUNT
dan berisi nilai2
untuk setiap baris. Pilihan Min dan Max mengembalikan informasi ini. Saya telah memilih layer garis sebagai layer target dan layer poin sebagai layer gabungan, apakah saya benar?YEAR
lapangan integer. Saya mencoba membuat kolom baru denganto_string("YEAR")
tetapi hasilnya persis sama ...Dengan asumsi topologi sempurna, menciptakan bidang 'WKT' dengan ekspresi
di layer titik Anda, Anda bisa menggunakan ekspresi:
di kalkulator bidang lapisan pipa, membuat string teks.
diperoleh.
awal dan titik akhir garis Anda.
Anda bahkan dapat memperbaruinya ke:
untuk menunjukkan hanya satu tahun jika dua poin dengan tahun yang sama terhubung (mendapatkan 200X bukannya 200X-200X).
Keuntungan utama dari metode ini adalah bahwa jika data Anda berubah dalam poin Anda, Anda dapat memperbaruinya dengan sangat cepat hanya dengan satu kalkulator bidang.
Anda bahkan bisa menambahkan aturan ini sebagai Autofield ketika Anda membuat baris baru.
Bersulang,
sumber