কিউজিআইএস ১.৯-এ আমি কীভাবে প্রোগ্রামক্রমে মেমরি লেয়ারে বৈশিষ্ট্যগুলি তৈরি করতে এবং যুক্ত করতে পারি?


13

আমার কিউজিআইএস ১.৮ এ একটি ওয়ার্কিং প্লাগইন ছিল যা একটি এমএসএ্যাক্সেস ডাটাবেস থেকে ডেটা পড়ে এবং এটি মেমরি স্তরগুলির একটি সিরিজে যুক্ত করে। অন্তর্বর্তীকালীন কিছু প্রক্রিয়াকরণ জড়িত তাই আমি মনে করি না সরাসরি ডাটাবেস থেকে পড়ার জন্য QGIS ব্যবহার করা একটি বিকল্প।

আমি কিউজিআইএস 1.8 থেকে 1.9 এ স্থানান্তরিত করতে চাই (মূলত মুদ্রণ সুরকারের উন্নত মানের কারণে)। প্লাগইনটি নতুন এপিআইয়ের সাথে কাজ করে না।

আমি গুগল অনুসন্ধানে আগত বিভিন্ন পদ্ধতি ব্যবহার করে দেখেছি। একটি, নীচের কোডটি সংশোধন করে - http://www.qgis.org/pyqgis-cookbook/vector.html#memory-provider থেকে , যেমন ডেটাপ্রভাইডারে জ্যামিতি এবং বৈশিষ্ট্য যুক্ত করা এবং তারপরে স্তরটি আপডেট করা - নতুন এপিআইয়ের সাথে কাজ করার জন্য সামান্য তবে বৈশিষ্ট্যগুলি দৃশ্যমান ছিল না যতক্ষণ না আমি ম্যানুয়ালি সম্পাদনা মোডে প্রবেশ করি ( http://hub.qgis.org/issues/3713 এর অনুরূপ )। উপরের লিঙ্কটির উত্তর # 1 এ বিশদ বিকল্প বিকল্প, স্তর এবং বৈশিষ্ট্যগুলি সঠিকভাবে যুক্ত করেছে তবে আমি স্তরটিতে বৈশিষ্ট্যগুলি যুক্ত করতে অক্ষম।

প্রদত্ত যে এটি একটি খুব সহজ কাজ হওয়া উচিত আমি আশাবাদী যে এখানকার কেউ কীভাবে এটি করা উচিত তার একটি কার্যকরী উদাহরণ দিতে পারে। (পিএস আমি পেশাদার প্রোগ্রামার নই এবং আমার বেশিরভাগ কোডিং মোটামুটি অপরিশোধিত - আমি কোনও গাইডেন্সকে স্বাগত জানাই তবে জিজ্ঞাসা করি যে আপনি আমার অজানাকে ক্ষমা করবেন)

# Receivers = a list of lists returned from a database query

# create layer
vl = QgsVectorLayer("Point", item, "memory")
pr = vl.dataProvider()

# add fields
pr.addAttributes( [ QgsField("Rec_No", QVariant.Int), QgsField("Include",  QVariant.String), QgsField("Label",  QVariant.String), QgsField("X", QVariant.Double),
                    QgsField("Y", QVariant.Double), QgsField("Z", QVariant.Double), QgsField("Height", QVariant.Double),
                    QgsField("Project_Re", QVariant.String), QgsField("NCA", QVariant.String),
                    QgsField("DayCrit", QVariant.Int), QgsField("EveCrit", QVariant.Int), QgsField("NightCrit", QVariant.Int) ] )

for i in range(len(Receivers)):          
  # add a feature
  fet = QgsFeature()
  X = Receivers[i][3]
  Y = Receivers[i][4]
  fet.setGeometry( QgsGeometry.fromPoint(QgsPoint(X,Y)) )

  # Details = a list of results returned from a database query specific to each result in 'Receivers'

  if Receivers[i][3] != 0:
    Include = 'Yes'
  else:
    Include = 'No'

  fet.setAttributeMap( { 0 : QVariant(Receivers[i][0]), 1 : QVariant(Include), 2 : QVariant(Receivers[i][2]),
                         3 : QVariant(Receivers[i][3]), 4 : QVariant(Receivers[i][4]), 5 : QVariant(Receivers[i][5]), 6 : QVariant(Receivers[i][6]),
                         7 : QVariant(Details[0]), 8 : QVariant(Details[1]), 9 : QVariant(Details[2]), 10 : QVariant(Details[3]), 11 : QVariant(Details[4]) } )
  pr.addFeatures( [ fet ] )

# add a style
vl.loadNamedStyle('C:/OSGeo4W/apps/qgis/python/plugins/Gopher2QGIS/styles/Receiver_Style.qml')

# update layer's extent when new features have been added
# because change of extent in provider is not propagated to the layer
vl.commitChanges()
vl.updateExtents()
vl.updateFieldMap()

QgsMapLayerRegistry.instance().addMapLayer(vl)

পিনপয়েন্ট প্লাগইনটি একবার দেখুন। এটি মেমোরি স্তরটিতে বৈশিষ্ট্যযুক্ত বৈশিষ্ট্যগুলি যুক্ত করে এবং 2.0 এপিআইয়ের সাথে কাজ করে।
gsherman

খুব ভাল, একটি কবজ মত কাজ করে। আমি এই উদাহরণটি একটি বিশ্রাম পরিষেবা থেকে পয়েন্ট সহ একটি স্তর যুক্ত করতে ব্যবহার করেছি। কিউজিস দুর্দান্ত
পিটার ভেনেমা

উত্তর:


8

পিনপয়েন্ট প্লাগইন উপরের অংশীদারকে ধন্যবাদ উদাহরণটি নিখুঁত।

আমি বুঝতে পারছি প্রক্রিয়াটি হ'ল:

  1. নির্মাণের স্ট্রিংয়ের বৈশিষ্ট্যগুলির সাথে স্তরটি তৈরি করুন
  2. মানচিত্রের রেজিস্ট্রিতে লেয়ার স্তর যুক্ত করুন
  3. সেই স্তরটিতে সম্পাদনা শুরু করুন
  4. বৈশিষ্ট্যগুলি যুক্ত করুন এবং পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করুন

এখানে এখন আমার কোডের একটি নির্যাস যা কাজ করে।

layer =  QgsVectorLayer(
          "Point?field=Rec_No:integer&field=Include:string(120)&field=Label:string(120)&field=X:double&field=Y:double&field=Z:double&field=Height:double&field=Project_Re:string(120)&field=NCA:string(120)&field=DayCrit:integer&field=EveCrit:integer&field=NightCrit:integer",
          item,
          "memory")
QgsMapLayerRegistry.instance().addMapLayer(layer)

# Receivers = as in the above example 'Receivers' is a list of results
for i in range(len(Receivers)):

  # add a feature
  feature = QgsFeature()

  X = Receivers[i][3]
  Y = Receivers[i][4]
  feature.setGeometry( QgsGeometry.fromPoint(QgsPoint(X,Y)) )

  # Details = as in the above example 'Details' is a list of results

  if Receivers[i][1] != 0:
    Include = 'Yes'
  else:
    Include = 'No'

  values = [ QVariant(Receivers[i][0]), QVariant(Include), QVariant(Receivers[i][2]),
                         QVariant(Receivers[i][3]), QVariant(Receivers[i][4]), QVariant(Receivers[i][5]), QVariant(Receivers[i][6]),
                         QVariant(Details[0]), QVariant(Details[1]), QVariant(Details[2]), QVariant(Details[3]), QVariant(Details[4]) ]

  feature.setAttributes(values)
  layer.startEditing()
  layer.addFeature(feature, True)
  layer.commitChanges()

6

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

এখানে কুকবুকের কোডটির একটি আপডেট রয়েছে যা 2.0 এপিআইয়ের সাথে কাজ করে:

# create layer
vl = QgsVectorLayer("Point", "temporary_points", "memory")
pr = vl.dataProvider()

# changes are only possible when editing the layer
vl.startEditing()
# add fields
pr.addAttributes([QgsField("name", QVariant.String),QgsField("age", QVariant.Int),QgsField("size", QVariant.Double)])

# add a feature
fet = QgsFeature()
fet.setGeometry(QgsGeometry.fromPoint(QgsPoint(10,10)))
fet.setAttributes(["Johny", 2, 0.3])
pr.addFeatures([fet])

# commit to stop editing the layer
vl.commitChanges()

# update layer's extent when new features have been added
# because change of extent in provider is not propagated to the layer
vl.updateExtents()

# add layer to the legend
QgsMapLayerRegistry.instance().addMapLayer(vl)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.