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)