Tôi đã có một plugin hoạt động trong QGIS 1.8 để đọc dữ liệu từ cơ sở dữ liệu MSAccess và thêm nó vào một loạt các lớp bộ nhớ. Có một số xử lý liên quan đến tạm thời vì vậy tôi không nghĩ đơn giản sử dụng QGIS để đọc trực tiếp từ cơ sở dữ liệu là một tùy chọn.
Tôi muốn chuyển từ QGIS 1.8 sang 1.9 (chủ yếu là do chất lượng của trình soạn thảo in được cải thiện). Plugin không hoạt động với API mới.
Tôi đã thử nhiều phương pháp khác nhau trong các tìm kiếm của google. Một, sửa đổi mã dưới đây - từ http://www.qgis.org/pyqgis-cookbook/vector.html#memory-provider , tức là thêm hình học và thuộc tính vào dataprovider và sau đó cập nhật lớp - để phù hợp với API mới hoạt động một chút nhưng các thuộc tính không thể nhìn thấy cho đến khi tôi nhập vào chế độ chỉnh sửa (tương tự như http://hub.qgis.org/issues/3713 ). Một cách tiếp cận khác, chi tiết trong câu trả lời số 1 của liên kết trên, đã thêm chính xác lớp và thuộc tính nhưng tôi không thể thêm các tính năng cho lớp.
Cho rằng đó là một nhiệm vụ khá đơn giản, tôi hy vọng rằng ai đó ở đây có thể đưa ra một ví dụ hoạt động về cách thực hiện việc này. (PS Tôi không phải là một lập trình viên chuyên nghiệp và hầu hết mã hóa của tôi khá thô sơ - Tôi hoan nghênh mọi hướng dẫn nhưng yêu cầu bạn tha thứ cho sự thiếu hiểu biết từ phía tôi)
# 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)