İlginç soru! İstediğini başarmanın başka bir yolunun farkında değilim, ama PyQGIS kullanıyorum.
Aşağıdaki kodu okuyun. İçinde bazı metinler vardır: 'lines'
, 'length'
, 'startX'
, 'startY'
, 'endX'
, 'endY'
. Kodunuzdaki bu adları verileriniz üzerinde çalışması için ayarlayabilirsiniz. İlki katman adı, geri kalanı ise alan adlarına karşılık gelir. Çizgi katmanınızın bu alanlara sahip olduğunu varsayıyorum (sonuçta, değerlerin orada yazılmasını istiyorsunuz).
Katman adınızı ve otomatik olarak güncellenmesini istediğiniz alanların adlarını ayarladıktan sonra komut dosyasını kopyalayıp QGIS Python konsoluna yapıştırın.
Her şey yolunda giderse, alan değerlerinin iki senaryoda otomatik olarak güncellendiğini görebilmeniz gerekir: 1) Yeni özellikler eklendiğinde ve 2) Geometriler değiştirildiğinde.
# 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 )
Bu nasıl çalışır:
Komut dosyasını çalıştırırken herhangi bir sorun yaşarsanız, bu cevabın altına bir yorum ekleyin.
QGIS projenizi açtığınızda bu işlevselliği zaten hazır bulundurmanız kullanışlı olabilir. Eğer durum buysa, söyle bana, bunu yapmak için talimatlar gönderebilirim.
DÜZENLE:
Bu işlevselliğin QGIS projenizi her açtığınızda (diğer bir deyişle, .qgs
çizgi katmanınızı içeren bir dosya) kullanılabilir olması için şu adımları izlemeniz gerekir:
Git QGIS->Project->Project Properties->Macros
, Python macros
seçeneği kontrol et ve tüm kodu bu kodla değiştir (katman ve alan adlarını gösteren değerleri ayarla):
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
Emin projeniz, bu yolda makroları etkinleştirmek olun: Settings->Options->General->Enable macros: Always
.
QGIS projenizi kaydedin.
Şimdi, .qgs
kaydettiğiniz dosyayı her açtığınızda, yeni bir özellik eklediğinizde veya bir geometri değiştirdiğinizde (yani artık QGIS Python Konsoluna herhangi bir şey kopyalamanıza gerek kalmaz) çizgi katmanınızın özellikleri otomatik olarak güncellenecektir.
2. DÜZENLEME:
İnsanların bu tür sorunları çözmelerine yardımcı olmak için AutoFields adlı bir eklenti yayınladım . Hatta plobleminizi nasıl çözeceğinizi gösteren bir video bile hazırladım:
https://vimeo.com/germap/autofields-geometric-properties
AutoFields belgeleri: http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin-for-qgis