दिलचस्प सवाल! आप जो चाहते हैं, उसे प्राप्त करने के किसी भी अन्य तरीके से मैं अवगत नहीं हूं, लेकिन PyQGIS का उपयोग कर रहा हूं।
नीचे दिए गए कोड को पढ़ें। यह उस में कुछ ग्रंथों है: 'lines'
, 'length'
, 'startX'
, 'startY'
, 'endX'
, 'endY'
। आप अपने डेटा पर काम करने के लिए स्क्रिप्ट में उन नामों को समायोजित कर सकते हैं। पहला आप परत नाम है, जबकि बाकी फ़ील्ड नामों से मेल खाता है। मुझे लगता है कि आपकी लाइन की परत में वे क्षेत्र हैं (आखिरकार, आप चाहते हैं कि मान वहां लिखे जाएं)।
एक बार जब आप अपना परत नाम और उन क्षेत्रों के नाम समायोजित कर लेते हैं जिन्हें आप स्वचालित रूप से अपडेट करना चाहते हैं, तो QGIS पायथन कंसोल में स्क्रिप्ट को कॉपी और पेस्ट करें।
यदि सब कुछ ठीक हो जाता है, तो आपको यह देखने में सक्षम होना चाहिए कि फ़ील्ड मान स्वचालित रूप से दो परिदृश्यों में अपडेट किए जाते हैं: 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
अपने द्वारा सेव की गई फ़ाइल को खोलते हैं , तो जब आप एक नई सुविधा जोड़ते हैं या एक ज्यामिति को संशोधित करते हैं, तो आपकी लाइन लेयर की विशेषताओं को स्वचालित रूप से अपडेट किया जाएगा (यानी, अब क्यूजीआईएस पायथन कंसोल में कुछ भी कॉपी करने की आवश्यकता नहीं है)।
दूसरा संस्करण:
मैंने इस तरह की समस्याओं को हल करने में लोगों की मदद करने के लिए AutoFields नामक एक प्लगइन प्रकाशित किया है। मैंने एक वीडियो भी बनाया है जिसमें दिखाया गया है कि कैसे आप अपने हल को हल कर सकते हैं, आप इसे देख सकते हैं:
https://vimeo.com/germap/autofields-geometric-properties
AutoFields प्रलेखन: http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin-for-qgis