Bagaimana cara mengedit data atribut dengan mudah menggunakan Ekspresi Reguler?

30

Saya menulis tutorial untuk siswa MSc yang menggunakan QGIS. Salah satu tugas mengharuskan data atribut untuk diubah (lihat draf pdf tutorial di sini jika tertarik).

Pertanyaannya adalah bagaimana membuat mereka mengedit data atribut. Saya tahu pertanyaan ini telah diajukan sebelumnya , dan jawabannya dulunya sederhana: cukup gunakan LibreOffice calc untuk memodifikasinya dan kemudian menyimpannya, memastikan urutan baris dan judul kolom tetap sama. Saya telah menggunakan pendekatan ini sebelumnya untuk memberikan efek yang besar.

Sayangnya, solusinya tidak lagi berfungsi: menyimpan file .dbf, di LibreOffice (5.4.2) atau OpenOffice (3.4.1) Calc mengacak data dari perspektif QGIS (hanya angka integer acak yang muncul di tabel atribut), dan malah membuat file .dbt tambahan.

Jadi untuk sampai ke pertanyaan: bagaimana saya memberi tahu kelas siswa MSc untuk melakukan ini minggu depan? Saya telah mempertimbangkan opsi berikut:

  1. Gunakan R sebagai gantinya (bagus untuk saya, tetapi menakutkan bagi siswa)
  2. Edit file tersebut sebagai .csv, lalu gabung berdasarkan stempel waktu (baik-baik saja, tetapi tampaknya terlalu rumit, dan dapat menyebabkan lebih banyak kesalahan dalam 2 jam praktis)
  3. Gunakan program alternatif: Saya sudah mencoba Gnumeric dan Excel, yang keduanya tidak menghasilkan hasil yang baik dengan cepat.

Untuk membantu menjawab pertanyaan ini, saya telah membuat contoh yang dapat ditiru . Buka file "points.shp" di QGIS, amati tabel atribut lalu tutup. Edit beberapa sel dalam tabel atribut "points.dbf" di LibreOffice - save. Buka kembali "points.shp" di QGIS dan amati tabel atribut yang diacak. Shapefile lain di folder .zip telah rusak oleh LibreOffice dan OpenOffice untuk menggambarkan seperti apa masalahnya bagi saya.

Singkatnya, bagaimana cara terbaik mengatasi masalah ini?

RobinLovelace
sumber
2
Selamat datang di situs ini, saya ingin mengatakan ini adalah pertanyaan yang sangat bagus, dan mudah-mudahan kita bisa mendapatkan beberapa solusi yang baik. Saya berasumsi sedikit python keluar dari pertanyaan untuk para siswa ini, karena itulah bagaimana saya akan mendekati masalah ini pada contoh pertama ...
sgrieve
13
Mengedit langsung .DBF bagian dari shapefile terlalu berbahaya untuk direkomendasikan untuk penggunaan rutin dan sama sekali tidak boleh digunakan oleh pemula - setidaknya tidak jika ada yang peduli dengan data. Namun, solusi yang lebih andal dari sifat serupa tersedia: pertahankan bidang pengidentifikasi unik di shapefile. Jangan pernah mengeditnya. Alih-alih, simpan atribut dalam tabel terkait (dalam format apa pun yang dapat dibaca GIS Anda), bergabunglah dengan pengidentifikasi yang sama. Sekarang, sebagian besar, Anda dapat mengedit tabel atribut secara bebas tanpa kehilangan koneksi antara bentuk dan atribut - selama Anda melindungi bidang pengidentifikasi.
whuber
1
Solusi Python akan baik-baik saja, asalkan mudah diimplementasikan dan dipahami ... Mengenai menjaga nomor pengenal itu pilihan yang baik - (opsi 2 dalam pertanyaan saya) dan mungkin jawaban default saya. Namun, berharap untuk "perbaikan cepat" sederhana yang tidak melibatkan file tambahan (5 per shapefile cukup IMO!)
RobinLovelace
3
Apa maksud Anda, 5 per shapefile? Coba 9! :-) (File indeks dapat terakumulasi, tergantung pada GIS mana yang sedang digunakan.) Setelah Anda membutuhkan lebih dari satu file terkait untuk memelihara satu set data - dan shapefile memerlukan minimal tiga - benar-benar tidak ada masalah tambahan melempar file tambahan. Tambahkan file metadata juga saat Anda melakukannya. :-) Dan setelah Anda mengatur gabung, bukankah itu terjadi secara otomatis? (Tapi saya tidak melihat bagaimana cap waktu dapat digunakan untuk bergabung. Itu akan digunakan sebagai gantinya untuk sistem kontrol versi.)
whuber
3
Jika Anda memiliki setiap kecenderungan untuk memperkenalkan mereka ke database, spatiaLite memiliki GUI untuk mengedit lapangan dan alat baris perintah untuk data OSM. Maka Anda bisa melibatkan sedikit SQL dan siswa Anda bisa dibilang jauh di depan kurva.
Scro

Jawaban:

18

Jawaban paling sederhana yang saya temukan, berdasarkan saran Ryan Garnett untuk melakukannya dalam QGIS:

Gunakan regexp_replace

Kemampuan ini ditambahkan ke kalkulator lapangan 1 tahun yang lalu oleh Jürgen Fischer (seperti yang diilustrasikan oleh laporan bug ini ). Saya mencoba sebentar untuk mengetahui bagaimana melakukan ini, tetapi gagal mencari "qgis regex" dan istilah-istilah lain yang tidak jelas.

Fungsionalitasnya mungkin paling baik diilustrasikan oleh kebutuhan untuk membakukan semua nilai di kolom "nama". Misalnya, jika kita perlu mengganti semua sel yang berisi pola "Tesc" dengan 'Tesco', menghapus informasi berlebihan seperti "Tesco, Infirmary Road" (yang sering ditambahkan kontributor OSM), fungsi berikut dapat digunakan:

regexp_replace ("name", 'Tesc. *', 'Tesco')

masukkan deskripsi gambar di sini

Saya kira ini adalah fungsi ekspresi reguler Pythonic, karena ini sedikit berbeda dari grep, yang telah saya gunakan sebelumnya.

Saya pikir lebih banyak dokumentasi (detail pada situs web QGIS terbatas pada beberapa kata) diperlukan tentang cara kerjanya, jadi saya telah menandai halaman-halaman berikut untuk referensi di masa mendatang:

Solusi ini memiliki beberapa keunggulan:

  1. Sederhana: tidak perlu program tambahan atau tambahan
  2. Memperkenalkan siswa pada kekuatan ekspresi reguler, menggunakan fungsi (Pythonic?) ("'" Yang mewakili teks menarik. Peringatan: "atau tidak ada simbol yang gagal) dan fungsi baris perintah.

Permintaan maaf karena menjawab pertanyaan saya sendiri, dan banyak terima kasih kepada orang lain karena membimbing saya menuju cahaya! Saya harap utas pertanyaan ini akan bermanfaat bagi orang lain yang menghadapi masalah serupa.

RobinLovelace
sumber
3
Jangan khawatir, menjawab pertanyaan Anda sendiri tidak masalah.
underdark
Saya senang Anda menemukan sesuatu yang akan membantu Anda. Terima kasih telah berbagi, saya tahu saya akan menggunakan ini.
Ryan Garnett
1
Saya bertanya kepada para pengembang QGIS, ini Qt regex qt-project.org/doc/qt-4.8/qregexp.html
wildintellect
9

Ini mungkin jawaban yang bodoh, karena ini bisa menjadi tujuan pembelajaran bagi mahasiswa pascasarjana, tetapi apakah ada alasan mengapa Anda tidak mengedit atribut dalam QGIS dengan menggunakan Field Calculator? Dalam versi sebelumnya, atribut pengeditan QGIS (pra 1.7) langsung dalam QGIS tidak dimungkinkan; karenanya kebutuhan untuk mengedit file .DBF di OpenOffice dll.

Pada 1.7 dan 1.8 Anda dapat mengedit data atribut secara langsung di Kalkulator Bidang, dengan kemampuan untuk melakukan ekspresi bersyarat. Ada juga plugin Python Attribute yang tersedia, yang dapat memberikan opsi tambahan untuk mengedit atribut. Ini mungkin solusi, dan atau, opsi untuk tutorial Anda.

Sebagai siswa Masters sebelumnya dan sekarang menjadi karyawan universitas, saya memahami masalah ini, persyaratan sebelumnya untuk melakukannya di luar QGIS, dan sekarang menghargai kemampuan untuk melakukan semua pengeditan atribut dalam QGIS. Saya akan dengan senang hati membantu Anda dengan ini lebih banyak, jika Anda menginginkannya.

Ryan Garnett
sumber
1
Hai Ryan, ya itu akan menjadi solusi ideal. Ini adalah kemampuan untuk mencari dan mengganti teks dalam tabel atribut, untuk membakukan nama OSM yang berantakan, yang mendorong saya untuk mencoba dan mengedit file .dbf secara langsung. Saya lebih suka mengeditnya dalam QGIS. Akan mencoba plugin Python Attribute - mungkin solusi ide. Seharusnya membuat fakta saya mencari regex pencarian / ganti kapabilitas lebih jelas dalam pertanyaan.
RobinLovelace
@ user1694378 Anda masih dapat mengklarifikasi pertanyaan Anda.
underdark
Terima kasih underdark untuk mendorong saya untuk melakukan itu - lebih baik mencerminkan apa yang sebenarnya ingin saya lakukan.
RobinLovelace
3

Anda dapat menggunakan Pangkalan LibreOffice untuk memodifikasi file dbf Anda .

  1. Open Base (dapatkan Menu Utama)
  2. Pilih "Sambungkan ke database yang ada" dan pilih ketik "dBASE".
  3. Pilih folder dengan file dbf Anda.
  4. Pilih opsi final yang diinginkan dan "Selesai".
  5. Beri nama file koneksi database Anda apa pun yang Anda inginkan (mis. "MyxBasefiles.odb) dan simpan di suatu tempat. Selanjutnya akses file database Anda dengan mengklik file ini. OoOoo, Nice.
  6. Pilih "Tabel" pada panel kiri, dan ada file data Anda (disebut "tabel"). Berantakan dengan mereka.

Anda sekarang dapat mulai mengeditnya. Semoga itu cukup baik untuk keperluan Anda.

Anda juga dapat mencoba DBF Explorer meskipun hanya Windows. Itu memang memiliki pencarian dan ganti.

masukkan deskripsi gambar di sini

RK
sumber
1
Hai RK Terima kasih atas jawaban yang cepat: tampaknya merupakan cara yang andal dan aman untuk mengedit file .dbf. Saya baru saja mencoba apa yang Anda katakan dan saya senang mengatakan itu berhasil.
RobinLovelace
Senang mendengarnya. Pelajaran yang bagus ada di sana. :)
RK
Tapi ... Saya baru saja mencoba apa yang Anda katakan dan saya senang mengatakan itu bekerja untuk sel individu. Sayangnya ini bukan solusi 100% untuk aplikasi khusus ini, karena tampaknya OOBase tidak memiliki fungsi pencarian-ganti yang diperlukan untuk tutorial karena [bug] ( lists.freedesktop.org/archives/libreoffice-bugs/2010 -Desember / ... ). Pasti bekerja pada sel individu: diuji. Jadi itu solusi 90% untuk pengeditan sel demi sel, kecuali saya melewatkan fungsi pencarian-replac. Ada ide bagaimana cara mengganti semua entri "Tesc. *" Dengan "Tesco", misalnya?
RobinLovelace
Tautan yang lebih baik untuk bug Pangkalan OO: bugs.freedesktop.org/show_bug.cgi?id=32506
RobinLovelace
Memperbarui jawaban saya.
RK