Chỉ cần thêm phương thức khác, bạn có thể thiết lập macro Project khi được tải:
- Tự động tham gia shapefile của bạn vào csv của bạn
- Cập nhật
IP1
và IP2
các lĩnh vực
- Loại bỏ các trường đã tham gia chỉ để lại các trường của shapefile (tức là không có dulplicates)
Đầu tiên, tạo một dự án nếu bạn chưa thực hiện và sau đó vào thanh công cụ:
Dự án> Thuộc tính dự án ...> Macro
Sau đó, sử dụng mã sau đây trong def openProject():
hàm và nhập tên của các lớp của bạn và các trường bạn muốn tham gia. Tôi đã sử dụng "Ví dụ" và "bảng tính" cho tệp shapefile và csv của mình tương ứng với trường 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())
Đảm bảo rằng các lớp không được nối, lưu dự án và bật macro bằng cách vào thanh công cụ:
Cài đặt> Chung> Bật macro
Bây giờ khi bạn đóng dự án và chỉnh sửa tệp csv, lần sau khi bạn tải dự án, các trường sẽ tự động được cập nhật: