Versuchen Sie einfach, den folgenden Code auszuführen, der bereits im pyqgis-Kochbuch enthalten ist, um eine Symbologie für abgestufte Farben zu erstellen (wie im Beispiel mit 2 Klassen).
Ich definiere die Quellinformationen für das Shapefile, aber wenn ich den Code in meinem Test-Plugin ausführe, wird nur die Ebene hinzugefügt, ohne sie zu klassifizieren. Fügt wie gewohnt hinzu, alle Polylinien erscheinen gleich.
Irgendeine Lösung oder Arbeitscode / Methode?
Link zum Code im Kochbuch http://www.qgis.org/pyqgis-cookbook/vector.html#graduated-symbol-renderer
from qgis.core import (QgsVectorLayer, QgsMapLayerRegistry, QgsGraduatedSymbolRendererV2, QgsSymbolV2,QgsRendererRangeV2)
myVectorLayer = QgsVectorLayer('C:/my_test_shape_file.shp', 'test_shp_file', 'ogr')
myTargetField = 'target_field'
myRangeList = []
myOpacity = 1
# Make our first symbol and range...
myMin = 0.0
myMax = 50.0
myLabel = 'Group 1'
myColour = QtGui.QColor('#ffee00')
mySymbol1 = QgsSymbolV2.defaultSymbol(myVectorLayer.geometryType())
mySymbol1.setColor(myColour)
mySymbol1.setAlpha(myOpacity)
myRange1 = QgsRendererRangeV2(myMin, myMax, mySymbol1, myLabel)
myRangeList.append(myRange1)
#now make another symbol and range...
myMin = 50.1
myMax = 100
myLabel = 'Group 2'
myColour = QtGui.QColor('#00eeff')
mySymbol2 = QgsSymbolV2.defaultSymbol(myVectorLayer.geometryType())
mySymbol2.setColor(myColour)
mySymbol2.setAlpha(myOpacity)
myRange2 = QgsRendererRangeV2( myMin, myMax, mySymbol2, myLabel)
myRangeList.append(myRange2)
myRenderer = QgsGraduatedSymbolRendererV2('', myRangeList)
myRenderer.setMode(QgsGraduatedSymbolRendererV2.EqualInterval)
myRenderer.setClassAttribute(myTargetField)
myVectorLayer.setRendererV2(myRenderer)
QgsMapLayerRegistry.instance().addMapLayer(myVectorLayer)
@ Kellys Code funktioniert perfekt.
Ich habe jedoch festgestellt, dass sowohl der Code (einer, den ich in meiner ersten Nachricht eingegeben habe, als auch Ihr Code in der zweiten Nachricht) NICHT in QGIS v1.7.3 funktioniert, sondern in QGIS v1.8.0 funktioniert. Ich denke, dies war ein Fehler (?), Der bereits in Version 1.8.0 behoben wurde
Und noch eine Frage;
Haben Sie einen Beispielcode für die (natürliche Unterbrechungen, Jenks) Klassifizierung des "numeric_attribute_field" basierend auf der angegebenen Anzahl von Klassen (dh die Anzahl der Klassen wird eine Variable im Code sein, sagen Sie "n", und ich werde das von der übergeben Plugin GUI dh n = spinBox.value ())
Antworten:
Welche Art von Ebene verwenden Sie?
Ich fand heraus, dass ich mit der Punktebene die folgende zurückgegebene Zeile verwendete
None
Dies könnte jedoch behoben werden, indem es durch einen Aufruf der
validatedDefaultSymbol
Methode aus dem folgenden Code ersetzt wird. Die Grundvoraussetzung ist, anzurufenQgsSymbolV2.defaultSymbol()
und dann zu validieren und bei Bedarf Korrekturen vorzunehmen.Bearbeiten: Änderungen, um die Kompatibilität mit QGIS 1.8 und dem aktuellen Master sicherzustellen (27.01.13); erweitert auf eine Reihe von Beispielen mit größerem Umfang.
Die folgenden Snippets sind so formatiert, dass sie in die Python-Konsole eingefügt und auf Natural Earth Data 1: 10m besiedelte Orte angewendet werden können, die hier verfügbar sind . Beachten Sie, dass die späteren Snippets von Definitionen und Importen aus dem ersten abhängig sind.
1) Dies ist ein Beispiel für das Anwenden von benutzerdefinierten, aber fest codierten Kategorien auf eine bestimmte Ebene.
2) Dieses Beispiel gilt wiederum für jeden der von QgsGraduatedSymbolRendererV2 unterstützten Standardmodi. Der Klassenwert wird als Hinweis und nicht als Regel behandelt, wie dies für jeden bestimmten Modus erforderlich ist. Die setSizeScaleField-Zeile kann bei Bedarf nicht kommentiert werden. Die Werte der LABELRANK-Spalte sind jedoch zu groß, um bei Standardzoomstufen gut auszusehen.
3) Dieses Beispiel zeigt das Anwenden dynamischer benutzerdefinierter Unterteilungen. In diesem Fall werden die Features nach Wert sortiert und dann in Gruppen aufgeteilt, sodass die Summe der Werte in jeder Kategorie gleich ist. dh die Weltbevölkerung in Drittel aufteilen, die an Orten der kleinsten / mittleren / größten Bevölkerung leben.
quelle