Pertanyaan menarik! Saya tidak mengetahui cara lain untuk mencapai apa yang Anda inginkan, tetapi menggunakan PyQGIS.
Baca kode di bawah ini. Ini memiliki beberapa teks di dalamnya: 'lines'
, 'length'
, 'startX'
, 'startY'
, 'endX'
, 'endY'
. Anda dapat menyesuaikan nama-nama itu dalam skrip agar dapat berfungsi pada data Anda. Yang pertama adalah Anda nama lapisan, sedangkan sisanya sesuai dengan nama bidang. Saya menganggap layer baris Anda memiliki bidang-bidang tersebut (setelah semua, Anda ingin nilai ditulis di sana).
Setelah Anda menyesuaikan nama layer Anda dan nama-nama bidang yang ingin Anda perbarui secara otomatis, salin dan tempel skrip ke konsol Python QGIS.
Jika semuanya berjalan dengan baik, Anda harus dapat melihat bahwa nilai-nilai bidang secara otomatis diperbarui dalam dua skenario: 1) Ketika fitur baru ditambahkan, dan 2) Ketika geometri dimodifikasi.
# 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 )
Begini Cara kerjanya:
Jika Anda memiliki masalah saat menjalankan skrip, tambahkan komentar di bawah jawaban ini.
Mungkin berguna bagi Anda untuk memiliki fungsi ini sudah tersedia ketika Anda membuka proyek QGIS Anda. Jika itu masalahnya, katakan padaku, aku bisa mengirim instruksi untuk melakukan itu.
EDIT:
Agar fungsionalitas ini tersedia setiap kali Anda membuka proyek QGIS Anda (yaitu, .qgs
file yang berisi, antara lain, lapisan baris Anda), Anda perlu mengikuti langkah-langkah ini:
Pergi ke QGIS->Project->Project Properties->Macros
, periksa Python macros
opsi, dan ganti seluruh kode dengan yang ini (sesuaikan nilai yang menunjukkan nama layer dan field Anda):
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
Pastikan Anda mengaktifkan macro pada proyek Anda, cara ini: Settings->Options->General->Enable macros: Always
.
Simpan proyek QGIS Anda.
Sekarang, setiap kali Anda membuka .qgs
file yang baru saja Anda simpan, atribut dari layer garis Anda akan secara otomatis diperbarui ketika Anda menambahkan fitur baru atau memodifikasi geometri (yaitu, tidak perlu menyalin apa pun ke dalam Konsol Python QGIS lagi).
EDIT ke-2:
Saya baru saja menerbitkan sebuah plugin yang disebut AutoFields untuk membantu orang menyelesaikan masalah seperti ini. Saya bahkan membuat video yang menunjukkan bagaimana menyelesaikan masalah Anda, Anda dapat menontonnya di:
https://vimeo.com/germap/autofields-geometric-properties
Dokumentasi AutoFields: http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin-for-qgis