Menggabungkan data dari Excel ke tabel atribut di QGIS tanpa membuat duplikat?

15

Saya memiliki tabel atribut dengan dua bidang kosong di QGIS.

Contoh 1

Saya ingin mengimpor database excel untuk mengisi bidang kosong saya di QGIS. File excel saya cocok dengan kolom di tabel atribut QGIS saya.

Example_2

Saya dapat menggabungkan excel (.CSV) saya dengan benar ke shapefile saya. Namun, proses, alih-alih mengisi bidang kosong seperti yang saya inginkan, membuat duplikat. Dengan bantuan «Table Manager» saya dapat memperbaiki situasi, tetapi itu membutuhkan banyak waktu. Saya mencari cara yang lebih efisien untuk bergabung dengan data excel saya.

Example_3

Bagaimana saya bisa bergabung dengan file excel saya ke tabel atribut saya tanpa membuat duplikat?

Laurent Robitaille-Lainesse
sumber
3
Lihatlah tutorial ini: Performing Table Joins
ArMoraer

Jawaban:

13

Saya akan melakukan hal-hal berikut untuk membuat hidup lebih mudah:

Sebelum Anda melakukan ini, buat cadangan dari shapefile Anda.

  1. Di shapefile Anda, buka properti layer / bidang dan nyalakan mode edit.
  2. pilih semua Bidang kecuali bidang ID
  3. Hapus semua bidang kecuali Bidang ID
  4. tambahkan file csv Anda sebagai layer di QGIS (Menu utama / Layer / Tambahkan Layer / Tambahkan layer teks terbatas) masukkan deskripsi gambar di sini(pilih tanpa geometri)
  5. di shapefile Anda, pilih properti / bergabung dan pilih bidang ID untuk sumber dan target. Seperti dijelaskan dalam jawaban lain untuk pertanyaan ini.
  6. Simpan Shapefile Anda yang dimodifikasi.

masukkan deskripsi gambar di sini

ini adalah tab Field yang saya maksud

masukkan deskripsi gambar di sini

Jangan lupa untuk beralih pengeditan sebelum dan sesudah menghapus bidang yang tidak perlu

RutgerH
sumber
13

Anda ingin bergabung dengan file excel ke shapefile. Anda akan bergabung dengan mereka pada atribut umum dan hasilnya akan menjadi layer gabungan di mana setiap catatan menyimpan atribut dari kedua file shapefile dan excel.

Ok pertama, Anda memuat file excel Anda dan vektor Anda nanti ke dalam lapisan. Saya menggunakan beberapa data uji yang saya buat tetapi pengaturan Anda akan terlihat seperti di bawah ini. masukkan deskripsi gambar di sini

Sekarang klik kanan pada layer (di panel lapisan) dan pilih properti, lalu pilih bergabung. Pertama tekan tanda + hijau di kiri bawah (Panah Merah Besar pada gambar di bawah) dan itu akan memunculkan menu Tambah Vektor Gabung baru (seperti di bawah) Di sini layer gabung Anda akan menjadi file excel (jadi pilih file excel yang tepat) & sheet) kolom gabungan adalah bidang dalam file excel yang menyimpan atribut umum ke shapefile. Bidang target adalah bidang yang cocok di shapefile. (dalam kasus saya kedua bidang umum kebetulan bernama unit, tetapi jika bidang itu disebut UNIT_ dalam shapefile saya akan menggunakannya daripada UNIT untuk bidang target saya)
masukkan deskripsi gambar di sini Ada beberapa opsi lain yang dapat Anda mainkan di join, seperti jika Anda hanya ingin melihat bidang tertentu, dll ... tetap jadi sekarang mereka bergabung dan jika Anda kembali dan melihat atribut shapefile Anda akan melihat sekarang memiliki atribut yang sesuai dari file excel seperti di bawah ini.

masukkan deskripsi gambar di sini

Berikut adalah beberapa tutorial praktis untuk menunjukkan kepada Anda langkah demi langkah cara melakukannya:

https://www.mapbox.com/tilemill/docs/guides/joining-data/

http://maps.cga.harvard.edu/qgis/wkshop/join_csv.php

http://qgis.spatialthoughts.com/2012/03/using-tabular-data-in-qgis.html

Bagaimana cara bergabung dengan tabel eksternal dengan tabel atribut shapefile di QGIS?

http://www.digital-geography.com/qgis-tutorial-ii-how-to-join-data-with-shapefiles/#.Vs9vpmHXKUk

dan tutorial ArMoraer disebutkan dalam komentar.

ed. terima kasih
sumber
Saya melihat tutorial mapbox.com/tilemill/docs/guides/joining-data yang, bagaimanapun, sangat berguna. Namun, saya masih tidak dapat bergabung dengan file DBF saya ke shapefile saya. Itu mengejutkan saya karena kedua struktur meja saya sangat cocok. Sepertinya saya salah paham tentang «Gabung bidang» dan «target bidang». Bisakah Anda menambahkan detail lebih lanjut?
Laurent Robitaille-Lainesse
1
@Laurent Robitaille-Lainesse Saya memperbarui posting saya dengan panduan langkah demi langkah yang lebih banyak. Saya bergabung dengan file excel pengujian ke poligon hanya untuk memastikan langkah saya benar.
ed.hank
Saya berhasil menggabungkan file excel saya dengan benar ke QGIS. Saya perhatikan bahwa opsi «gabung» menambahkan bidang baru di tabel atribut. Perbaiki saya jika saya salah, tetapi sepertinya tidak mungkin untuk menambahkan data dari file excel saya ke bidang kosong di tabel atribut saya.
Laurent Robitaille-Lainesse
1
Jika Anda memiliki bidang kosong, maka Anda menggunakan kalkulator bidang untuk mengisi dari bidang yang baru bergabung dengan bidang dalam tabel Anda.
ed. Terima kasih
10

Hanya untuk menambahkan metode lain, Anda dapat mengatur makro Proyek yang ketika dimuat:

  1. Secara otomatis bergabung dengan shapefile Anda ke csv Anda
  2. Memperbarui bidang IP1danIP2
  3. Menghapus bidang yang tergabung hanya menyisakan bidang shapefile (yaitu tidak ada dulplicate)

Pertama, buat proyek jika Anda belum melakukannya lalu buka bilah alat:

Project> Project Properties ...> Macro

Kemudian gunakan kode berikut dalam def openProject():fungsi dan masukkan nama layer Anda dan bidang yang ingin Anda gabungkan. Saya menggunakan "Contoh" dan "spreadsheet" masing-masing untuk file shapefile dan csv saya dengan bidang ID:

from PyQt4.QtCore import *
import qgis
from qgis.core import QgsMapLayerRegistry, QgsVectorJoinInfo

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your shapefile name
    if layer.name() == "Example":
        qgis.utils.iface.setActiveLayer(layer)
        shp = qgis.utils.iface.activeLayer()

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your csv name
    if layer.name() == "spreadsheet":
        qgis.utils.iface.setActiveLayer(layer)
        csv = qgis.utils.iface.activeLayer()

# Set up join parameters
shpField='ID'
csvField='ID'
joinObject = QgsVectorJoinInfo()
joinObject.joinLayerId = csv.id()
joinObject.joinFieldName = csvField
joinObject.targetFieldName = shpField
shp.addJoin(joinObject)

# Define fields to update and joined fields to copy values from
ip1 = shp.fieldNameIndex('IP1') 
ip1_join = shp.fieldNameIndex('spreadsheet_IP1')
ip2 = shp.fieldNameIndex('IP2') 
ip2_join = shp.fieldNameIndex('spreadsheet_IP2')

shp.startEditing()
for feat in shp.getFeatures():
    shp.changeAttributeValue(feat.id(), ip1, feat.attributes()[ip1_join])
    shp.changeAttributeValue(feat.id(), ip2, feat.attributes()[ip2_join])
shp.commitChanges()

# Remove join 
shp.removeJoin(csv.id())

Makro proyek

Pastikan bahwa layer tidak bergabung, simpan proyek dan aktifkan makro dengan pergi ke toolbar:

Pengaturan> Umum> Aktifkan makro


Sekarang ketika Anda menutup proyek dan mengedit file csv, saat berikutnya Anda memuat proyek, bidang harus secara otomatis diperbarui:

Mengedit file csv

Hasil

Yusuf
sumber
7

Saran saya adalah menggunakan LibreOffice / Open Office sumber terbuka untuk mengedit file Excel Anda dan membuat file .dbf. Saya menyiapkan buku kerja ujian untuk Anda. Tes buku kerja - tautan

  1. Buka file di Libre Office / Open Office.
  2. Tempel ke data lembar "Excel" dari file excel Anda.
  3. Tempel ke data lembar "DBF" dari file .dbf Anda (tempelkan hanya ID, X, Y) (IP1, nilai-nilai IP2 akan ditambahkan secara otomatis).
  4. Simpan sebagai file name.dbf (dengan nama yang sama dengan nama file bentuk Anda).

Tabel hasil tanpa duplikat di QGIS: masukkan deskripsi gambar di sini

Artec
sumber
5

Mengapa ada bidang kosong di sana? Bisakah Anda mulai tanpa bidang kosong dan hanya menggunakan dua kolom yang dihasilkan dalam bergabung? Saya pikir ini adalah pendekatan yang paling sederhana. Entah itu atau menemukan alat yang mirip dengan alat "Muat" di ArcGIS.

https://desktop.arcgis.com/en/arcmap/latest/extensions/production-mapping/loading-data-into-a-geodatabase.htm

Jika Anda tidak menggunakan geodatabase, saya sangat merekomendasikan ini.

Stella
sumber
Saya tidak menggunakan geodatabase. Sebenarnya, saya tidak terbiasa dengannya.
Laurent Robitaille-Lainesse
1
@ LaurentRobitaille-Lainesse Saya sangat merekomendasikan membuat geodatabase file baru, kemudian kelas fitur baru di dalamnya, dan menggunakannya untuk menyimpan data Anda. Saya juga merekomendasikan melakukan penelitian singkat tentang geodatabases dan kelas fitur dan mengapa kami menggunakannya, apa yang mereka tawarkan di luar shapefile.
Stella
4

Saya tidak tahu apakah ada cara langsung untuk bergabung tanpa duplikat sejak itu .shp mendukung file dengan atribut dalam .DBF (file database). DBF ini memiliki deklarasi tipe kolom seperti integer, real, string, dll dengan detail panjang dan presisi. File CSV hanya memiliki kolom normal tanpa jenis apa pun yang dideklarasikan. Saya tidak tahu seberapa besar file Anda. Bagi saya, saya akan menyimpan duplikat Fields dan kemudian menggunakan caluclator bidang dengan rumus umum:

Field_x Asli = Duplikat Field_x

Kemudian hapus semua bidang yang digandakan (melalui QGIS atau program basis data)

Uje Indo
sumber
3

Saya percaya cara termudah untuk memperbaikinya adalah dengan menghapus dua kolom yang dimaksud dalam tabel QGIS sebelum bergabung. Kemudian, ketika Anda bergabung dengan shapefile, dua kolom yang Anda inginkan tidak akan menjadi duplikat dan akan menyimpan nama kolom aslinya.

RHB
sumber