การเข้าร่วมข้อมูลจาก Excel ไปยังตารางแอตทริบิวต์ใน QGIS โดยไม่ต้องสร้างรายการซ้ำ?


15

ฉันมีตารางคุณลักษณะที่มีสองฟิลด์ว่างใน QGIS

Example_1

ฉันต้องการนำเข้าฐานข้อมูล excel เพื่อเติมฟิลด์ว่างใน QGIS ไฟล์ excel ของฉันตรงกับคอลัมน์ในตารางแอตทริบิวต์ QGIS ของฉัน

Example_2

ฉันสามารถเข้าร่วม excel ของฉัน (.CSV) กับรูปร่างของฉันได้อย่างถูกต้อง อย่างไรก็ตามกระบวนการแทนที่จะสร้างฟิลด์ว่างตามที่ฉันต้องการสร้างรายการซ้ำ ด้วยความช่วยเหลือของ«ผู้จัดการตาราง»ฉันสามารถแก้ไขสถานการณ์ได้ แต่ต้องใช้เวลานาน ฉันกำลังมองหาวิธีที่มีประสิทธิภาพมากขึ้นในการเข้าร่วมข้อมูล excel ของฉัน

Example_3

ฉันจะเข้าร่วมไฟล์ excel ของฉันไปที่ตารางคุณลักษณะของฉันโดยไม่ต้องสร้างรายการซ้ำได้อย่างไร


3
ดูบทช่วยสอนนี้: การแสดงตาราง Joins
ArMoraer

คำตอบ:


13

ฉันจะทำสิ่งต่อไปนี้เพื่อทำให้ชีวิตง่ายขึ้น:

ก่อนที่คุณจะทำสิ่งนี้ให้สำรองข้อมูลไฟล์รูปร่างของคุณ

  1. ใน shapefile ของคุณไปที่คุณสมบัติเลเยอร์ / ฟิลด์และเปิดโหมดแก้ไข
  2. เลือกฟิลด์ทั้งหมดยกเว้นฟิลด์ ID
  3. ลบฟิลด์ทั้งหมดยกเว้นฟิลด์ ID
  4. เพิ่มไฟล์ csv ของคุณเป็นเลเยอร์ใน QGIS (เมนูหลัก / เลเยอร์ / เพิ่มเลเยอร์ / เพิ่มเลเยอร์ข้อความที่คั่นด้วย) ป้อนคำอธิบายรูปภาพที่นี่(เลือกไม่มีรูปทรงเรขาคณิต)
  5. ใน shapefile ของคุณเลือกคุณสมบัติ / รวมแล้วเลือกทั้งฟิลด์ ID สำหรับแหล่งที่มาและเป้าหมาย ตามที่อธิบายไว้ในคำตอบอื่น ๆ สำหรับคำถามนี้
  6. บันทึก Shapefile ที่แก้ไขของคุณ

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือแท็บฟิลด์ที่ฉันอ้างถึง

ป้อนคำอธิบายรูปภาพที่นี่

อย่าลืมสลับการแก้ไขก่อนและหลังการลบฟิลด์ที่ไม่จำเป็น


13

คุณจะต้องเข้าร่วมไฟล์ excel กับ shapefile คุณจะเข้าร่วมกับพวกเขาในคุณสมบัติทั่วไปและผลที่ได้จะเป็นชั้นที่เข้าร่วมที่แต่ละระเบียนถือคุณสมบัติของทั้งรูปร่างและไฟล์ excel

ตกลงก่อนคุณโหลดไฟล์ excel และเวกเตอร์ของคุณในภายหลังในชั้น ฉันใช้ข้อมูลทดสอบบางอย่างที่ฉันทำ แต่การตั้งค่าของคุณควรมีลักษณะคล้ายกับด้านล่าง ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้คลิกขวาที่เลเยอร์ (ในแผงเลเยอร์) และเลือกคุณสมบัติจากนั้นเลือกเข้าร่วม เริ่มแรกกดที่เครื่องหมายสีเขียวที่ด้านล่างซ้าย (ลูกศรสีแดงขนาดใหญ่ในภาพด้านล่าง) และมันจะแสดงเมนู Add Vector Join ใหม่ (เช่นด้านล่าง) ที่นี่เลเยอร์การเข้าร่วมของคุณจะเป็นไฟล์ excel (ดังนั้นเลือกไฟล์ excel ที่เหมาะสม & แผ่น) ฟิลด์การเข้าร่วมเป็นฟิลด์ในไฟล์ excel ที่เก็บแอตทริบิวต์ทั่วไปไว้ใน shapefile ฟิลด์เป้าหมายคือฟิลด์ที่ตรงกันใน shapefile (ในกรณีของฉันทั้งสองช่องทั่วไปเกิดขึ้นเป็นหน่วยชื่อ แต่ถ้าเขตข้อมูลที่ถูกเรียกว่า UNIT_ ใน shapefile ฉันจะได้ใช้มันแทน UNIT สำหรับเขตข้อมูลเป้าหมายของฉัน)
ป้อนคำอธิบายรูปภาพที่นี่ มีตัวเลือกอื่น ๆ ที่คุณสามารถยุ่งเกี่ยวกับการเข้าร่วมเช่นถ้าคุณเพียงต้องการที่จะเห็นเขตข้อมูลบางอย่าง ฯลฯ ... ต่อไปดังนั้นตอนนี้พวกเขาจะเข้าร่วมและถ้าคุณกลับไปดูคุณลักษณะของรูปร่างที่คุณจะเห็น ตอนนี้มันมีคุณสมบัติที่สอดคล้องกันของไฟล์ excel เช่นด้านล่าง

ป้อนคำอธิบายรูปภาพที่นี่

ต่อไปนี้เป็นบทแนะนำที่มีประโยชน์ไม่กี่ข้อเพื่อแสดงให้คุณเห็นทีละขั้นตอน:

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

วิธีการเข้าร่วมตารางภายนอกกับตารางแอตทริบิวต์ของ shapefile ใน QGIS?

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

และกวดวิชา ArMoraer พูดถึงในความคิดเห็น


ฉันดูที่mapbox.com/tilemill/docs/guides/joining-data/กวดวิชาซึ่งเป็นประโยชน์อย่างมาก อย่างไรก็ตามฉันยังคงไม่สามารถเข้าร่วมไฟล์ DBF ของฉันกับ shapefile ของฉัน มันทำให้ฉันแปลกใจเพราะโครงสร้างตารางของฉันทั้งคู่ตรงกันอย่างสมบูรณ์ ฉันดูเหมือนจะเข้าใจผิดว่า«เข้าร่วมฟิลด์»และ«ฟิลด์เป้าหมาย» คุณช่วยเพิ่มรายละเอียดเพิ่มเติมได้ไหม?
Laurent Robitaille-Lainesse

1
@Laurent Robitaille-Lainesse ฉันอัปเดตโพสต์ด้วยคำแนะนำทีละขั้นตอน ฉันเข้าร่วมทดสอบไฟล์ excel ในไฟล์รูปหลายเหลี่ยมเพียงเพื่อให้แน่ใจว่าขั้นตอนของฉันถูกต้อง
ed.hank

ฉันเข้าร่วมไฟล์ excel กับ QGIS อย่างถูกต้อง ฉันสังเกตว่าตัวเลือก«เข้าร่วม»เพิ่มเขตข้อมูลใหม่ในตารางแอตทริบิวต์ แก้ไขให้ถูกต้องหากฉันผิด แต่ดูเหมือนว่าเป็นไปไม่ได้ที่จะเพิ่มข้อมูลจากไฟล์ excel ของฉันไปยังฟิลด์ว่างในตารางคุณลักษณะของฉัน
Laurent Robitaille-Lainesse

1
หากคุณมีฟิลด์ว่างเปล่าคุณจะใช้เครื่องคำนวณฟิลด์เพื่อเติมข้อมูลจากฟิลด์ที่รวมใหม่ไปยังฟิลด์ที่มีในตารางของคุณ
ed.hank

10

เพียงเพื่อเพิ่มวิธีอื่นคุณสามารถตั้งค่าแมโครโครงการซึ่งเมื่อโหลด:

  1. รวม Shapefile ของคุณเข้ากับ csv ของคุณโดยอัตโนมัติ
  2. อัพเดตIP1และIP2ฟิลด์
  3. ลบเขตข้อมูลที่เข้าร่วมออกจากเขตข้อมูลของ shapefile เท่านั้น (เช่นไม่มี dulplicates)

ขั้นแรกให้สร้างโครงการหากคุณยังไม่ได้ดำเนินการจากนั้นไปที่แถบเครื่องมือ:

โครงการ> คุณสมบัติโครงการ ... > มาโคร

จากนั้นใช้รหัสต่อไปนี้ในdef openProject():ฟังก์ชันและป้อนชื่อเลเยอร์และฟิลด์ที่คุณต้องการเข้าร่วม ฉันใช้ "ตัวอย่าง" และ "สเปรดชีต" สำหรับไฟล์ shapefile และ csv ของฉันตามลำดับกับฟิลด์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())

แมโครโครงการ

ตรวจสอบให้แน่ใจว่าเลเยอร์ไม่ได้เข้าร่วมบันทึกโครงการและเปิดใช้งานแมโครโดยไปที่แถบเครื่องมือ:

การตั้งค่า> ทั่วไป> เปิดใช้งานมาโคร


ตอนนี้เมื่อคุณปิดโปรเจ็กต์และแก้ไขไฟล์ csv ในครั้งถัดไปที่คุณโหลดโปรเจ็กต์ฟิลด์ควรถูกอัพเดตโดยอัตโนมัติ:

การแก้ไขไฟล์ csv

ผล


7

ข้อเสนอแนะของฉันคือการใช้ Open Source LibreOffice / Open Officeเพื่อแก้ไขไฟล์ Excel ของคุณและสร้างไฟล์. dbf ฉันเตรียมสมุดงานทดสอบสำหรับคุณ ทดสอบสมุดงาน - ลิงค์

  1. เปิดไฟล์ใน Libre Office / Open Office
  2. วางข้อมูลแผ่นงาน "Excel" จากไฟล์ excel ของคุณ
  3. วางข้อมูลแผ่นงาน "DBF" จากไฟล์. dbf ของคุณ (วางเฉพาะ ID, X, Y) (ค่า IP1, IP2 จะถูกเพิ่มโดยอัตโนมัติ)
  4. บันทึกเป็นไฟล์ name.dbf (โดยที่ชื่อเหมือนกันกับชื่อไฟล์รูปร่างของคุณ)

ตารางผลลัพธ์โดยไม่ซ้ำซ้อนใน QGIS: ป้อนคำอธิบายรูปภาพที่นี่


5

เหตุใดจึงมีฟิลด์ว่างที่นั่นเพื่อเริ่มต้นด้วย คุณสามารถเริ่มต้นโดยไม่มีฟิลด์ว่างและใช้สองคอลัมน์ที่สร้างในการเข้าร่วมได้หรือไม่ ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุด ไม่ว่าจะเป็นหรือค้นหาเครื่องมือที่คล้ายกับเครื่องมือ "โหลด" ใน ArcGIS

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

หากคุณไม่ได้ใช้ฐานข้อมูลภูมิศาสตร์ฉันขอแนะนำอย่างนี้


ฉันไม่ได้ใช้ฐานข้อมูลภูมิศาสตร์ ในความเป็นจริงฉันไม่ familliar กับมัน
Laurent Robitaille-Lainesse

1
@ LaurentRobitaille-Lainesse ฉันขอแนะนำให้สร้างไฟล์ Geodatabase ใหม่จากนั้นเป็นฟีเจอร์คลาสใหม่ภายในนั้นและใช้สิ่งนี้เพื่อจัดเก็บข้อมูลของคุณ ฉันยังแนะนำให้ทำวิจัยสั้น ๆ เกี่ยวกับฐานข้อมูลทางภูมิศาสตร์และชั้นเรียนคุณลักษณะและทำไมเราใช้พวกเขาสิ่งที่พวกเขาเสนอเกินรูปร่าง
Stella

4

ฉันไม่รู้ว่ามีวิธีเข้าร่วมโดยตรงโดยไม่ต้องทำซ้ำหรือไม่เนื่องจากไฟล์. shp สนับสนุนโดยระบุใน. DBF (ไฟล์ฐานข้อมูล) DBF นี้มีการประกาศประเภทคอลัมน์เช่นจำนวนเต็มจริงสตริง ฯลฯ โดยมีรายละเอียดของความยาวและความแม่นยำ ไฟล์ CSV มีคอลัมน์ปกติเท่านั้นโดยไม่มีการประกาศประเภทใด ๆ ฉันไม่รู้ว่าไฟล์ของคุณใหญ่แค่ไหน สำหรับฉันฉันจะเก็บฟิลด์ที่ซ้ำกันไว้แล้วใช้ตัวคำนวณฟิลด์ด้วยสูตรทั่วไป:

ต้นฉบับ Field_x = ซ้ำ Field_x

จากนั้นลบฟิลด์ที่ทำซ้ำทั้งหมด (ผ่าน QGIS หรือโปรแกรมฐานข้อมูล)


3

ฉันเชื่อว่าวิธีที่ง่ายที่สุดในการแก้ไขปัญหานี้คือเพียงแค่ลบสองคอลัมน์ที่เป็นปัญหาในตาราง QGIS ก่อนที่จะเข้าร่วม จากนั้นเมื่อคุณเข้าร่วม shapefile สองคอลัมน์ที่คุณต้องการจะไม่ซ้ำกันและจะเก็บชื่อคอลัมน์เดิมไว้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.