เพียงเพื่อเพิ่มวิธีอื่นคุณสามารถตั้งค่าแมโครโครงการซึ่งเมื่อโหลด:
- รวม Shapefile ของคุณเข้ากับ csv ของคุณโดยอัตโนมัติ
- อัพเดต
IP1
และIP2
ฟิลด์
- ลบเขตข้อมูลที่เข้าร่วมออกจากเขตข้อมูลของ 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 ในครั้งถัดไปที่คุณโหลดโปรเจ็กต์ฟิลด์ควรถูกอัพเดตโดยอัตโนมัติ: