मैं QGIS 1.9 में मेमोरी लेयर में प्रोग्राम कैसे बना सकता / सकती हूं?


13

मेरे पास QGIS 1.8 में एक कार्यशील प्लगइन था जो MSAccess डेटाबेस से डेटा पढ़ता था और इसे मेमोरी लेयर्स की एक श्रृंखला में जोड़ता था। अंतरिम में कुछ प्रसंस्करण शामिल है इसलिए मुझे नहीं लगता कि डेटाबेस से सीधे पढ़ने के लिए QGIS का उपयोग करना एक विकल्प है।

मैं QGIS 1.8 से 1.9 (मुख्य रूप से प्रिंट संगीतकार की बेहतर गुणवत्ता के कारण) से स्थानांतरित करना चाहूंगा। प्लगइन नए एपीआई के साथ काम नहीं करता है।

मैंने Google खोजों में कई तरह के तरीकों की कोशिश की है। एक, नीचे दिए गए कोड को संशोधित करना - http://www.qgis.org/pyqgis-cookbook/vector.html#memory-provider , यानी डेटामेट्रॉइडर में ज्यामिति और विशेषताओं को जोड़ना और फिर परत को अपडेट करना - नए एपीआई के अनुरूप काम करना जब तक मैं manully संपादन मोड ( 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 एपीआई के साथ काम करता है।
गशमैन

बहुत अच्छा, एक आकर्षण की तरह काम करता है। मैंने इस उदाहरण का उपयोग एक restfull सेवा से बिंदुओं के साथ एक परत जोड़ने के लिए किया। QGis महान है
पीटर

जवाबों:


8

PinPoint प्लगइन उदाहरण के ऊपर gsherman के लिए धन्यवाद एकदम सही है।

जैसा कि मैंने समझा कि यह प्रक्रिया है:

  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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.