Yo tenía un trabajo plugin de QGIS 1.8 que leer datos de una base de datos MSAccess y se añadió a una serie de capas de la memoria. Hay algún tipo de procesamiento implicados en el ínterin así que no creo que simplemente el uso de QGIS para leer directamente desde la base de datos es una opción.
Me gustaría pasar de QGIS 1.8 a 1.9 (debido, principalmente, a la mejora de la calidad de la impresión compositor). El plugin no funciona con la nueva API.
He probado una gran variedad de métodos que se vino arriba en las búsquedas de google. Uno, modificando el código de abajo - de http://www.qgis.org/pyqgis-cookbook/vector.html#memory-provider, es decir, la adición de la geometría y atributos para el objeto dataprovider y, a continuación, la actualización de la capa - para adaptarse a la nueva API trabajado un poco, pero sus atributos no eran visibles hasta que me manully entrado en el modo de edición (similar a http://hub.qgis.org/issues/3713). Un enfoque alternativo que se detalla en la respuesta #1 de el enlace de arriba, añadió la capa y atributos correctamente, pero no pude agregar características a la capa.
Dado que debe ser una tarea bastante simple tengo la esperanza de que alguien de aquí puede ofrecer un ejemplo de cómo debe hacerse. (P. S. yo no soy un programador profesional y la mayoría de mis codificación es bastante crudo - doy la bienvenida a cualquier orientación, pero pedimos que excusa alguna ignorancia de mi parte)
# 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)