def testWriteReadXml(self): # test writing renderer to xml and restoring renderer = QgsCategorizedSymbolRenderer() renderer.setClassAttribute('x') symbol_a = createMarkerSymbol() symbol_a.setColor(QColor(255, 0, 0)) renderer.addCategory(QgsRendererCategory('a', symbol_a, 'a')) symbol_b = createMarkerSymbol() symbol_b.setColor(QColor(0, 255, 0)) renderer.addCategory(QgsRendererCategory('b', symbol_b, 'b')) symbol_c = createMarkerSymbol() symbol_c.setColor(QColor(0, 0, 255)) renderer.addCategory(QgsRendererCategory('c', symbol_c, 'c', False)) symbol_d = createMarkerSymbol() symbol_d.setColor(QColor(255, 0, 255)) renderer.addCategory(QgsRendererCategory(['d', 'e'], symbol_d, 'de')) # add default category default_symbol = createMarkerSymbol() default_symbol.setColor(QColor(255, 255, 255)) renderer.addCategory(QgsRendererCategory('', default_symbol, 'default')) doc = QDomDocument("testdoc") elem = renderer.save(doc, QgsReadWriteContext()) renderer2 = QgsCategorizedSymbolRenderer.create(elem, QgsReadWriteContext()) self.assertEqual(renderer2.classAttribute(), 'x') self.assertEqual([l.label() for l in renderer2.categories()], ['a', 'b', 'c', 'de', 'default']) self.assertEqual([l.value() for l in renderer2.categories()], ['a', 'b', 'c', ['d', 'e'], '']) self.assertEqual([l.symbol().color().name() for l in renderer2.categories()], ['#ff0000', '#00ff00', '#0000ff', '#ff00ff', '#ffffff'])
def testLegendKeysWhileCounting(self): # test determining legend keys for features, while counting features fields = QgsFields() fields.append(QgsField('x')) # setup renderer renderer = QgsCategorizedSymbolRenderer() renderer.setClassAttribute('x') symbol_a = createMarkerSymbol() symbol_a.setColor(QColor(255, 0, 0)) renderer.addCategory(QgsRendererCategory('a', symbol_a, 'a')) symbol_b = createMarkerSymbol() symbol_b.setColor(QColor(0, 255, 0)) renderer.addCategory(QgsRendererCategory('b', symbol_b, 'b')) symbol_c = createMarkerSymbol() symbol_c.setColor(QColor(0, 0, 255)) renderer.addCategory(QgsRendererCategory('c', symbol_c, 'c', False)) symbol_d = createMarkerSymbol() symbol_d.setColor(QColor(255, 0, 255)) renderer.addCategory(QgsRendererCategory(['d', 'e'], symbol_d, 'de')) # add default category default_symbol = createMarkerSymbol() default_symbol.setColor(QColor(255, 255, 255)) renderer.addCategory(QgsRendererCategory('', default_symbol, 'default')) context = QgsRenderContext() context.setRendererScale(0) # simulate counting renderer.startRender(context, fields) f = QgsFeature(fields) f.setAttributes(['a']) keys = renderer.legendKeysForFeature(f, context) self.assertEqual(keys, {'0'}) f.setAttributes(['b']) keys = renderer.legendKeysForFeature(f, context) self.assertEqual(keys, {'1'}) # hidden category, should still return keys f.setAttributes(['c']) keys = renderer.legendKeysForFeature(f, context) self.assertEqual(keys, {'2'}) # list f.setAttributes(['d']) keys = renderer.legendKeysForFeature(f, context) self.assertEqual(keys, {'3'}) f.setAttributes(['e']) keys = renderer.legendKeysForFeature(f, context) self.assertEqual(keys, {'3'}) # no matching category f.setAttributes(['xxx']) keys = renderer.legendKeysForFeature(f, context) self.assertFalse(keys) renderer.stopRender(context)
def testOriginalSymbolForFeature(self): # test renderer with features fields = QgsFields() fields.append(QgsField('x')) # setup renderer renderer = QgsCategorizedSymbolRenderer() renderer.setClassAttribute('x') symbol_a = createMarkerSymbol() symbol_a.setColor(QColor(255, 0, 0)) renderer.addCategory(QgsRendererCategory('a', symbol_a, 'a')) symbol_b = createMarkerSymbol() symbol_b.setColor(QColor(0, 255, 0)) renderer.addCategory(QgsRendererCategory('b', symbol_b, 'b')) symbol_c = createMarkerSymbol() symbol_c.setColor(QColor(0, 0, 255)) renderer.addCategory(QgsRendererCategory('c', symbol_c, 'c', False)) symbol_d = createMarkerSymbol() symbol_d.setColor(QColor(255, 0, 255)) renderer.addCategory(QgsRendererCategory(['d', 'e'], symbol_d, 'de')) # add default category default_symbol = createMarkerSymbol() default_symbol.setColor(QColor(255, 255, 255)) renderer.addCategory(QgsRendererCategory('', default_symbol, 'default')) context = QgsRenderContext() renderer.startRender(context, fields) f = QgsFeature(fields) f.setAttributes(['a']) symbol = renderer.originalSymbolForFeature(f, context) self.assertEqual(symbol.color(), QColor(255, 0, 0)) f.setAttributes(['b']) symbol = renderer.originalSymbolForFeature(f, context) self.assertEqual(symbol.color(), QColor(0, 255, 0)) # list f.setAttributes(['d']) symbol = renderer.originalSymbolForFeature(f, context) self.assertEqual(symbol.color(), QColor(255, 0, 255)) f.setAttributes(['e']) symbol = renderer.originalSymbolForFeature(f, context) self.assertEqual(symbol.color(), QColor(255, 0, 255)) # hidden category f.setAttributes(['c']) symbol = renderer.originalSymbolForFeature(f, context) self.assertIsNone(symbol) # no matching category f.setAttributes(['xxx']) symbol = renderer.originalSymbolForFeature(f, context) self.assertEqual(symbol.color(), QColor(255, 255, 255)) # default symbol renderer.stopRender(context)
def _create_categorized_renderer(self): cat_renderer = QgsCategorizedSymbolRenderer(attrName='Class') sym1 = QgsMarkerSymbol.createSimple({'color': '#ff00ff', 'size': '6', 'outline_style': 'no'}) cat1 = QgsRendererCategory('Biplane', sym1, 'Big') cat_renderer.addCategory(cat1) sym2 = QgsMarkerSymbol.createSimple({'color': '#ff00ff', 'size': '3', 'outline_style': 'no'}) cat2 = QgsRendererCategory(['B52', 'Jet'], sym2, 'Smaller') cat_renderer.addCategory(cat2) return cat_renderer
def testSymbolForValue(self): """Test symbolForValue""" renderer = QgsCategorizedSymbolRenderer() renderer.setClassAttribute('field') symbol_a = createMarkerSymbol() symbol_a.setColor(QColor(255, 0, 0)) renderer.addCategory(QgsRendererCategory('a', symbol_a, 'a')) symbol_b = createMarkerSymbol() symbol_b.setColor(QColor(0, 255, 0)) renderer.addCategory(QgsRendererCategory('b', symbol_b, 'b')) symbol_c = createMarkerSymbol() symbol_c.setColor(QColor(0, 0, 255)) renderer.addCategory(QgsRendererCategory('c', symbol_c, 'c', False)) symbol_d = createMarkerSymbol() symbol_d.setColor(QColor(255, 0, 255)) renderer.addCategory(QgsRendererCategory(['d', 'e'], symbol_d, 'de')) # add default category default_symbol = createMarkerSymbol() default_symbol.setColor(QColor(255, 255, 255)) renderer.addCategory(QgsRendererCategory('', default_symbol, 'default')) context = QgsRenderContext() renderer.startRender(context, QgsFields()) symbol, ok = renderer.symbolForValue2('a') self.assertEqual(symbol.color(), QColor(255, 0, 0)) self.assertTrue(ok) symbol, ok = renderer.symbolForValue2('b') self.assertEqual(symbol.color(), QColor(0, 255, 0)) self.assertTrue(ok) # hidden category symbol, ok = renderer.symbolForValue2('c') self.assertIsNone(symbol) self.assertTrue(ok) # list symbol, ok = renderer.symbolForValue2('d') self.assertEqual(symbol.color(), QColor(255, 0, 255)) self.assertTrue(ok) symbol, ok = renderer.symbolForValue2('e') self.assertEqual(symbol.color(), QColor(255, 0, 255)) self.assertTrue(ok) # no matching category symbol, ok = renderer.symbolForValue2('xxxx') self.assertIsNone(symbol) self.assertFalse(ok) renderer.stopRender(context)
def testFilter(self): """Test filter creation""" renderer = QgsCategorizedSymbolRenderer() renderer.setClassAttribute('field') renderer.addCategory(QgsRendererCategory('a', createMarkerSymbol(), 'a')) renderer.addCategory(QgsRendererCategory('b', createMarkerSymbol(), 'b')) renderer.addCategory(QgsRendererCategory('c', createMarkerSymbol(), 'c')) # add default category renderer.addCategory(QgsRendererCategory('', createMarkerSymbol(), 'default')) fields = QgsFields() fields.append(QgsField('field', QVariant.String)) fields.append(QgsField('num', QVariant.Double)) self.assertEqual(renderer.filter(fields), '') # remove categories, leaving default assert renderer.updateCategoryRenderState(0, False) self.assertEqual(renderer.filter(fields), "(\"field\") NOT IN ('a') OR (\"field\") IS NULL") assert renderer.updateCategoryRenderState(1, False) self.assertEqual(renderer.filter(fields), "(\"field\") NOT IN ('a','b') OR (\"field\") IS NULL") assert renderer.updateCategoryRenderState(2, False) self.assertEqual(renderer.filter(fields), "(\"field\") NOT IN ('a','b','c') OR (\"field\") IS NULL") # remove default category assert renderer.updateCategoryRenderState(3, False) self.assertEqual(renderer.filter(fields), "FALSE") # add back other categories, leaving default disabled assert renderer.updateCategoryRenderState(0, True) self.assertEqual(renderer.filter(fields), "(\"field\") IN ('a')") assert renderer.updateCategoryRenderState(1, True) self.assertEqual(renderer.filter(fields), "(\"field\") IN ('a','b')") assert renderer.updateCategoryRenderState(2, True) self.assertEqual(renderer.filter(fields), "(\"field\") IN ('a','b','c')") renderer.deleteAllCategories() # just default category renderer.addCategory(QgsRendererCategory('', createMarkerSymbol(), 'default')) self.assertEqual(renderer.filter(fields), '') assert renderer.updateCategoryRenderState(0, False) self.assertEqual(renderer.filter(fields), 'FALSE') renderer.deleteAllCategories() # no default category renderer.addCategory(QgsRendererCategory('a', createMarkerSymbol(), 'a')) renderer.addCategory(QgsRendererCategory('b', createMarkerSymbol(), 'b')) renderer.addCategory(QgsRendererCategory('c', createMarkerSymbol(), 'c')) self.assertEqual(renderer.filter(fields), "(\"field\") IN ('a','b','c')") assert renderer.updateCategoryRenderState(0, False) self.assertEqual(renderer.filter(fields), "(\"field\") IN ('b','c')") assert renderer.updateCategoryRenderState(2, False) self.assertEqual(renderer.filter(fields), "(\"field\") IN ('b')") assert renderer.updateCategoryRenderState(1, False) self.assertEqual(renderer.filter(fields), "FALSE") renderer.deleteAllCategories() renderer.setClassAttribute('num') # numeric categories renderer.addCategory(QgsRendererCategory(1, createMarkerSymbol(), 'a')) renderer.addCategory(QgsRendererCategory(2, createMarkerSymbol(), 'b')) renderer.addCategory(QgsRendererCategory(3, createMarkerSymbol(), 'c')) self.assertEqual(renderer.filter(fields), '(\"num\") IN (1,2,3)') assert renderer.updateCategoryRenderState(0, False) self.assertEqual(renderer.filter(fields), "(\"num\") IN (2,3)") assert renderer.updateCategoryRenderState(2, False) self.assertEqual(renderer.filter(fields), "(\"num\") IN (2)") assert renderer.updateCategoryRenderState(1, False) self.assertEqual(renderer.filter(fields), "FALSE")
def testFilterExpression(self): """Test filter creation with expression""" renderer = QgsCategorizedSymbolRenderer() renderer.setClassAttribute("field + field2") renderer.addCategory(QgsRendererCategory("a", createMarkerSymbol(), "a")) renderer.addCategory(QgsRendererCategory("b", createMarkerSymbol(), "b")) renderer.addCategory(QgsRendererCategory("c", createMarkerSymbol(), "c")) # add default category renderer.addCategory(QgsRendererCategory("", createMarkerSymbol(), "default")) fields = QgsFields() fields.append(QgsField("field", QVariant.String)) self.assertEqual(renderer.filter(fields), "") # remove categories, leaving default assert renderer.updateCategoryRenderState(0, False) self.assertEqual(renderer.filter(fields), "(field + field2) NOT IN ('a') OR (field + field2) IS NULL") assert renderer.updateCategoryRenderState(1, False) self.assertEqual(renderer.filter(fields), "(field + field2) NOT IN ('a','b') OR (field + field2) IS NULL") assert renderer.updateCategoryRenderState(2, False) self.assertEqual(renderer.filter(fields), "(field + field2) NOT IN ('a','b','c') OR (field + field2) IS NULL") # remove default category assert renderer.updateCategoryRenderState(3, False) self.assertEqual(renderer.filter(fields), "FALSE") # add back other categories, leaving default disabled assert renderer.updateCategoryRenderState(0, True) self.assertEqual(renderer.filter(fields), "(field + field2) IN ('a')") assert renderer.updateCategoryRenderState(1, True) self.assertEqual(renderer.filter(fields), "(field + field2) IN ('a','b')") assert renderer.updateCategoryRenderState(2, True) self.assertEqual(renderer.filter(fields), "(field + field2) IN ('a','b','c')") renderer.deleteAllCategories() # just default category renderer.addCategory(QgsRendererCategory("", createMarkerSymbol(), "default")) self.assertEqual(renderer.filter(fields), "") assert renderer.updateCategoryRenderState(0, False) self.assertEqual(renderer.filter(fields), "FALSE") renderer.deleteAllCategories() # no default category renderer.addCategory(QgsRendererCategory("a", createMarkerSymbol(), "a")) renderer.addCategory(QgsRendererCategory("b", createMarkerSymbol(), "b")) renderer.addCategory(QgsRendererCategory("c", createMarkerSymbol(), "c")) self.assertEqual(renderer.filter(fields), "(field + field2) IN ('a','b','c')") assert renderer.updateCategoryRenderState(0, False) self.assertEqual(renderer.filter(fields), "(field + field2) IN ('b','c')") assert renderer.updateCategoryRenderState(2, False) self.assertEqual(renderer.filter(fields), "(field + field2) IN ('b')") assert renderer.updateCategoryRenderState(1, False) self.assertEqual(renderer.filter(fields), "FALSE") renderer.deleteAllCategories() # numeric categories renderer.addCategory(QgsRendererCategory(1, createMarkerSymbol(), "a")) renderer.addCategory(QgsRendererCategory(2, createMarkerSymbol(), "b")) renderer.addCategory(QgsRendererCategory(3, createMarkerSymbol(), "c")) self.assertEqual(renderer.filter(fields), "(field + field2) IN (1,2,3)") assert renderer.updateCategoryRenderState(0, False) self.assertEqual(renderer.filter(fields), "(field + field2) IN (2,3)") assert renderer.updateCategoryRenderState(2, False) self.assertEqual(renderer.filter(fields), "(field + field2) IN (2)") assert renderer.updateCategoryRenderState(1, False) self.assertEqual(renderer.filter(fields), "FALSE")
def testMatchToSymbols(self): """ Test QgsCategorizedSymbolRender.matchToSymbols """ renderer = QgsCategorizedSymbolRenderer() renderer.setClassAttribute('x') symbol_a = createMarkerSymbol() symbol_a.setColor(QColor(255, 0, 0)) renderer.addCategory(QgsRendererCategory('a', symbol_a, 'a')) symbol_b = createMarkerSymbol() symbol_b.setColor(QColor(0, 255, 0)) renderer.addCategory(QgsRendererCategory('b', symbol_b, 'b')) symbol_c = createMarkerSymbol() symbol_c.setColor(QColor(0, 0, 255)) renderer.addCategory(QgsRendererCategory('c ', symbol_c, 'c')) matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols(None, QgsSymbol.Marker) self.assertEqual(matched, 0) style = QgsStyle() symbol_a = createMarkerSymbol() symbol_a.setColor(QColor(255, 10, 10)) self.assertTrue(style.addSymbol('a', symbol_a)) symbol_B = createMarkerSymbol() symbol_B.setColor(QColor(10, 255, 10)) self.assertTrue(style.addSymbol('B ', symbol_B)) symbol_b = createFillSymbol() symbol_b.setColor(QColor(10, 255, 10)) self.assertTrue(style.addSymbol('b', symbol_b)) symbol_C = createLineSymbol() symbol_C.setColor(QColor(10, 255, 10)) self.assertTrue(style.addSymbol('C', symbol_C)) symbol_C = createMarkerSymbol() symbol_C.setColor(QColor(10, 255, 10)) self.assertTrue(style.addSymbol(' ----c/- ', symbol_C)) # non-matching symbol type matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols(style, QgsSymbol.Line) self.assertEqual(matched, 0) self.assertEqual(unmatched_cats, ['a', 'b', 'c ']) self.assertEqual(unmatched_symbols, [' ----c/- ', 'B ', 'C', 'a', 'b']) # exact match matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols(style, QgsSymbol.Marker) self.assertEqual(matched, 1) self.assertEqual(unmatched_cats, ['b', 'c ']) self.assertEqual(unmatched_symbols, [' ----c/- ', 'B ', 'C', 'b']) # make sure symbol was applied context = QgsRenderContext() renderer.startRender(context, QgsFields()) symbol, ok = renderer.symbolForValue2('a') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#ff0a0a') renderer.stopRender(context) # case insensitive match matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols(style, QgsSymbol.Marker, False) self.assertEqual(matched, 2) self.assertEqual(unmatched_cats, ['c ']) self.assertEqual(unmatched_symbols, [' ----c/- ', 'C', 'b']) # make sure symbols were applied context = QgsRenderContext() renderer.startRender(context, QgsFields()) symbol, ok = renderer.symbolForValue2('a') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#ff0a0a') symbol, ok = renderer.symbolForValue2('b') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#0aff0a') renderer.stopRender(context) # case insensitive match matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols(style, QgsSymbol.Marker, False) self.assertEqual(matched, 2) self.assertEqual(unmatched_cats, ['c ']) self.assertEqual(unmatched_symbols, [' ----c/- ', 'C', 'b']) # make sure symbols were applied context = QgsRenderContext() renderer.startRender(context, QgsFields()) symbol, ok = renderer.symbolForValue2('a') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#ff0a0a') symbol, ok = renderer.symbolForValue2('b') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#0aff0a') renderer.stopRender(context) # tolerant match matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols(style, QgsSymbol.Marker, True, True) self.assertEqual(matched, 2) self.assertEqual(unmatched_cats, ['b']) self.assertEqual(unmatched_symbols, ['B ', 'C', 'b']) # make sure symbols were applied context = QgsRenderContext() renderer.startRender(context, QgsFields()) symbol, ok = renderer.symbolForValue2('a') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#ff0a0a') symbol, ok = renderer.symbolForValue2('c ') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#0aff0a') renderer.stopRender(context) # tolerant match, case insensitive matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols(style, QgsSymbol.Marker, False, True) self.assertEqual(matched, 3) self.assertFalse(unmatched_cats) self.assertEqual(unmatched_symbols, ['C', 'b']) # make sure symbols were applied context = QgsRenderContext() renderer.startRender(context, QgsFields()) symbol, ok = renderer.symbolForValue2('a') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#ff0a0a') symbol, ok = renderer.symbolForValue2('b') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#0aff0a') symbol, ok = renderer.symbolForValue2('c ') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#0aff0a') renderer.stopRender(context)
def testFilterExpression(self): """Test filter creation with expression""" renderer = QgsCategorizedSymbolRenderer() renderer.setClassAttribute('field + field2') renderer.addCategory( QgsRendererCategory('a', createMarkerSymbol(), 'a')) renderer.addCategory( QgsRendererCategory('b', createMarkerSymbol(), 'b')) renderer.addCategory( QgsRendererCategory('c', createMarkerSymbol(), 'c')) # add default category renderer.addCategory( QgsRendererCategory('', createMarkerSymbol(), 'default')) fields = QgsFields() fields.append(QgsField('field', QVariant.String)) self.assertEqual(renderer.filter(fields), '') # remove categories, leaving default assert renderer.updateCategoryRenderState(0, False) self.assertEqual( renderer.filter(fields), "(field + field2) NOT IN ('a') OR (field + field2) IS NULL") assert renderer.updateCategoryRenderState(1, False) self.assertEqual( renderer.filter(fields), "(field + field2) NOT IN ('a','b') OR (field + field2) IS NULL") assert renderer.updateCategoryRenderState(2, False) self.assertEqual( renderer.filter(fields), "(field + field2) NOT IN ('a','b','c') OR (field + field2) IS NULL" ) # remove default category assert renderer.updateCategoryRenderState(3, False) self.assertEqual(renderer.filter(fields), "FALSE") # add back other categories, leaving default disabled assert renderer.updateCategoryRenderState(0, True) self.assertEqual(renderer.filter(fields), "(field + field2) IN ('a')") assert renderer.updateCategoryRenderState(1, True) self.assertEqual(renderer.filter(fields), "(field + field2) IN ('a','b')") assert renderer.updateCategoryRenderState(2, True) self.assertEqual(renderer.filter(fields), "(field + field2) IN ('a','b','c')") renderer.deleteAllCategories() # just default category renderer.addCategory( QgsRendererCategory('', createMarkerSymbol(), 'default')) self.assertEqual(renderer.filter(fields), '') assert renderer.updateCategoryRenderState(0, False) self.assertEqual(renderer.filter(fields), 'FALSE') renderer.deleteAllCategories() # no default category renderer.addCategory( QgsRendererCategory('a', createMarkerSymbol(), 'a')) renderer.addCategory( QgsRendererCategory('b', createMarkerSymbol(), 'b')) renderer.addCategory( QgsRendererCategory('c', createMarkerSymbol(), 'c')) self.assertEqual(renderer.filter(fields), "(field + field2) IN ('a','b','c')") assert renderer.updateCategoryRenderState(0, False) self.assertEqual(renderer.filter(fields), "(field + field2) IN ('b','c')") assert renderer.updateCategoryRenderState(2, False) self.assertEqual(renderer.filter(fields), "(field + field2) IN ('b')") assert renderer.updateCategoryRenderState(1, False) self.assertEqual(renderer.filter(fields), "FALSE") renderer.deleteAllCategories() # numeric categories renderer.addCategory(QgsRendererCategory(1, createMarkerSymbol(), 'a')) renderer.addCategory(QgsRendererCategory(2, createMarkerSymbol(), 'b')) renderer.addCategory(QgsRendererCategory(3, createMarkerSymbol(), 'c')) self.assertEqual(renderer.filter(fields), '(field + field2) IN (1,2,3)') assert renderer.updateCategoryRenderState(0, False) self.assertEqual(renderer.filter(fields), "(field + field2) IN (2,3)") assert renderer.updateCategoryRenderState(2, False) self.assertEqual(renderer.filter(fields), "(field + field2) IN (2)") assert renderer.updateCategoryRenderState(1, False) self.assertEqual(renderer.filter(fields), "FALSE")
def testMatchToSymbols(self): """ Test QgsCategorizedSymbolRender.matchToSymbols """ renderer = QgsCategorizedSymbolRenderer() renderer.setClassAttribute('x') symbol_a = createMarkerSymbol() symbol_a.setColor(QColor(255, 0, 0)) renderer.addCategory(QgsRendererCategory('a', symbol_a, 'a')) symbol_b = createMarkerSymbol() symbol_b.setColor(QColor(0, 255, 0)) renderer.addCategory(QgsRendererCategory('b', symbol_b, 'b')) symbol_c = createMarkerSymbol() symbol_c.setColor(QColor(0, 0, 255)) renderer.addCategory(QgsRendererCategory('c ', symbol_c, 'c')) matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols( None, QgsSymbol.Marker) self.assertEqual(matched, 0) style = QgsStyle() symbol_a = createMarkerSymbol() symbol_a.setColor(QColor(255, 10, 10)) self.assertTrue(style.addSymbol('a', symbol_a)) symbol_B = createMarkerSymbol() symbol_B.setColor(QColor(10, 255, 10)) self.assertTrue(style.addSymbol('B ', symbol_B)) symbol_b = createFillSymbol() symbol_b.setColor(QColor(10, 255, 10)) self.assertTrue(style.addSymbol('b', symbol_b)) symbol_C = createLineSymbol() symbol_C.setColor(QColor(10, 255, 10)) self.assertTrue(style.addSymbol('C', symbol_C)) symbol_C = createMarkerSymbol() symbol_C.setColor(QColor(10, 255, 10)) self.assertTrue(style.addSymbol(' ----c/- ', symbol_C)) # non-matching symbol type matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols( style, QgsSymbol.Line) self.assertEqual(matched, 0) self.assertEqual(unmatched_cats, ['a', 'b', 'c ']) self.assertEqual(unmatched_symbols, [' ----c/- ', 'B ', 'C', 'a', 'b']) # exact match matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols( style, QgsSymbol.Marker) self.assertEqual(matched, 1) self.assertEqual(unmatched_cats, ['b', 'c ']) self.assertEqual(unmatched_symbols, [' ----c/- ', 'B ', 'C', 'b']) # make sure symbol was applied context = QgsRenderContext() renderer.startRender(context, QgsFields()) symbol, ok = renderer.symbolForValue2('a') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#ff0a0a') renderer.stopRender(context) # case insensitive match matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols( style, QgsSymbol.Marker, False) self.assertEqual(matched, 2) self.assertEqual(unmatched_cats, ['c ']) self.assertEqual(unmatched_symbols, [' ----c/- ', 'C', 'b']) # make sure symbols were applied context = QgsRenderContext() renderer.startRender(context, QgsFields()) symbol, ok = renderer.symbolForValue2('a') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#ff0a0a') symbol, ok = renderer.symbolForValue2('b') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#0aff0a') renderer.stopRender(context) # case insensitive match matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols( style, QgsSymbol.Marker, False) self.assertEqual(matched, 2) self.assertEqual(unmatched_cats, ['c ']) self.assertEqual(unmatched_symbols, [' ----c/- ', 'C', 'b']) # make sure symbols were applied context = QgsRenderContext() renderer.startRender(context, QgsFields()) symbol, ok = renderer.symbolForValue2('a') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#ff0a0a') symbol, ok = renderer.symbolForValue2('b') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#0aff0a') renderer.stopRender(context) # tolerant match matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols( style, QgsSymbol.Marker, True, True) self.assertEqual(matched, 2) self.assertEqual(unmatched_cats, ['b']) self.assertEqual(unmatched_symbols, ['B ', 'C', 'b']) # make sure symbols were applied context = QgsRenderContext() renderer.startRender(context, QgsFields()) symbol, ok = renderer.symbolForValue2('a') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#ff0a0a') symbol, ok = renderer.symbolForValue2('c ') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#0aff0a') renderer.stopRender(context) # tolerant match, case insensitive matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols( style, QgsSymbol.Marker, False, True) self.assertEqual(matched, 3) self.assertFalse(unmatched_cats) self.assertEqual(unmatched_symbols, ['C', 'b']) # make sure symbols were applied context = QgsRenderContext() renderer.startRender(context, QgsFields()) symbol, ok = renderer.symbolForValue2('a') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#ff0a0a') symbol, ok = renderer.symbolForValue2('b') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#0aff0a') symbol, ok = renderer.symbolForValue2('c ') self.assertTrue(ok) self.assertEqual(symbol.color().name(), '#0aff0a') renderer.stopRender(context)
def testMultiPoint(self): """ Test multipoint handling """ layer = QgsVectorLayer('Multipoint?field=cat:string', '', 'memory') self.assertTrue(layer.isValid()) f = QgsFeature(layer.fields()) f.setAttributes(['a']) f.setGeometry(QgsGeometry.fromWkt('MultiPoint(5 5, 5 6, 9 9)')) layer.dataProvider().addFeature(f) f.setAttributes(['b']) f.setGeometry(QgsGeometry.fromWkt('MultiPoint(2 1, 2 2, 5 5)')) layer.dataProvider().addFeature(f) f.setAttributes(['c']) f.setGeometry(QgsGeometry.fromWkt('MultiPoint(9 1)')) layer.dataProvider().addFeature(f) renderer = QgsPointDisplacementRenderer() sym1 = QgsMarkerSymbol.createSimple({ 'color': '#ff00ff', 'size': '3', 'outline_style': 'no' }) sym_renderer = QgsCategorizedSymbolRenderer() sym_renderer.setClassAttribute('cat') sym1.setColor(QColor(255, 0, 0)) sym_renderer.addCategory(QgsRendererCategory('a', sym1.clone(), 'a')) sym1.setColor(QColor(0, 255, 0)) sym_renderer.addCategory(QgsRendererCategory('b', sym1.clone(), 'b')) sym1.setColor(QColor(0, 0, 255)) sym_renderer.addCategory(QgsRendererCategory('c', sym1.clone(), 'c')) renderer.setEmbeddedRenderer(sym_renderer) renderer.setCircleRadiusAddition(2) renderer.setCircleWidth(1) renderer.setCircleColor(QColor(0, 0, 0)) renderer.setCenterSymbol( QgsMarkerSymbol.createSimple({ 'color': '#ffff00', 'size': '3', 'outline_style': 'no' })) renderer.setToleranceUnit(QgsUnitTypes.RenderMapUnits) renderer.setTolerance(2) layer.setRenderer(renderer) rendered_layers = [layer] mapsettings = QgsMapSettings() mapsettings.setOutputSize(QSize(400, 400)) mapsettings.setOutputDpi(96) mapsettings.setExtent(QgsRectangle(0, 0, 10, 10)) mapsettings.setLayers(rendered_layers) renderchecker = QgsMultiRenderChecker() renderchecker.setMapSettings(mapsettings) renderchecker.setControlPathPrefix('displacement_renderer') renderchecker.setControlName('expected_displacement_multipoint') result = renderchecker.runTest('expected_displacement_multipoint') self.report += renderchecker.report() self.assertTrue(result)
def test_legend_key_to_expression(self): renderer = QgsCategorizedSymbolRenderer() renderer.setClassAttribute('field_name') exp, ok = renderer.legendKeyToExpression('xxxx', None) self.assertFalse(ok) # no categories exp, ok = renderer.legendKeyToExpression('0', None) self.assertFalse(ok) symbol_a = createMarkerSymbol() renderer.addCategory(QgsRendererCategory('a', symbol_a, 'a')) symbol_b = createMarkerSymbol() renderer.addCategory(QgsRendererCategory(5, symbol_b, 'b')) symbol_c = createMarkerSymbol() renderer.addCategory(QgsRendererCategory(5.5, symbol_c, 'c', False)) symbol_d = createMarkerSymbol() renderer.addCategory(QgsRendererCategory(['d', 'e'], symbol_d, 'de')) exp, ok = renderer.legendKeyToExpression('0', None) self.assertTrue(ok) self.assertEqual(exp, "field_name = 'a'") exp, ok = renderer.legendKeyToExpression('1', None) self.assertTrue(ok) self.assertEqual(exp, "field_name = 5") exp, ok = renderer.legendKeyToExpression('2', None) self.assertTrue(ok) self.assertEqual(exp, "field_name = 5.5") exp, ok = renderer.legendKeyToExpression('3', None) self.assertTrue(ok) self.assertEqual(exp, "field_name IN ('d', 'e')") layer = QgsVectorLayer( "Point?field=field_name:double&field=fldint:integer", "addfeat", "memory") # with layer exp, ok = renderer.legendKeyToExpression('3', layer) self.assertTrue(ok) self.assertEqual(exp, "\"field_name\" IN ('d', 'e')") # with expression as attribute renderer.setClassAttribute('upper("field_name")') exp, ok = renderer.legendKeyToExpression('0', None) self.assertTrue(ok) self.assertEqual(exp, """upper("field_name") = 'a'""") exp, ok = renderer.legendKeyToExpression('1', None) self.assertTrue(ok) self.assertEqual(exp, """upper("field_name") = 5""") exp, ok = renderer.legendKeyToExpression('2', None) self.assertTrue(ok) self.assertEqual(exp, """upper("field_name") = 5.5""") exp, ok = renderer.legendKeyToExpression('3', None) self.assertTrue(ok) self.assertEqual(exp, """upper("field_name") IN ('d', 'e')""") exp, ok = renderer.legendKeyToExpression('3', layer) self.assertTrue(ok) self.assertEqual(exp, """upper("field_name") IN ('d', 'e')""")
def on_classifyPushButton_clicked(self): input_raster_layer_name = self.rasterLayerComboBox.currentText() input_vector_layer_name = self.vectorLayerComboBox.currentText() # 调用QGIS区域统计工具 processing.run( 'qgis:zonalstatistics', { 'INPUT_RASTER': input_raster_layer_name, 'RASTER_BAND': 1, 'INPUT_VECTOR': input_vector_layer_name, 'COLUMN_PREFIX': 'Band1_', 'STATS': 2 }) processing.run( 'qgis:zonalstatistics', { 'INPUT_RASTER': input_raster_layer_name, 'RASTER_BAND': 2, 'INPUT_VECTOR': input_vector_layer_name, 'COLUMN_PREFIX': 'Band2_', 'STATS': 2 }) processing.run( 'qgis:zonalstatistics', { 'INPUT_RASTER': input_raster_layer_name, 'RASTER_BAND': 3, 'INPUT_VECTOR': input_vector_layer_name, 'COLUMN_PREFIX': 'Band3_', 'STATS': 2 }) # QgsProject.instance().addMapLayer(vector_layer) # 获取计算结果 input_vector_layer = QgsProject.instance().mapLayersByName( input_vector_layer_name)[0] features = input_vector_layer.getFeatures() feature_id_list = [] feature_band_list = [] for feature in features: feature_id_list.append(feature.id()) feature_band_list.append([ feature['Band1_mean'], feature['Band2_mean'], feature['Band3_mean'] ]) # 聚类 cluster_num = self.spinBox.value() cluster_result = cluster(np.array(feature_band_list)) # 添加聚类结果到字段,字段存在则删除。只要涉及字段操作,每次操作都要更新字段 field_name_list = [ field.name() for field in input_vector_layer.fields() ] if 'cluster_id' in field_name_list: input_vector_layer.dataProvider().deleteAttributes( [field_name_list.index('cluster_id')]) input_vector_layer.updateFields() input_vector_layer.dataProvider().addAttributes( [QgsField("cluster_id", QVariant.Int)]) input_vector_layer.updateFields() field_name_list = [ field.name() for field in input_vector_layer.fields() ] print(field_name_list) cluster_id_field_index = field_name_list.index('cluster_id') for index, fid in enumerate(feature_id_list): attrs = {cluster_id_field_index: int(cluster_result[index])} change_result = input_vector_layer.dataProvider( ).changeAttributeValues({fid: attrs}) print(fid) print(attrs) print(change_result) input_vector_layer.updateFields() # 符号化 categorized_renderer = QgsCategorizedSymbolRenderer() categorized_renderer.setClassAttribute('cluster_id') for cluster_id in range(cluster_num): fill_symbol = QgsFillSymbol.createSimple({}) fill_symbol.setColor( QtGui.QColor(*np.random.randint(0, 256, 3), 200)) categorized_renderer.addCategory( QgsRendererCategory(cluster_id, fill_symbol, f'cluster {cluster_id}')) input_vector_layer.setRenderer(categorized_renderer)