興味深い質問です!私はあなたが望むものを達成する他の方法を知りませんが、PyQGISを使用します。
以下のコードを読んでください。それはそれでいくつかのテキストを持っています:'lines'
、'length'
、'startX'
、'startY'
、'endX'
、'endY'
。スクリプトでこれらの名前を調整して、データで機能するようにすることができます。最初はレイヤー名ですが、残りはフィールド名に対応しています。私はあなたのラインレイヤーがそれらのフィールドを持っていると思います(結局のところ、そこに値を書き込む必要があります)
レイヤー名と自動的に更新するフィールドの名前を調整したら、スクリプトをコピーしてQGIS Pythonコンソールに貼り付けます。
すべてがうまくいけば、2つのシナリオでフィールド値が自動的に更新されることがわかります。1)新しい機能が追加されたとき、および2)ジオメトリが変更されたとき。
# Initialize required variables
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'lines' )[0]
lengthField = myLayer.fieldNameIndex( 'length' )
startXField = myLayer.fieldNameIndex( 'startX' )
startYField = myLayer.fieldNameIndex( 'startY' )
endXField = myLayer.fieldNameIndex( 'endX' )
endYField = myLayer.fieldNameIndex( 'endY' )
# Slot, updates field values
def updateFeatureAttrs( fId, geom=None ):
f = myLayer.getFeatures( QgsFeatureRequest( fId ) ).next()
if not geom:
geom = f.geometry()
myLayer.changeAttributeValue( fId, lengthField, geom.length() )
myLayer.changeAttributeValue( fId, startXField, geom.vertexAt( 0 )[0] )
myLayer.changeAttributeValue( fId, startYField, geom.vertexAt( 0 )[1] )
myLayer.changeAttributeValue( fId, endXField, geom.asPolyline()[-1][0] )
myLayer.changeAttributeValue( fId, endYField, geom.asPolyline()[-1][1] )
# Update feature attributes when new features are added or geometry changes
myLayer.featureAdded.connect( updateFeatureAttrs )
myLayer.geometryChanged.connect( updateFeatureAttrs )
これはどのように機能するかです:
スクリプトの実行中に問題が発生した場合は、この回答の下にコメントを追加してください。
QGISプロジェクトを開いたときに、この機能がすでに利用可能になっていると便利です。その場合は、教えてください。そのための指示を投稿できます。
編集:
この機能をQGISプロジェクト(つまり.qgs
、とりわけラインレイヤーを含むファイル)を開くたびに使用できるようにするには、次の手順に従う必要があります。
に移動しQGIS->Project->Project Properties->Macros
、Python macros
オプションを確認して、コード全体を次のコードに置き換えます(レイヤー名とフィールド名を示す値を調整します)。
from qgis.core import QgsMapLayerRegistry, QgsFeatureRequest
def openProject():
# Initialize required variables
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'lines' )[0]
# Update feature attributes when new features are added or geometry changes
myLayer.featureAdded.connect( updateFeatureAttrs )
myLayer.geometryChanged.connect( updateFeatureAttrs )
# Slot, updates field values
def updateFeatureAttrs( fId, geom=None ):
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'lines' )[0]
lengthField = myLayer.fieldNameIndex( 'length' )
startXField = myLayer.fieldNameIndex( 'startX' )
startYField = myLayer.fieldNameIndex( 'startY' )
endXField = myLayer.fieldNameIndex( 'endX' )
endYField = myLayer.fieldNameIndex( 'endY' )
f = myLayer.getFeatures( QgsFeatureRequest( fId ) ).next()
if not geom:
geom = f.geometry()
myLayer.changeAttributeValue( fId, lengthField, geom.length() )
myLayer.changeAttributeValue( fId, startXField, geom.vertexAt( 0 )[0] )
myLayer.changeAttributeValue( fId, startYField, geom.vertexAt( 0 )[1] )
myLayer.changeAttributeValue( fId, endXField, geom.asPolyline()[-1][0] )
myLayer.changeAttributeValue( fId, endYField, geom.asPolyline()[-1][1] )
def saveProject():
pass
def closeProject():
pass
次のようにして、プロジェクトでマクロを必ず有効にしてくださいSettings->Options->General->Enable macros: Always
。
QGISプロジェクトを保存します。
.qgs
保存したばかりのファイルを開くたびに、新しいフィーチャを追加したり、ジオメトリを変更したりすると、ラインレイヤーの属性が自動的に更新されます(つまり、QGIS Pythonコンソールに何もコピーする必要がなくなります)。
2番目の編集:
AutoFieldsと呼ばれるプラグインを公開しました。この種の問題を解決するのに役立ちます。私はあなたの問題を解決する方法を示すビデオを作りました、あなたはそれを以下で見ることができます:
https://vimeo.com/germap/autofields-geometric-properties
AutoFieldsのドキュメント:http ://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin-for-qgis