QGIS 1.9'da program katmanını nasıl bir bellek katmanına nasıl oluşturabilirim ve ekleyebilirim?


13

QGIS 1.8'de bir MSAccess veritabanından veri okuyan ve bir dizi bellek katmanına ekleyen çalışan bir eklentim vardı. Geçici dahil bazı işleme var, bu yüzden sadece doğrudan veritabanından okumak için QGIS kullanarak bir seçenek olduğunu düşünmüyorum.

QGIS 1.8'den 1.9'a geçmek istiyorum (öncelikle baskı bestecisinin kalitesinin artması nedeniyle). Eklenti yeni API ile çalışmaz.

Google aramalarda ortaya çıkan çeşitli yöntemleri denedim. Birincisi, aşağıdaki kodu - http://www.qgis.org/pyqgis-cookbook/vector.html#memory-provider'dan değiştirmek , yani veri sağlayıcıya geometri ve nitelikler eklemek ve ardından katmanı güncellemek için yeni API çalışacak şekilde güncelleme biraz ama özellikler düzenleme moduna girene kadar görünmüyordu ( http://hub.qgis.org/issues/3713 benzeri ). Yukarıdaki bağlantının 1 numaralı cevabında ayrıntılı olarak açıklanan alternatif bir yaklaşım, katmanı ve nitelikleri doğru bir şekilde ekledi, ancak katmana özellikler ekleyemedim.

Oldukça basit bir görev olması gerektiğinden, buradaki birinin bunun nasıl yapılması gerektiğine dair çalışan bir örnek sunabileceğini umuyorum. (PS Profesyonel bir programcı değilim ve kodlamamın çoğu oldukça kaba - Herhangi bir rehberliğe hoş geldiniz, ancak benim tarafımdan biraz cehaleti mazur görmenizi istiyorum)

# 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)

PinPoint eklentisine bir göz atın. Bir bellek katmanına nitelikleri olan özellikler ekler ve 2.0 API ile çalışır.
gsherman

Çok iyi, çekicilik gibi çalışıyor. Bu örneği bir restfull hizmetten noktaları olan bir katman eklemek için kullandım. QGis harika
Peter Venema

Yanıtlar:


8

Yukarıdaki gsherman sayesinde PinPoint eklenti örneği mükemmel.

Anladığım kadarıyla süreç:

  1. İnşaat dizesindeki özniteliklerle katman oluşturma
  2. Bahsedilen katmanı harita kaydına ekle
  3. Bu katman üzerinde düzenlemeye başlayın
  4. Özellik ekleyin ve değişiklikleri uygulayın

İşte şimdi çalışan benim kod bir özü.

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

Adam Bioletti'nin cevabına dayanarak, açıklanan sürece yapılan diğer testler, tek temel gereksinimin, nitelikler ve özellikler oluşturma gibi herhangi bir değişiklik yapmadan önce bellek katmanını düzenlemeye başlamak ve ardından değişiklikleri uygulamak olduğunu göstermektedir. Bu, katmanı kayıt defterine eşlemeden önce yapılabilir.

İşte 2.0 API ile çalışan Yemek Kitabı kodunun bir güncellemesi:

# 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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.