Bạn đang sử dụng loại lớp nào?
Tôi thấy rằng với lớp điểm tôi đang sử dụng dòng sau được trả về None
mySymbol1 = QgsSymbolV2.defaultSymbol(myVectorLayer.geometryType())
Tuy nhiên, điều này có thể được khắc phục bằng cách thay thế nó bằng một cuộc gọi đến validatedDefaultSymbol
phương thức từ mã bên dưới. Tiền đề cơ bản là gọi QgsSymbolV2.defaultSymbol()
và sau đó xác nhận và nếu cần thực hiện chỉnh sửa.
Chỉnh sửa: Thay đổi để đảm bảo khả năng tương thích với cả QGIS 1.8 và chủ hiện tại (27/01/13); mở rộng đến một loạt các ví dụ với phạm vi rộng hơn.
Các đoạn bên dưới được định dạng để dán vào bảng điều khiển python và được áp dụng cho Dữ liệu địa điểm tự nhiên 1: 10m có sẵn từ đây . Lưu ý rằng các đoạn mã sau có phụ thuộc vào định nghĩa và nhập từ từ đầu tiên.
1) Đây là một ví dụ về việc áp dụng các danh mục tùy chỉnh nhưng được mã hóa cứng cho một lớp nhất định.
from PyQt4.QtGui import *
def validatedDefaultSymbol( geometryType ):
symbol = QgsSymbolV2.defaultSymbol( geometryType )
if symbol is None:
if geometryType == QGis.Point:
symbol = QgsMarkerSymbolV2()
elif geometryType == QGis.Line:
symbol = QgsLineSymbolV2 ()
elif geometryType == QGis.Polygon:
symbol = QgsFillSymbolV2 ()
return symbol
def makeSymbologyForRange( layer, min , max, title, color):
symbol = validatedDefaultSymbol( layer.geometryType() )
symbol.setColor( color )
range = QgsRendererRangeV2( min, max, symbol, title )
return range
def applySymbologyFixedDivisions( layer, field ):
rangeList = []
rangeList.append( makeSymbologyForRange( layer, -99, 999999.9, '<1 Million', QColor("Green") ) )
rangeList.append( makeSymbologyForRange( layer, 1000000, 10000000, '1-10 Million', QColor("Purple") ) )
rangeList.append( makeSymbologyForRange( layer, 10000000.1, 100000000, '>10 Million', QColor("Orange") ) )
renderer = QgsGraduatedSymbolRendererV2( field, rangeList )
renderer.setMode( QgsGraduatedSymbolRendererV2.Custom )
layer.setRendererV2( renderer )
targetField = 'POP_OTHER'
layer = QgsVectorLayer( 'C:/data/ne_10m_populated_places.shp', 'Fixed Divisions', 'ogr' )
if layer.isValid():
applySymbologyFixedDivisions( layer, targetField )
QgsMapLayerRegistry.instance().addMapLayers( [layer] )
2) Ví dụ này áp dụng lần lượt từng chế độ tiêu chuẩn được hỗ trợ bởi QssGraduatedSymbolRendererV2. Giá trị lớp sẽ được coi là một gợi ý thay vì quy tắc theo yêu cầu của từng chế độ cụ thể. Dòng setSizeScaleField có thể không bị thiếu nếu muốn, tuy nhiên, các giá trị của cột LABELRANK quá lớn để có thể nhìn tốt ở các mức thu phóng tiêu chuẩn.
def applyGraduatedSymbologyStandardMode( layer, field, classes, mode):
symbol = validatedDefaultSymbol( layer.geometryType() )
colorRamp = QgsVectorGradientColorRampV2.create({'color1':'255,0,0,255', 'color2':'0,0,255,255','stops':'0.25;255,255,0,255:0.50;0,255,0,255:0.75;0,255,255,255'})
renderer = QgsGraduatedSymbolRendererV2.createRenderer( layer, field, classes, mode, symbol, colorRamp )
#renderer.setSizeScaleField("LABELRANK")
layer.setRendererV2( renderer )
modes = { QgsGraduatedSymbolRendererV2.EqualInterval : "Equal Interval",
QgsGraduatedSymbolRendererV2.Quantile : "Quantile",
QgsGraduatedSymbolRendererV2.Jenks : "Natural Breaks (Jenks)",
QgsGraduatedSymbolRendererV2.StdDev : "Standard Deviation",
QgsGraduatedSymbolRendererV2.Pretty : "Pretty Breaks"
}
targetField = 'POP_OTHER'
classes = 6
for mode in modes.keys():
layer = QgsVectorLayer('C:/data/ne_10m_populated_places.shp', modes[mode] , 'ogr')
if layer.isValid():
applyGraduatedSymbologyStandardMode( layer, targetField, classes, mode)
QgsMapLayerRegistry.instance().addMapLayers( [layer] )
3) Ví dụ này cho thấy việc áp dụng các bộ phận tùy chỉnh động. Trong trường hợp này, các tính năng được sắp xếp theo giá trị, sau đó chia thành các nhóm sao cho tổng các giá trị trong mỗi danh mục bằng nhau. tức là chia dân số thế giới thành một phần ba sống ở những nơi có dân số nhỏ nhất / trung bình / lớn nhất.
def getSortedFloatsFromAttributeTable( layer, fieldName ):
provider = layer.dataProvider()
fieldIndex = provider.fieldNameIndex(fieldName)
provider.select( [fieldIndex] )
values = []
feature = QgsFeature()
while provider.nextFeature( feature ):
values.append( feature.attributeMap()[fieldIndex].toFloat()[0] )
values.sort()
return values
def arbitaryColor( amount, max ):
color = QColor()
color.setHsv( 240 * amount / float( max - 1 ), 255, 255 )
return color
def makeGraduatedRendererFromDivisionsList( layer, fieldName, divisions ):
classes = len( divisions ) - 1
rangeList = []
for i in range( classes ):
label = str( divisions[i] ) + " < X < " + str( divisions[i+1] )
rangeList.append( makeSymbologyForRange( layer, divisions[i] , divisions[i+1], label, arbitaryColor( i, classes ) ) )
renderer = QgsGraduatedSymbolRendererV2( fieldName, rangeList )
renderer.setMode( QgsGraduatedSymbolRendererV2.Custom )
return renderer
def applySymbologyEqualTotalValue( layer, classes, fieldName):
values = getSortedFloatsFromAttributeTable( layer, fieldName )
total = sum( values )
step = total / float( classes )
nextStep = step
divisions = [ values[0] ]
runningTotal = 0
for value in values:
runningTotal += value
if runningTotal >= nextStep:
divisions.append( value )
nextStep += step
if divisions[-1] != values[-1]:
divisions.append(values[-1])
renderer = makeGraduatedRendererFromDivisionsList( layer, fieldName, divisions )
layer.setRendererV2( renderer )
targetField = 'POP_OTHER'
classes = 3
layer = QgsVectorLayer( 'C:/data/ne_10m_populated_places.shp', 'Equal Total Value', 'ogr')
if layer.isValid():
applySymbologyEqualTotalValue(layer, classes, targetField)
QgsMapLayerRegistry.instance().addMapLayers( [layer] )