別のメソッドを追加するだけで、プロジェクトマクロを設定して、ロード時に次のことができます。
- シェープファイルをcsvに自動的に結合します
IP1
とIP2
フィールドを更新します
- 結合されたフィールドを削除して、シェープファイルのフィールドのみを残します(つまり、重複しない)
最初に、まだプロジェクトを作成していない場合は作成してから、ツールバーに移動します。
プロジェクト>プロジェクトのプロパティ...>マクロ
次に、def openProject():
関数で次のコードを使用して、レイヤーの名前と結合するフィールドを入力します。シェイプファイルと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ファイルを編集すると、次回プロジェクトをロードするときに、フィールドが自動的に更新されます。