কিউআইজিআইএস বৈশিষ্ট্য সারণী ক্ষেত্রটি স্বয়ংক্রিয়ভাবে তৈরি করা হচ্ছে?


9

আমি কিউজিআইএস এবং আমার একটি এক্সেল ওয়ার্কশিট ব্যবহার করে হাইড্রোলজিক প্রকল্পগুলি তৈরির জন্য একটি পদ্ধতিতে কাজ করছি। এটি করার জন্য, আমি ভেক্টর স্তরটিতে অন্তর্ভুক্ত লাইনগুলির কিছু তথ্য বের করতে চাই, যা পাইপ বিভাগকে উপস্থাপন করে।

আমার যে তথ্যগুলি উত্তোলন করতে হবে তা হ'ল:

  • আইডি নাম্বার
  • লম্বা
  • এক্স, ওয়াই সূচনা এবং শেষ স্থানাঙ্ক

আমি এই ক্ষেত্রটি "$ দৈর্ঘ্য" এবং এক্স এবং ওয়াই স্থানাঙ্কের জন্য অন্য একটি অ্যালগরিদম ব্যবহার করে ক্যাপচার করার একটি উপায় খুঁজে পেয়েছি, তবে তার জন্য আমাকে অ্যাট্রিবিউটস টেবিলটি খুলতে হবে, প্রতিটি অ্যাট্রিবিউট কলামে এক্সপ্রেশনগুলি স্থাপন করতে হবে এবং ক্ষেত্রগুলি আপডেট করার জন্য ক্লিক করতে হবে।

এই ক্ষেত্রগুলি স্বয়ংক্রিয়ভাবে পূর্ণ হয়ে গেলে আমি কোনও লাইন আঁকতে পারি এমন কোনও উপায় আছে? এটি হ'ল, আমি একটি লাইন আঁকা / সম্পাদনা করি (সম্পাদনা বা শেষ নোড শুরু করুন) এবং যখন আমি বিশিষ্ট টেবিলটি দৈর্ঘ্যের ক্ষেত্রগুলি এবং এক্স, স্থানাঙ্ক খুলি, তখন ভরাট এবং আপডেট হয়।


1
অস্থায়ী টেবিলের মতো এটি সম্পাদনা-মোডে থাকাকালীন সম্ভব কিনা তা নিশ্চিতভাবে নিশ্চিত হন না। তবে আপনার ক্রিয়াকলাপের দিকে নজর থাকতে পারে। আপনি আপনার গণনা পূরণ করতে পাইথন কোড চালাতে উদাহরণস্বরূপ এগুলি ব্যবহার করতে পারেন। তবে আপনাকে এট্রিবিউট টেবিল থেকে চালাতে অতিরিক্ত বাটন চাপতে হবে। আপনি যে সম্ভাবনাগুলি দেখছেন সেগুলি একবার দেখে নিতে পারেন এবং এটি আপনার ধারণার সাথে খাপ খায় কিনা তা দেখতে পারেন।
ম্যাট

উত্তর:


7

আপনার যদি কেবল কিউজিআইএস-এর ভিতরে এই ক্ষেত্রগুলির প্রয়োজন হয় তবে আপনি ভার্চুয়াল ক্ষেত্রগুলি ব্যবহার করতে পারেন। এগুলি একটি অভিব্যক্তি (যেমন $length) ব্যবহার করতে দেয় যা অন্যান্য মান বা জ্যামিতির উপর নির্ভর করে।

ফিল্ড ক্যালকুলেটরটি খুলুন, নামের দৈর্ঘ্য সহ একটি নতুন ক্ষেত্র যুক্ত করুন, "ভার্চুয়াল ফিল্ড" চেকবক্সটি পরীক্ষা করুন এবং $lengthএক্সপ্রেশন হিসাবে প্রবেশ করুন (বা অন্য ক্ষেত্রের জন্য অন্য কিছু)।

এগুলি অবশ্য এক্সেল ফাইলে সংরক্ষণ করা হবে না।

আপনি যদি জ্যামিতির জন্য কোনও shp ফাইলের সাথে সিঙ্কে একটি এক্সেল ফাইল রাখতে চান এবং এক্সেল ফাইলটিতে উত্পন্ন ক্ষেত্রগুলি অন্তর্ভুক্ত করতে চান তবে ShpSync নামে একটি প্লাগইন রয়েছে যা বৈশিষ্ট্যগুলি পরিবর্তন করা, যুক্ত করা বা মোছার সময় স্বয়ংক্রিয়ভাবে ক্ষেত্রগুলিকে আপডেট করে।


আসলে, নীচের উত্তরটি ঠিক কীভাবে আমি করতে চাই তা কাজ করে তবে আপনি যে প্লাগইনটি বলেছেন তা আমার প্রকল্পের পরবর্তী ধাপে কাজ করবে। আপনার সহায়তার জন্য ধন্যবাদ
লিওনাজারেথ

15

মজার প্রশ্ন! আপনি যা চান তা অর্জনের অন্য কোনও উপায় সম্পর্কে আমি অবগত নই, তবে পাইকিজিআইএস ব্যবহার করছি।

নীচের কোডটি পড়ুন। এতে কিছু গ্রন্থে রয়েছে: '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ফাইল অন্যদের মধ্যে রয়েছে, আপনার লাইন স্তরটি রয়েছে) আপনার এই পদক্ষেপগুলি অনুসরণ করতে হবে:

  1. যান 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
  2. নিশ্চিত করুন যে আপনি আপনার প্রকল্পের, এই পথে ম্যাক্রো সক্ষম করুন: Settings->Options->General->Enable macros: Always

  3. আপনার কিউজিআইএস প্রকল্পটি সংরক্ষণ করুন।

এখন, যখনই আপনি .qgsসবেমাত্র সংরক্ষণ করেছেন ফাইলটি খোলেন, আপনি যখন কোনও নতুন বৈশিষ্ট্য যুক্ত করবেন বা জ্যামিতি সংশোধন করবেন তখন আপনার লাইন স্তরটির বৈশিষ্ট্যগুলি স্বয়ংক্রিয়ভাবে আপডেট হবে (যেমন, আর কিউজিআইএস পাইথন কনসোলে কোনও কিছু অনুলিপি করার দরকার নেই)।


২ য় সম্পাদনা:

এই ধরণের সমস্যা সমাধানে লোকদের সহায়তা করার জন্য আমি সবেমাত্র অটোফিল্ডস নামে একটি প্লাগইন প্রকাশ করেছি । এমনকি আপনার কল্পনা কীভাবে সমাধান করবেন তা দেখানোর জন্য আমি একটি ভিডিওও তৈরি করেছিলাম, আপনি এটি এখানে দেখতে পারেন:

https://vimeo.com/germap/autofields-geometric-properties

অটোফিল্ডস ডকুমেন্টেশন: http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin- for-qgis


2
আমি ঠিক এটিই খুঁজছিলাম। আসলে আমি আপনার কোডটি এক্স, ওয়াই স্থানাঙ্কগুলি ধরার জন্য ব্যবহার করছিলাম, যা এই পোষ্টের লিঙ্কটিতে আপনার পুরানো উত্তরে আমি পেয়েছি , আপনি এখন যে পোস্ট করেন তা একই। আমি ইতিমধ্যে অটোমেশন পরীক্ষা করেছি এবং এটি পুরোপুরি কার্যকর হয়। আমি পাইথন কোডটি ".pycl" ফাইল হিসাবে সংরক্ষণ করেছি। যদি আপনি আমাকে ব্যাখ্যা করতে পারেন যে আমি যখন আমার কিউজিআইএস প্রকল্পটি খুলি তখন এটি কীভাবে পাওয়া যায় will সাহায্যের জন্য আপনাকে ধন্যবাদ।
লিওনাজারেথ

1
জার্মান, এটি একটি দুর্দান্ত উত্তর ছিল! ধন্যবাদ! আপনি যা পোস্ট করেছেন তা দিয়ে আমি আপনার কাছ থেকে অনেক কিছু শিখেছি!
jbgramm

1
আমি আসলে এমন একটি প্লাগইনে কাজ করছি যা আপনাকে ঠিক তা করতে দেয়। যেহেতু আমি কেবলমাত্র আমার অতিরিক্ত সময় এর উন্নয়নে নিবেদিত করতে পারি, তাই আমি আপনাকে প্রত্যাশিত প্রকাশের তারিখটি বলতে পারি না। এর মধ্যে, আপনি ট্রামো.এসপিপি যুক্ত করার পরে আমার প্রথম কোড স্নিপেটটি পরিচালনা করতে পারেন, সামঞ্জস্য করে: myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'Tramo' )[0]আপনি যদি আমার ভবিষ্যতের প্লাগইনে সত্যিই আগ্রহী হন তবে দয়া করে আপনার কোনও পরামর্শ আমাকে প্রেরণ করুন, আমি এটির প্রশংসা করব। আপনি আমার সাথে জিওটাক্সে যোগাযোগ করতে পারেন ।
জার্মেইন ক্যারিলো

1
এটি আমার কাছে দুর্দান্ত হবে (এবং অবশ্যই অনেক লোকের জন্য), আমি ইতিমধ্যে আপনার প্রস্তাবিত এই সমন্বয় সহ কোডটি ব্যবহার করছি। আমি আপনার নতুন প্লাগইনটি উদ্বেগের সাথে অপেক্ষা করব এবং যদি আমি কিছু কার্যকর মনে করি তবে আমি আপনার সাথে যোগাযোগ করব। সবকিছুর জন্য তোমাকে ধন্যবাদ.
লিওনাজারে

1
@ লেওনাজারেথ, আপনি কি প্লাগইনটি পরীক্ষা করতে চান? এটি প্রস্তুত হচ্ছে, তবে আমি এটি প্রকাশের আগে কয়েকটি পরীক্ষা করতে চাই। আপনি যদি এটি পরীক্ষা করতে ইচ্ছুক হন তবে দয়া করে আমাকে একটি ইমেল প্রেরণ করুন ।
জার্মানি ক্যারিলো

2

কিউজিআইএস 3 এর জন্য Layers Properties=> Attributes Form=> এ জ্যামিতির মানগুলির সাথে আপনার ক্ষেত্রটি চয়ন করুন (উদাহরণস্বরূপ, area) => বাক্সে টাইপ $areaকরুন Defaults valueএবং চেক করুন Apply default value on update। এই দরকারী হতে পারে: $perimeter, $y, $x,$id


1

আমি একটি ডেটাবেজে (PostGIS) ডেটা রাখতাম এবং একটি (সম্ভবত বস্তুগত) দর্শন দিয়ে কিউজিআইএসে ডেটা বের করতাম।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.