Bandingkan baris serupa dan perbarui lapisan

16

Di sini ada dua lapisan dengan representasi jalanan dan idenya adalah: Kami ingin memperbarui lapisan terbaru (dengan garis merah) dengan beberapa data disimpan di yang lain (biru muda), tetapi lapisan ini adalah serupa dalam posisi Geografis yang bisa sangat dekat dan sedikit lebih jauh tergantung pada tempat di peta dan hanya satu atribut yang cocok dalam kasus-kasus bahwa sebuah garis sama dengan yang lain (codlog x codlog5).

Lapisan Qgis.

Sebagai contoh: Di tengah gambar, ada kotak di kedua lapisan, tetapi bagaimana saya lakukan di peta untuk mengenali yang biru sama dengan yang hijau dan memperbarui lapisan yang baru-baru ini?

Bagaimana saya bisa melakukannya? Apakah ada plugin atau alat yang membantu dengan itu?

Jhonatan Oliveira
sumber
Anda ingin memperbarui lapisan merah dengan atribut dari lapisan biru atau dengan fitur tambahan dari lapisan biru?
dmh126
Atribut. Situasi: Lapisan merah berisi kolom (a, b, c, d) dan yang biru kolom (d, e, f). Saya ingin menambahkan di lapisan merah kolom (e, f) dari lapisan lain dan hasilnya yang cocok.
Jhonatan Oliveira
Ada beberapa dokumentasi di sini untuk plugin conflation. Tidak yakin apakah pengembangan telah selesai.
Barbarossa
1
Sudahkah Anda mencoba Jump?
radouxju
Tetapi kolom "d" dari baris blu dan "d" dari yang merah adalah id umum yang unik? Apa yang dikandungnya?
Sergio

Jawaban:

6

Ini adalah pertanyaan yang bagus, saya harus melakukan sesuatu yang serupa baru-baru ini tetapi dengan dataset yang jauh lebih kecil, jadi saya dapat menggunakan persimpangan sederhana dengan beberapa pengecekan kualitas visual tambahan dan itu baik-baik saja.

Tapi ini ide untuk ini, walaupun saya tidak punya kode, dan ini semacam proses yang lumayan. Uji dengan sampel dari dataset lengkap terlebih dahulu. Anda mungkin dapat beberapa kode yang berguna di sekitar sini. (Lekukan agak aneh di bawah ini.):

  1. ambil himpunan geometri yang baik (di mana Anda ingin atribut berakhir) dan buat buffernya *

  2. beralih melalui masing-masing fitur buffer:

    2a. menghitung orientasi umum fitur (max_y - min_y / max_x - min_x atau sesuatu seperti itu)

    2b. buat kueri pemilihan lokasi berdasarkan pada layer lain menggunakan fitur tunggal ini

    1. Anda akan memiliki lebih dari satu fitur yang cocok dengan kueri pemilihan lokasi, jadi ulangi melalui fitur yang dipilih ini dan hitung orientasi masing-masing

    2. dapatkan atribut dari fitur mana saja yang memiliki orientasi paling dekat dengan fitur buffer.

* Saya akan mulai dengan jarak yang sangat kecil (satu unit peta atau sesuatu) dan kemudian jalankan proses ini dengan jarak yang semakin jauh, berhati-hati untuk tidak menimpa atribut apa pun yang telah Anda transfer.

** Anda sebenarnya bisa melupakan membuat fitur buffer, dan lakukan saja kueri pemilihan lokasi menurut jarak buffer di dalamnya. Saya tidak terlalu mengenal QGIS, tetapi saya yakin Anda akan dapat melakukannya.

Tidak mungkin ini akan bekerja dengan sempurna untuk semua fitur Anda, tetapi ini adalah permulaan, dan kemudian berkembang menjadi strategi QA / QC yang baik untuk memeriksa dan menyelesaikan transfer.

EDIT Memikirkan hal ini lebih lanjut, berikut adalah contoh dasar yang benar-benar akan merusak sistem jika Anda mulai dengan jarak buffer yang sangat kecil dan memilih fitur dengan orientasi paling cocok seperti yang saya rekomendasikan:

masukkan deskripsi gambar di sini

Atribut dari garis merah yang salah akan diambil. Untuk menghindari hal ini, Anda mungkin ingin membuat semacam toleransi, dan hanya mengambil atribut fitur jika orientasinya (bila dibandingkan dengan orientasi fitur biru asli) termasuk dalam toleransi itu.

EDIT 2 Ups, apakah ini poligon? Saya kira saya hanya berasumsi mereka garis pada latar belakang abu-abu. Jika mereka poligon, saya tidak benar-benar tahu apakah konsep orientasi ini bagus. Tapi Anda bisa memilih semua fitur berpotongan, dan mencari tahu yang memiliki paling tumpang tindih (menjalankan alat tipe Union, dan kemudian menggunakan poligon dengan area terbesar ...).

mr.adam
sumber
Logika itu sehat. Saya telah menggunakan pendekatan serupa di C # / ArcObjects untuk menyalin atribut dari dataset yang tidak akurat dengan atribut ke dataset yang akurat tanpa atribut ... 95% benar. Memeriksa / memperbaiki secara manual diperlukan di area yang sempit tetapi tentu saja lebih cepat daripada melakukan semuanya secara manual.
Michael Stimson
2

Jika Anda ingin menambahkan beberapa atribut dari lapisan merah ke lapisan biru dan satu atribut adalah umum di kedua lapisan, Anda harus menggunakan Add Vector Join .

Saya sudah menulis tentang itu di sini .

  1. Klik kanan pada layer shapefile merah Anda di Layer Panel dan pilih Properties .
  2. Lalu buka tab Bergabung .
  3. Tekan tombol + , itu akan membuat join baru.
  4. Bergabung dengan lapisan adalah lapisan shapefile merah Anda. Gabung bidang adalah bidang dengan nilai-nilai umum di keduanya. Bidang target adalah bidang yang ingin Anda gabung dari lapisan biru.
  5. Setelah itu Anda akan mendapatkan atribut baru di tabel shapefile Anda.

Itu dia.

Di sini Anda memiliki contoh dengan tangkapan layar.

dmh126
sumber
1

Saya lebih suka jawaban dari @ dmh126 karena metodenya memungkinkan lapisan red_line Anda diperbarui dengan mudah.

Hanya untuk menambahkan alternatif, Anda bisa menggunakan alat tabel atribut Bergabung dari Pemrosesan Toolbox dan pilih layer Anda dengan bidang umum. Perhatikan bahwa metode ini membuat shapefile baru alih-alih memperbarui yang sudah ada:

Bergabung dengan tabel atribut

Yusuf
sumber
0

Jika Anda memiliki ID unik di kedua lapisan yang dapat Anda gunakan untuk dengan mudah menggabungkan nilai ke lapisan baru dari yang lama, itu adalah sepotong kue. Tapi sepertinya bukan itu masalahnya.

Jika tidak, itu masalah yang cukup sulit. Saya bertanya-tanya mengapa komentar dari user30184 menyarankan untuk menggunakan OpenJUMP dan plugin http://www.vividsolutions.com/products.asp?catg=spaapp&code=roadmatcher tidak diposting sebagai jawaban karena kedengarannya benar-benar sah bagi saya dalam kasus ini.

Kalau tidak, saya tidak berpikir Anda bisa melakukan ini tanpa coding. Dengan QGIS Anda dapat menggunakan bentuk dan ketika menggabungkan buffering dan berpotongan Anda harus dapat melakukan beberapa pemeriksaan otomatis yang signifikan.

Salah satu pendekatan bisa dengan membandingkan beberapa penyangga garis merah yang cukup besar dengan garis biru dan mendapatkan atribut yang sesuai dan rasio berapa banyak yang cocok. Dalam pseudo-code:

for r_line in red_lines:
  r_line_buf = r_line.buffer()
  intersecting_b_lines = []
  for b_line in blue_lines:
    if r_line_buf.intersects(b_line):
      intersect_length = calculateIntersectionLength(r_line_buf,b_line)
      b_line_values = getAttributes(b_line)
      intersecting_b_lines.append((b_line_values,intersect_length))
  b_line_best_fit = findLongestLineWithinIntersected(intersecting_b_lines)
  r_line_length = r_line.length
  b_vs_r_line_ratio = compareLength(r_line_length,b_line_best_fit)
  saveToNewColumns(r_line, b_line_best_fit.Atribute1, b_line_best_fit.Atribute2..., b_vs_r_line_ratio)
Miro
sumber