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:

id  | points
----+-----------------
1   | 2010-2011
2   | 2011-2012
3   | 2012-2016

masukkan deskripsi gambar di sini

Apakah ada cara untuk mencapai ini menggunakan QGIS?

Jawaban:


9

Meskipun jawaban @radouxju valid, saya akan menjelaskannya sedikit lebih rinci.

  1. Anda perlu memastikan bahwa fitur polyline terpecah persis di atas lokasi titik.
  2. Gunakan Join attribute by location. Pilih fitur garis perpecahan di lokasi titik sebagai lapisan target - dalam kasus saya beri nama "meledak".
  3. 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.

masukkan deskripsi gambar di sini

  1. File keluar akan memiliki atribut berikut:

masukkan deskripsi gambar di sini

  1. Tambahkan bidang baru tipe string dengan nama "Tahun" ke shapefile baru dari langkah 4.
  2. Gunakan Kalkulator bidang, dan buka untuk memperbarui bidang yang ada. Pilih "Tahun" dan tulis ungkapan berikut:

    to_string ("MINYEAR2") + '-' + to_string ("MAXYEAR2")

  3. Atribut keluaran akhir akan terlihat seperti ini:

masukkan deskripsi gambar di sini

  1. Hasil akhir akan seperti ini:

masukkan deskripsi gambar di sini


Ini adalah output setelah menguji data Anda:

masukkan deskripsi gambar di sini

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 ():

masukkan deskripsi gambar di sini

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.

masukkan deskripsi gambar di sini

Kalkulator dalam bidang:

tostring(minYEAR) + '-' + tostring(maxYEAR)

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:

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'))

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. masukkan deskripsi gambar di sini

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,

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.