মজার প্রশ্ন! আপনি যা চান তা অর্জনের অন্য কোনও উপায় সম্পর্কে আমি অবগত নই, তবে পাইকিজিআইএস ব্যবহার করছি।
নীচের কোডটি পড়ুন। এতে কিছু গ্রন্থে রয়েছে: 'lines'
, 'length'
, 'startX'
, 'startY'
, 'endX'
, 'endY'
। আপনার ডেটাতে কাজ করার জন্য আপনি এই নামগুলি স্ক্রিপ্টে সামঞ্জস্য করতে পারেন। প্রথমটি হ'ল আপনি স্তর নাম, অন্যদিকে ক্ষেত্রের নামের সাথে মিল। আমি ধরে নিলাম আপনার লাইন স্তরটিতে সেই ক্ষেত্রগুলি রয়েছে (সর্বোপরি, আপনি মানগুলি সেখানে লেখা উচিত)।
একবার আপনি নিজের স্তরের নাম এবং ক্ষেত্রগুলির নামগুলি স্বয়ংক্রিয়ভাবে আপডেট করতে চাইলে স্ক্রিপ্টটি অনুলিপি করে কিউজিআইএস পাইথন কনসোলে আটকান।
যদি সবকিছু ঠিকঠাক হয় তবে আপনার দেখতে হবে যে ক্ষেত্রের মানগুলি দুটি পরিস্থিতিতে স্বয়ংক্রিয়ভাবে আপডেট হয়: 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 )
এটা এভাবে কাজ করে:
স্ক্রিপ্টটি চালনার সময় আপনার যদি কোনও সমস্যা হয় তবে এই উত্তরের নিচে একটি মন্তব্য যুক্ত করুন।
আপনি যখন আপনার কিউজিআইএস প্রকল্পটি খুলবেন তখন এই কার্যকারিতাটি ইতিমধ্যে পাওয়া আপনার পক্ষে সুবিধাজনক হতে পারে। যদি এটি হয় তবে আমাকে বলুন, আমি এটি করার জন্য নির্দেশাবলী পোস্ট করতে পারি।
সম্পাদনা করুন:
এই কিউজিআইএস প্রকল্পটি প্রতিবার খুললে এই কার্যকারিতাটি উপলভ্য হওয়ার জন্য (যেমন, একটি .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
।
আপনার কিউজিআইএস প্রকল্পটি সংরক্ষণ করুন।
এখন, যখনই আপনি .qgs
সবেমাত্র সংরক্ষণ করেছেন ফাইলটি খোলেন, আপনি যখন কোনও নতুন বৈশিষ্ট্য যুক্ত করবেন বা জ্যামিতি সংশোধন করবেন তখন আপনার লাইন স্তরটির বৈশিষ্ট্যগুলি স্বয়ংক্রিয়ভাবে আপডেট হবে (যেমন, আর কিউজিআইএস পাইথন কনসোলে কোনও কিছু অনুলিপি করার দরকার নেই)।
২ য় সম্পাদনা:
এই ধরণের সমস্যা সমাধানে লোকদের সহায়তা করার জন্য আমি সবেমাত্র অটোফিল্ডস নামে একটি প্লাগইন প্রকাশ করেছি । এমনকি আপনার কল্পনা কীভাবে সমাধান করবেন তা দেখানোর জন্য আমি একটি ভিডিওও তৈরি করেছিলাম, আপনি এটি এখানে দেখতে পারেন:
https://vimeo.com/germap/autofields-geometric-properties
অটোফিল্ডস ডকুমেন্টেশন: http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin- for-qgis