def testWidth(self): ms = QgsMapSettings() extent = QgsRectangle(100, 200, 100, 200) ms.setExtent(extent) ms.setOutputSize(QSize(400, 400)) context = QgsRenderContext.fromMapSettings(ms) context.setScaleFactor(96 / 25.4) # 96 DPI ms.setExtent(QgsRectangle(100, 150, 100, 150)) ms.setOutputDpi(ms.outputDpi() * 2) context2 = QgsRenderContext.fromMapSettings(ms) context2.setScaleFactor(300 / 25.4) s = QgsFillSymbol() s.deleteSymbolLayer(0) marker_line = QgsMarkerLineSymbolLayer(True) marker_line.setPlacement(QgsMarkerLineSymbolLayer.FirstVertex) marker = QgsSimpleMarkerSymbolLayer(QgsSimpleMarkerSymbolLayer.Triangle, 10) marker.setColor(QColor(255, 0, 0)) marker.setStrokeStyle(Qt.NoPen) marker_symbol = QgsMarkerSymbol() marker_symbol.changeSymbolLayer(0, marker) marker_line.setSubSymbol(marker_symbol) self.assertEqual(marker_line.width(), 10) self.assertAlmostEqual(marker_line.width(context), 37.795275590551185, 3) self.assertAlmostEqual(marker_line.width(context2), 118.11023622047244, 3) marker_line.subSymbol().setSizeUnit(QgsUnitTypes.RenderPixels) self.assertAlmostEqual(marker_line.width(context), 10.0, 3) self.assertAlmostEqual(marker_line.width(context2), 10.0, 3)
def testWidth(self): ms = QgsMapSettings() extent = QgsRectangle(100, 200, 100, 200) ms.setExtent(extent) ms.setOutputSize(QSize(400, 400)) context = QgsRenderContext.fromMapSettings(ms) context.setScaleFactor(96 / 25.4) # 96 DPI ms.setExtent(QgsRectangle(100, 150, 100, 150)) ms.setOutputDpi(ms.outputDpi() * 2) context2 = QgsRenderContext.fromMapSettings(ms) context2.setScaleFactor(300 / 25.4) s = QgsFillSymbol() s.deleteSymbolLayer(0) hash_line = QgsHashedLineSymbolLayer(True) hash_line.setPlacement(QgsTemplatedLineSymbolLayerBase.FirstVertex) simple_line = QgsSimpleLineSymbolLayer() line_symbol = QgsLineSymbol() line_symbol.changeSymbolLayer(0, simple_line) hash_line.setSubSymbol(line_symbol) hash_line.setHashLength(10) self.assertEqual(hash_line.width(), 10) self.assertAlmostEqual(hash_line.width(context), 37.795275590551185, 3) self.assertAlmostEqual(hash_line.width(context2), 118.11023622047244, 3) hash_line.setHashLengthUnit(QgsUnitTypes.RenderPixels) self.assertAlmostEqual(hash_line.width(context), 10.0, 3) self.assertAlmostEqual(hash_line.width(context2), 10.0, 3)
def testFromQPainter(self): """ test QgsRenderContext.fromQPainter """ # no painter c = QgsRenderContext.fromQPainter(None) self.assertFalse(c.painter()) # assuming 88 dpi as fallback self.assertAlmostEqual(c.scaleFactor(), 88 / 25.4, 3) # no painter destination p = QPainter() c = QgsRenderContext.fromQPainter(p) self.assertEqual(c.painter(), p) self.assertEqual(c.testFlag(QgsRenderContext.Antialiasing), False) self.assertAlmostEqual(c.scaleFactor(), 88 / 25.4, 3) im = QImage(1000, 600, QImage.Format_RGB32) dots_per_m = 300 / 25.4 * 1000 # 300 dpi to dots per m im.setDotsPerMeterX(dots_per_m) im.setDotsPerMeterY(dots_per_m) p = QPainter(im) p.setRenderHint(QPainter.Antialiasing) c = QgsRenderContext.fromQPainter(p) self.assertEqual(c.painter(), p) self.assertEqual(c.testFlag(QgsRenderContext.Antialiasing), True) self.assertAlmostEqual(c.scaleFactor(), dots_per_m / 1000, 3) # scaleFactor should be pixels/mm
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 testSize(self): # test size and setSize ms = QgsMapSettings() extent = QgsRectangle(100, 200, 100, 200) ms.setExtent(extent) ms.setOutputSize(QSize(400, 400)) context = QgsRenderContext.fromMapSettings(ms) context.setScaleFactor(96 / 25.4) # 96 DPI ms.setExtent(QgsRectangle(100, 150, 100, 150)) ms.setOutputDpi(ms.outputDpi() * 2) context2 = QgsRenderContext.fromMapSettings(ms) context2.setScaleFactor(300 / 25.4) # create a marker symbol with a single layer markerSymbol = QgsMarkerSymbol() markerSymbol.deleteSymbolLayer(0) markerSymbol.appendSymbolLayer( QgsSimpleMarkerSymbolLayer(QgsSimpleMarkerSymbolLayerBase.Star, color=QColor(255, 0, 0), strokeColor=QColor(0, 255, 0), size=10)) self.assertEqual(markerSymbol.size(), 10) self.assertAlmostEqual(markerSymbol.size(context), 37.795275590551185, 3) self.assertAlmostEqual(markerSymbol.size(context2), 118.11023622047244, 3) markerSymbol.setSize(20) self.assertEqual(markerSymbol.size(), 20) self.assertEqual(markerSymbol.symbolLayer(0).size(), 20) self.assertAlmostEqual(markerSymbol.size(context), 75.59055118, 3) self.assertAlmostEqual(markerSymbol.size(context2), 236.2204724409449, 3) # add additional layers markerSymbol.appendSymbolLayer( QgsSimpleMarkerSymbolLayer(QgsSimpleMarkerSymbolLayerBase.Star, color=QColor(255, 0, 0), strokeColor=QColor(0, 255, 0), size=10)) markerSymbol.appendSymbolLayer( QgsSimpleMarkerSymbolLayer(QgsSimpleMarkerSymbolLayerBase.Star, color=QColor(255, 0, 0), strokeColor=QColor(0, 255, 0), size=30)) self.assertEqual(markerSymbol.size(), 30) self.assertAlmostEqual(markerSymbol.size(context), 113.38582677165356, 3) self.assertAlmostEqual(markerSymbol.size(context2), 354.33070866141736, 3) markerSymbol.setSize(3) self.assertEqual(markerSymbol.size(), 3) # layer sizes should maintain relative size self.assertEqual(markerSymbol.symbolLayer(0).size(), 2) self.assertEqual(markerSymbol.symbolLayer(1).size(), 1) self.assertEqual(markerSymbol.symbolLayer(2).size(), 3) # symbol layer in different size markerSymbol.symbolLayer(1).setSize(15) self.assertAlmostEqual(markerSymbol.size(context), 56.69291338582678, 3) self.assertAlmostEqual(markerSymbol.size(context2), 177.16535433070868, 3) markerSymbol.symbolLayer(1).setSizeUnit(QgsUnitTypes.RenderPixels) self.assertAlmostEqual(markerSymbol.size(context), 15, 3) self.assertAlmostEqual(markerSymbol.size(context2), 35.43307086614173, 3) markerSymbol.symbolLayer(1).setSize(45) self.assertAlmostEqual(markerSymbol.size(context), 45, 3) self.assertAlmostEqual(markerSymbol.size(context2), 45, 3)
def testGettersSetters(self): """ Basic getter/setter tests """ c = QgsRenderContext() c.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysText) self.assertEqual(c.textRenderFormat(), QgsRenderContext.TextFormatAlwaysText) c.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysOutlines) self.assertEqual(c.textRenderFormat(), QgsRenderContext.TextFormatAlwaysOutlines) c.setMapExtent(QgsRectangle(1, 2, 3, 4)) self.assertEqual(c.mapExtent(), QgsRectangle(1, 2, 3, 4))
def testFromMapSettings(self): """ test QgsRenderContext.fromMapSettings() """ ms = QgsMapSettings() ms.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysText) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.textRenderFormat(), QgsRenderContext.TextFormatAlwaysText) ms.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysOutlines) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.textRenderFormat(), QgsRenderContext.TextFormatAlwaysOutlines)
def renderGeometry(self, symbol, geom, buffer=20): f = QgsFeature() f.setGeometry(geom) image = QImage(200, 200, QImage.Format_RGB32) painter = QPainter() ms = QgsMapSettings() extent = geom.get().boundingBox() # buffer extent by 10% if extent.width() > 0: extent = extent.buffered((extent.height() + extent.width()) / buffer) else: extent = extent.buffered(buffer / 2) ms.setExtent(extent) ms.setOutputSize(image.size()) context = QgsRenderContext.fromMapSettings(ms) context.setPainter(painter) context.setScaleFactor(96 / 25.4) # 96 DPI context.expressionContext().setFeature(f) painter.begin(image) try: image.fill(QColor(0, 0, 0)) symbol.startRender(context) symbol.renderFeature(f, context) symbol.stopRender(context) finally: painter.end() return image
def testWillRenderFeatureNestedElse(self): vl = self.mapsettings.layers()[0] ft = vl.getFeature(0) # 'id' = 1 ctx = QgsRenderContext.fromMapSettings(self.mapsettings) ctx.expressionContext().setFeature(ft) # Create rulebased style sym1 = QgsFillSymbol.createSimple({'color': '#fdbf6f', 'outline_color': 'black'}) sym2 = QgsFillSymbol.createSimple({'color': '#71bd6c', 'outline_color': 'black'}) sym3 = QgsFillSymbol.createSimple({'color': '#1f78b4', 'outline_color': 'black'}) self.rx1 = QgsRuleBasedRenderer.Rule(sym1, 0, 0, '"id" = 1') self.rx2 = QgsRuleBasedRenderer.Rule(sym2, 0, 0, '"id" = 2') self.rx3 = QgsRuleBasedRenderer.Rule(sym3, 0, 0, 'ELSE') self.rx3.appendChild(self.rx1) rootrule = QgsRuleBasedRenderer.Rule(None) rootrule.appendChild(self.rx2) rootrule.appendChild(self.rx3) vl.setRenderer(QgsRuleBasedRenderer(rootrule)) renderer = vl.renderer() # Reunder with else rule and all activated renderer.startRender(ctx, vl.fields()) self.assertTrue(renderer.willRenderFeature(ft, ctx)) renderer.stopRender(ctx) # Reunder with else rule where else is deactivated renderer.rootRule().children()[1].setActive(False) renderer.startRender(ctx, vl.fields()) self.assertFalse(renderer.willRenderFeature(ft, ctx)) renderer.stopRender(ctx)
def testSimpleLineWithOffset(self): """ test that rendering a polygon with simple line symbol with offset results in closed line""" layer = QgsSimpleLineSymbolLayer() layer.setOffset(-1) symbol = QgsFillSymbol() symbol.changeSymbolLayer(0, layer) image = QImage(200, 200, QImage.Format_RGB32) painter = QPainter() ms = QgsMapSettings() geom = QgsGeometry.fromWkt('Polygon((0 0, 10 0, 10 10, 0 10, 0 0))') f = QgsFeature() f.setGeometry(geom) extent = geom.geometry().boundingBox() # buffer extent by 10% extent = extent.buffer((extent.height() + extent.width()) / 20.0) ms.setExtent(extent) ms.setOutputSize(image.size()) context = QgsRenderContext.fromMapSettings(ms) context.setPainter(painter) context.setScaleFactor(96 / 25.4) # 96 DPI painter.begin(image) image.fill(QColor(255, 255, 255)) symbol.startRender(context) symbol.renderFeature(f, context) symbol.stopRender(context) painter.end() self.assertTrue(self.imageCheck('symbol_layer', 'fill_simpleline_offset', image))
def testRenderMarkerLayerDisabled(self): """ test that rendering a marker symbol with disabled layer works""" layer = QgsSimpleMarkerSymbolLayer() layer.setEnabled(False) symbol = QgsMarkerSymbol() symbol.changeSymbolLayer(0, layer) image = QImage(200, 200, QImage.Format_RGB32) painter = QPainter() ms = QgsMapSettings() geom = QgsGeometry.fromWkt('Point (1 2)') f = QgsFeature() f.setGeometry(geom) extent = QgsRectangle(0, 0, 4, 4) ms.setExtent(extent) ms.setOutputSize(image.size()) context = QgsRenderContext.fromMapSettings(ms) context.setPainter(painter) context.setScaleFactor(96 / 25.4) # 96 DPI painter.begin(image) image.fill(QColor(255, 255, 255)) symbol.startRender(context) symbol.renderFeature(f, context) symbol.stopRender(context) painter.end() self.assertTrue(self.imageCheck('symbol_layer', 'symbollayer_disabled', image))
def testRenderLineLayerDisabled(self): """ test that rendering a line symbol with disabled layer works""" layer = QgsSimpleLineSymbolLayer() layer.setEnabled(False) symbol = QgsLineSymbol() symbol.changeSymbolLayer(0, layer) image = QImage(200, 200, QImage.Format_RGB32) painter = QPainter() ms = QgsMapSettings() geom = QgsGeometry.fromWkt('LineString (0 0,3 4,4 3)') f = QgsFeature() f.setGeometry(geom) extent = geom.constGet().boundingBox() # buffer extent by 10% extent = extent.buffered((extent.height() + extent.width()) / 20.0) ms.setExtent(extent) ms.setOutputSize(image.size()) context = QgsRenderContext.fromMapSettings(ms) context.setPainter(painter) context.setScaleFactor(96 / 25.4) # 96 DPI painter.begin(image) image.fill(QColor(255, 255, 255)) symbol.startRender(context) symbol.renderFeature(f, context) symbol.stopRender(context) painter.end() self.assertTrue(self.imageCheck('symbol_layer', 'symbollayer_disabled', image))
def build25d(canvas, layer, count): shadows = "" renderer = layer.renderer() renderContext = QgsRenderContext.fromMapSettings(canvas.mapSettings()) fields = layer.fields() renderer.startRender(renderContext, fields) for feat in layer.getFeatures(): if isinstance(renderer, QgsCategorizedSymbolRenderer): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) catIndex = renderer.categoryIndexForValue(attrValue) categories = renderer.categories() symbol = categories[catIndex].symbol() elif isinstance(renderer, QgsGraduatedSymbolRenderer): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) ranges = renderer.ranges() for range in ranges: if (attrValue >= range.lowerValue() and attrValue <= range.upperValue()): symbol = range.symbol().clone() else: symbol = renderer.symbolForFeature(feat, renderContext) symbolLayer = symbol.symbolLayer(0) if not symbolLayer.paintEffect().effectList()[0].enabled(): shadows = "'2015-07-15 10:00:00'" renderer.stopRender(renderContext) osmb = """ var osmb = new OSMBuildings(map).date(new Date({shadows})); osmb.set(json_{sln}_{count});""".format(shadows=shadows, sln=safeName(layer.name()), count=unicode(count)) return osmb
def testRenderMetersInMapUnits(self): crs_wsg84 = QgsCoordinateReferenceSystem.fromOgcWmsCrs('EPSG:4326') rt_extent = QgsRectangle(13.37768985634235, 52.51625705830762, 13.37771931686235, 52.51628651882762) point_berlin_wsg84 = QgsPointXY(13.37770458660236, 52.51627178856762) length_wsg84_mapunits = 0.00001473026350140572 meters_test = 2.40 da_wsg84 = QgsDistanceArea() da_wsg84.setSourceCrs(crs_wsg84, QgsProject.instance().transformContext()) if (da_wsg84.sourceCrs().isGeographic()): da_wsg84.setEllipsoid(da_wsg84.sourceCrs().ellipsoidAcronym()) length_meter_mapunits = da_wsg84.measureLineProjected(point_berlin_wsg84, 1.0, (math.pi / 2)) meters_test_mapunits = meters_test * length_wsg84_mapunits meters_test_pixel = meters_test * length_wsg84_mapunits ms = QgsMapSettings() ms.setDestinationCrs(crs_wsg84) ms.setExtent(rt_extent) r = QgsRenderContext.fromMapSettings(ms) r.setExtent(rt_extent) self.assertEqual(r.extent().center().toString(7), point_berlin_wsg84.toString(7)) c = QgsMapUnitScale() r.setDistanceArea(da_wsg84) result_test_painterunits = r.convertToPainterUnits(meters_test, QgsUnitTypes.RenderMetersInMapUnits, c) self.assertEqual(QgsDistanceArea.formatDistance(result_test_painterunits, 7, QgsUnitTypes.DistanceUnknownUnit, True), QgsDistanceArea.formatDistance(meters_test_mapunits, 7, QgsUnitTypes.DistanceUnknownUnit, True)) result_test_mapunits = r.convertToMapUnits(meters_test, QgsUnitTypes.RenderMetersInMapUnits, c) self.assertEqual(QgsDistanceArea.formatDistance(result_test_mapunits, 7, QgsUnitTypes.DistanceDegrees, True), QgsDistanceArea.formatDistance(meters_test_mapunits, 7, QgsUnitTypes.DistanceDegrees, True)) result_test_meters = r.convertFromMapUnits(meters_test_mapunits, QgsUnitTypes.RenderMetersInMapUnits) self.assertEqual(QgsDistanceArea.formatDistance(result_test_meters, 1, QgsUnitTypes.DistanceMeters, True), QgsDistanceArea.formatDistance(meters_test, 1, QgsUnitTypes.DistanceMeters, True))
def testCopyConstructor(self): """ Test the copy constructor """ c1 = QgsRenderContext() c1.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysText) c2 = QgsRenderContext(c1) self.assertEqual(c2.textRenderFormat(), QgsRenderContext.TextFormatAlwaysText) c1.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysOutlines) c2 = QgsRenderContext(c1) self.assertEqual(c2.textRenderFormat(), QgsRenderContext.TextFormatAlwaysOutlines)
def testFromMapSettings(self): """ test QgsRenderContext.fromMapSettings() """ ms = QgsMapSettings() ms.setOutputSize(QSize(1000, 1000)) ms.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:3111')) ms.setExtent(QgsRectangle(10000, 20000, 30000, 40000)) ms.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysText) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.textRenderFormat(), QgsRenderContext.TextFormatAlwaysText) ms.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysOutlines) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.textRenderFormat(), QgsRenderContext.TextFormatAlwaysOutlines) self.assertEqual(rc.mapExtent(), QgsRectangle(10000, 20000, 30000, 40000))
def testConvertToPainterUnits(self): ms = QgsMapSettings() ms.setExtent(QgsRectangle(0, 0, 100, 100)) ms.setOutputSize(QSize(100, 50)) ms.setOutputDpi(300) r = QgsRenderContext.fromMapSettings(ms) # renderer scale should be about 1:291937841 # start with no min/max scale c = QgsMapUnitScale() size = r.convertToPainterUnits(2, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(size, 1.0, places=5) size = r.convertToPainterUnits(2, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(size, 23.622047, places=5) size = r.convertToPainterUnits(2, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(size, 8.33333333125, places=5) size = r.convertToPainterUnits(2, QgsUnitTypes.RenderInches, c) self.assertAlmostEqual(size, 600.0, places=5) size = r.convertToPainterUnits(2, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(size, 2.0, places=5) # minimum size greater than the calculated size, so size should be limited to minSizeMM c.minSizeMM = 5 c.minSizeMMEnabled = True size = r.convertToPainterUnits(2, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(size, 59.0551181, places=5) # only conversion from mapunits should be affected size = r.convertToPainterUnits(2, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(size, 23.622047, places=5) size = r.convertToPainterUnits(2, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(size, 8.33333333125, places=5) size = r.convertToPainterUnits(2, QgsUnitTypes.RenderInches, c) self.assertAlmostEqual(size, 600.0, places=5) size = r.convertToPainterUnits(2, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(size, 2.0, places=5) c.minSizeMMEnabled = False # maximum size less than the calculated size, so size should be limited to maxSizeMM c.maxSizeMM = 0.1 c.maxSizeMMEnabled = True size = r.convertToPainterUnits(2, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(size, 1.0, places=5) # only conversion from mapunits should be affected size = r.convertToPainterUnits(2, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(size, 23.622047, places=5) size = r.convertToPainterUnits(2, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(size, 8.33333333125, places=5) size = r.convertToPainterUnits(2, QgsUnitTypes.RenderInches, c) self.assertAlmostEqual(size, 600.0, places=5) size = r.convertToPainterUnits(2, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(size, 2.0, places=5)
def testConvertSingleUnit(self): ms = QgsMapSettings() ms.setExtent(QgsRectangle(0, 0, 100, 100)) ms.setOutputSize(QSize(100, 50)) ms.setOutputDpi(300) r = QgsRenderContext.fromMapSettings(ms) # renderer scale should be about 1:291937841 # start with no min/max scale c = QgsMapUnitScale() #self.assertEqual(r.scaleFactor(),666) sf = r.convertToPainterUnits(1, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(sf, 0.5, places=5) sf = r.convertToPainterUnits(1, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(sf, 11.8110236, places=5) sf = r.convertToPainterUnits(1, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(sf, 4.166666665625, places=5) sf = r.convertToPainterUnits(1, QgsUnitTypes.RenderInches, c) self.assertAlmostEqual(sf, 300.0, places=5) sf = r.convertToPainterUnits(1, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(sf, 1.0, places=5) # minimum scale greater than the renderer scale, so should be limited to minScale c.minScale = 150000000.0 sf = r.convertToPainterUnits(1, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(sf, 3.89250455, places=5) # only conversion from mapunits should be affected sf = r.convertToPainterUnits(1, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(sf, 11.8110236, places=5) sf = r.convertToPainterUnits(1, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(sf, 4.166666665625, places=5) sf = r.convertToPainterUnits(1, QgsUnitTypes.RenderInches, c) self.assertAlmostEqual(sf, 300.0, places=5) sf = r.convertToPainterUnits(1, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(sf, 1.0, places=5) c.minScale = 0 # maximum scale less than the renderer scale, so should be limited to maxScale c.maxScale = 350000000.0 sf = r.convertToPainterUnits(1, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(sf, 0.5, places=5) # only conversion from mapunits should be affected sf = r.convertToPainterUnits(1, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(sf, 11.8110236, places=5) sf = r.convertToPainterUnits(1, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(sf, 4.166666665625, places=5) sf = r.convertToPainterUnits(1, QgsUnitTypes.RenderInches, c) self.assertAlmostEqual(sf, 300.0, places=5) sf = r.convertToPainterUnits(1, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(sf, 1.0, places=5)
def testGettersSetters(self): """ Basic getter/setter tests """ c = QgsRenderContext() c.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysText) self.assertEqual(c.textRenderFormat(), QgsRenderContext.TextFormatAlwaysText) c.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysOutlines) self.assertEqual(c.textRenderFormat(), QgsRenderContext.TextFormatAlwaysOutlines)
def paint(self, painter, option=None, widget=None): # Override if not self._feature: return mapSettings = self._mapCanvas.mapSettings() context = QgsRenderContext.fromMapSettings(mapSettings) renderer = self._getRenderer(context, self._pen.color(), self._brush.color()) if renderer: context.setPainter(painter) renderer.startRender(context, self._layer.fields()) renderer.renderFeature(self._feature, context) renderer.stopRender(context)
def testMapUnitsPerPixel(self): # test computeMapUnitsPerPixel ms = QgsMapSettings() ms.setExtent(QgsRectangle(0, 0, 100, 100)) ms.setOutputSize(QSize(100, 50)) ms.setOutputDpi(75) r = QgsRenderContext.fromMapSettings(ms) # renderer scale should be about 1:291937841 # start with no min/max scale c = QgsMapUnitScale() mup = c.computeMapUnitsPerPixel(r) self.assertAlmostEqual(mup, 2.0, places=5) # add a minimum scale less than the renderer scale, so should be no change c.minScale = 350000000.0 mup = c.computeMapUnitsPerPixel(r) self.assertAlmostEqual(mup, 2.0, places=5) # minimum scale greater than the renderer scale, so should be limited to minScale c.minScale = 150000000.0 mup = c.computeMapUnitsPerPixel(r) self.assertAlmostEqual(mup, 1.0276160, places=5) c.minScale = 50000000.0 mup = c.computeMapUnitsPerPixel(r) self.assertAlmostEqual(mup, 0.3425386, places=5) c.minScale = 350000000.0 # add a maximum scale greater than the renderer scale, so should be no change c.maxScale = 150000000.0 mup = c.computeMapUnitsPerPixel(r) self.assertAlmostEqual(mup, 2.0, places=5) # maximum scale less than the renderer scale, so should be limited to maxScale c.maxScale = 350000000.0 mup = c.computeMapUnitsPerPixel(r) self.assertAlmostEqual(mup, 2.3977706, places=5) c.maxScale = 500000000.0 mup = c.computeMapUnitsPerPixel(r) self.assertAlmostEqual(mup, 3.4253867, places=5) # test resetting to min/max c.minScale = 0 c.maxScale = 0 mup = c.computeMapUnitsPerPixel(r) self.assertAlmostEqual(mup, 2.0, places=5)
def testPixelSizeScaleFactor(self): # test QgsSymbolLayerUtils::pixelSizeScaleFactor() using QgsMapUnitScale ms = QgsMapSettings() ms.setExtent(QgsRectangle(0, 0, 100, 100)) ms.setOutputSize(QSize(100, 50)) ms.setOutputDpi(300) r = QgsRenderContext.fromMapSettings(ms) # renderer scale should be about 1:291937841 # start with no min/max scale c = QgsMapUnitScale() sf = QgsSymbolLayerUtils.pixelSizeScaleFactor(r, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(sf, 0.5, places=5) sf = QgsSymbolLayerUtils.pixelSizeScaleFactor(r, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(sf, 11.8110236, places=5) sf = QgsSymbolLayerUtils.pixelSizeScaleFactor(r, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(sf, 33.48006689762, places=5) sf = QgsSymbolLayerUtils.pixelSizeScaleFactor(r, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(sf, 1.0, places=5) # minimum scale greater than the renderer scale, so should be limited to minScale c.minScale = 1 / 150000000.0 sf = QgsSymbolLayerUtils.pixelSizeScaleFactor(r, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(sf, 3.8925045, places=5) # only conversion from mapunits should be affected sf = QgsSymbolLayerUtils.pixelSizeScaleFactor(r, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(sf, 11.811023, places=5) sf = QgsSymbolLayerUtils.pixelSizeScaleFactor(r, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(sf, 33.48006689762, places=5) sf = QgsSymbolLayerUtils.pixelSizeScaleFactor(r, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(sf, 1.0, places=5) c.minScale = 0 # maximum scale less than the renderer scale, so should be limited to maxScale c.maxScale = 1 / 350000000.0 sf = QgsSymbolLayerUtils.pixelSizeScaleFactor(r, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(sf, 0.5, places=5) # only conversion from mapunits should be affected sf = QgsSymbolLayerUtils.pixelSizeScaleFactor(r, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(sf, 11.8110236, places=5) sf = QgsSymbolLayerUtils.pixelSizeScaleFactor(r, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(sf, 33.48006689762, places=5) sf = QgsSymbolLayerUtils.pixelSizeScaleFactor(r, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(sf, 1.0, places=5)
def add25dAttributes(cleanLayer, layer, canvas): provider = cleanLayer.dataProvider() provider.addAttributes([QgsField("height", QVariant.Double), QgsField("wallColor", QVariant.String), QgsField("roofColor", QVariant.String)]) cleanLayer.updateFields() fields = cleanLayer.fields() renderer = layer.renderer() renderContext = QgsRenderContext.fromMapSettings(canvas.mapSettings()) feats = layer.getFeatures() context = QgsExpressionContext() context.appendScope(QgsExpressionContextUtils.layerScope(layer)) expression = QgsExpression('eval(@qgis_25d_height)') heightField = fields.indexFromName("height") wallField = fields.indexFromName("wallColor") roofField = fields.indexFromName("roofColor") renderer.startRender(renderContext, fields) cleanLayer.startEditing() for feat in feats: context.setFeature(feat) height = expression.evaluate(context) if isinstance(renderer, QgsCategorizedSymbolRenderer): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) catIndex = renderer.categoryIndexForValue(attrValue) categories = renderer.categories() symbol = categories[catIndex].symbol() elif isinstance(renderer, QgsGraduatedSymbolRenderer): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) ranges = renderer.ranges() for range in ranges: if (attrValue >= range.lowerValue() and attrValue <= range.upperValue()): symbol = range.symbol().clone() else: symbol = renderer.symbolForFeature(feat, renderContext) sl1 = symbol.symbolLayer(1) sl2 = symbol.symbolLayer(2) wallColor = sl1.subSymbol().color().name() roofColor = sl2.subSymbol().color().name() provider.changeAttributeValues({feat.id() + 1: {heightField: height, wallField: wallColor, roofField: roofColor}}) cleanLayer.commitChanges() renderer.stopRender(renderContext)
def get_features_in_area(layer, area, transform, mapsettings): """ Return all the features for the given layer in the search area :param layer: Search layer :param area: Search area :param transform: :return: yields a dict for each feature found in the area """ renderer = layer.rendererV2() layerid = layer.id() context = QgsRenderContext.fromMapSettings(mapsettings) renderer.startRender(context, layer.pendingFields()) for feature in layer.getFeatures(QgsFeatureRequest(area)): featuredata = to_feature_data(layerid, feature, renderer, transform) for data in featuredata: yield data renderer.stopRender(context)
def renderGeometry(self, geom): f = QgsFeature() f.setGeometry(geom) image = QImage(200, 200, QImage.Format_RGB32) painter = QPainter() ms = QgsMapSettings() extent = geom.get().boundingBox() # buffer extent by 10% if extent.width() > 0: extent = extent.buffered((extent.height() + extent.width()) / 20.0) else: extent = extent.buffered(10) ms.setExtent(extent) ms.setOutputSize(image.size()) context = QgsRenderContext.fromMapSettings(ms) context.setPainter(painter) context.setScaleFactor(96 / 25.4) # 96 DPI painter.begin(image) try: image.fill(QColor(0, 0, 0)) if geom.type() == QgsWkbTypes.PolygonGeometry: self.fill_symbol.startRender(context) self.fill_symbol.renderFeature(f, context) self.fill_symbol.stopRender(context) elif geom.type() == QgsWkbTypes.LineGeometry: self.line_symbol.startRender(context) self.line_symbol.renderFeature(f, context) self.line_symbol.stopRender(context) elif geom.type() == QgsWkbTypes.PointGeometry: self.marker_symbol.startRender(context) self.marker_symbol.renderFeature(f, context) self.marker_symbol.stopRender(context) else: self.fail("Unknown type: " + geom.type()) finally: painter.end() return image
def is25d(layer, canvas, restrictToExtent, extent): if layer.type() != layer.VectorLayer: return False if layer.geometryType() != QgsWkbTypes.PolygonGeometry: return False vts = layer.customProperty("VectorTilesReader/vector_tile_source") if vts is not None: return False renderer = layer.renderer() if isinstance(renderer, Qgs25DRenderer): return True symbols = [] if isinstance(renderer, QgsCategorizedSymbolRenderer): categories = renderer.categories() for category in categories: symbols.append(category.symbol()) elif isinstance(renderer, QgsGraduatedSymbolRenderer): ranges = renderer.ranges() for range in ranges: symbols.append(range.symbol()) elif isinstance(renderer, QgsRuleBasedRenderer): rules = renderer.rootRule().children() for rule in rules: symbols.append(rule.symbol()) else: renderContext = QgsRenderContext.fromMapSettings(canvas.mapSettings()) fields = layer.fields() if restrictToExtent and extent == "Canvas extent": request = QgsFeatureRequest(canvas.extent()) request.setFlags(QgsFeatureRequest.ExactIntersect) features = layer.getFeatures(request) else: features = layer.getFeatures() renderer.startRender(renderContext, fields) for feature in features: symbol = renderer.symbolForFeature(feature, renderContext) symbols.append(symbol) renderer.stopRender(renderContext) for sym in symbols: sl1 = sym.symbolLayer(1) sl2 = sym.symbolLayer(2) if (isinstance(sl1, QgsGeometryGeneratorSymbolLayer) and isinstance(sl2, QgsGeometryGeneratorSymbolLayer)): return True return False
def testConvertFromMapUnits(self): # test QgsSymbolLayerUtils::convertToMapUnits() without QgsMapUnitScale ms = QgsMapSettings() ms.setExtent(QgsRectangle(0, 0, 100, 100)) ms.setOutputSize(QSize(100, 50)) ms.setOutputDpi(300) r = QgsRenderContext.fromMapSettings(ms) # renderer scale should be about 1:291937841 size = QgsSymbolLayerUtils.convertFromMapUnits(r, 2, QgsUnitTypes.RenderMapUnits) self.assertEqual(size, 2.0) size = QgsSymbolLayerUtils.convertFromMapUnits(r, 50, QgsUnitTypes.RenderMillimeters) self.assertAlmostEqual(size, 2.1166666666, places=5) size = QgsSymbolLayerUtils.convertFromMapUnits(r, 50, QgsUnitTypes.RenderPoints) self.assertAlmostEqual(size, 6.0000000015, places=5) size = QgsSymbolLayerUtils.convertFromMapUnits(r, 4, QgsUnitTypes.RenderPixels) self.assertAlmostEqual(size, 2.0, places=5)
def testMapUnitScaleFactor(self): # test QgsSymbolLayerV2Utils::mapUnitScaleFactor() using QgsMapUnitScale ms = QgsMapSettings() ms.setExtent(QgsRectangle(0, 0, 100, 100)) ms.setOutputSize(QSize(100, 50)) ms.setOutputDpi(300) r = QgsRenderContext.fromMapSettings(ms) # renderer scale should be about 1:291937841 c = QgsMapUnitScale() sf = QgsSymbolLayerV2Utils.mapUnitScaleFactor(r, QgsSymbolV2.MapUnit, c) self.assertAlmostEqual(sf, 1.0, places=5) sf = QgsSymbolLayerV2Utils.mapUnitScaleFactor(r, QgsSymbolV2.MM, c) self.assertAlmostEqual(sf, 23.622047, places=5) sf = QgsSymbolLayerV2Utils.mapUnitScaleFactor(r, QgsSymbolV2.Pixel, c) self.assertAlmostEqual(sf, 2.0, places=5)
def testConvertToPainterUnits(self): # test QgsSymbolLayerV2Utils::convertToPainterUnits() using QgsMapUnitScale ms = QgsMapSettings() ms.setExtent(QgsRectangle(0, 0, 100, 100)) ms.setOutputSize(QSize(100, 50)) ms.setOutputDpi(300) r = QgsRenderContext.fromMapSettings(ms) # renderer scale should be about 1:291937841 # start with no min/max scale c = QgsMapUnitScale() size = QgsSymbolLayerV2Utils.convertToPainterUnits(r, 2, QgsSymbolV2.MapUnit, c) self.assertAlmostEqual(size, 1.0, places=5) size = QgsSymbolLayerV2Utils.convertToPainterUnits(r, 2, QgsSymbolV2.MM, c) self.assertAlmostEqual(size, 23.622047, places=5) size = QgsSymbolLayerV2Utils.convertToPainterUnits(r, 2, QgsSymbolV2.Pixel, c) self.assertAlmostEqual(size, 2.0, places=5) # minimum size greater than the calculated size, so size should be limited to minSizeMM c.minSizeMM = 5 c.minSizeMMEnabled = True size = QgsSymbolLayerV2Utils.convertToPainterUnits(r, 2, QgsSymbolV2.MapUnit, c) self.assertAlmostEqual(size, 59.0551181, places=5) # only conversion from mapunits should be affected size = QgsSymbolLayerV2Utils.convertToPainterUnits(r, 2, QgsSymbolV2.MM, c) self.assertAlmostEqual(size, 23.622047, places=5) size = QgsSymbolLayerV2Utils.convertToPainterUnits(r, 2, QgsSymbolV2.Pixel, c) self.assertAlmostEqual(size, 2.0, places=5) c.minSizeMMEnabled = False # maximum size less than the calculated size, so size should be limited to maxSizeMM c.maxSizeMM = 0.1 c.maxSizeMMEnabled = True size = QgsSymbolLayerV2Utils.convertToPainterUnits(r, 2, QgsSymbolV2.MapUnit, c) self.assertAlmostEqual(size, 1.0, places=5) # only conversion from mapunits should be affected size = QgsSymbolLayerV2Utils.convertToPainterUnits(r, 2, QgsSymbolV2.MM, c) self.assertAlmostEqual(size, 23.622047, places=5) size = QgsSymbolLayerV2Utils.convertToPainterUnits(r, 2, QgsSymbolV2.Pixel, c) self.assertAlmostEqual(size, 2.0, places=5)
def isFeatureRendered(canvas, layer, feature): renderer = layer.rendererV2() renderContext = QgsRenderContext() renderContext.setExtent(canvas.mapRenderer().rendererContext().extent()) renderContext.setMapToPixel(canvas.mapRenderer().rendererContext().mapToPixel()) renderContext.setRendererScale(canvas.mapRenderer().scale()) if QGis.QGIS_VERSION_INT >= 20300: renderer.startRender(renderContext, layer.pendingFields()) else: renderer.startRender(renderContext, layer) ans = renderer.willRenderFeature(feature) renderer.stopRender(renderContext) return ans
def test_no_feature_coordinate_transform(self): """ Test rendering as a pure symbol, no feature associated, with coordinate transform """ buffer_layer = QgsGeometryGeneratorSymbolLayer.create( {'geometryModifier': 'buffer($geometry, 5)'}) buffer_layer.setSymbolType(QgsSymbol.Fill) buffer_layer.setUnits(QgsUnitTypes.RenderMillimeters) self.assertIsNotNone(buffer_layer.subSymbol()) symbol = QgsLineSymbol() symbol.changeSymbolLayer(0, buffer_layer) image = QImage(400, 400, QImage.Format_RGB32) image.fill(QColor(255, 255, 255)) painter = QPainter(image) context = QgsRenderContext.fromQPainter(painter) context.setCoordinateTransform( QgsCoordinateTransform(QgsCoordinateReferenceSystem('EPSG:4326'), QgsCoordinateReferenceSystem('EPSG:3857'), QgsProject.instance().transformContext())) symbol.startRender(context) symbol.renderPolyline( QPolygonF([QPointF(50, 200), QPointF(100, 170), QPointF(350, 270)]), None, context) symbol.stopRender(context) painter.end() self.assertTrue( self.imageCheck('geometrygenerator_nofeature', 'geometrygenerator_nofeature', image))
def testSimpleLineWithOffset(self): """ test that rendering a polygon with simple line symbol with offset results in closed line""" layer = QgsSimpleLineSymbolLayer() layer.setOffset(-1) layer.setColor(QColor(0, 0, 0)) symbol = QgsFillSymbol() symbol.changeSymbolLayer(0, layer) image = QImage(200, 200, QImage.Format_RGB32) painter = QPainter() ms = QgsMapSettings() geom = QgsGeometry.fromWkt('Polygon((0 0, 10 0, 10 10, 0 10, 0 0))') f = QgsFeature() f.setGeometry(geom) extent = geom.constGet().boundingBox() # buffer extent by 10% extent = extent.buffered((extent.height() + extent.width()) / 20.0) ms.setExtent(extent) ms.setOutputSize(image.size()) context = QgsRenderContext.fromMapSettings(ms) context.setPainter(painter) context.setScaleFactor(96 / 25.4) # 96 DPI painter.begin(image) image.fill(QColor(255, 255, 255)) symbol.startRender(context) symbol.renderFeature(f, context) symbol.stopRender(context) painter.end() self.assertTrue(self.imageCheck('symbol_layer', 'fill_simpleline_offset', image))
def testRenderLineLayerDisabled(self): """ test that rendering a line symbol with disabled layer works""" layer = QgsSimpleLineSymbolLayer() layer.setEnabled(False) symbol = QgsLineSymbol() symbol.changeSymbolLayer(0, layer) image = QImage(200, 200, QImage.Format_RGB32) painter = QPainter() ms = QgsMapSettings() geom = QgsGeometry.fromWkt('LineString (0 0,3 4,4 3)') f = QgsFeature() f.setGeometry(geom) extent = geom.constGet().boundingBox() # buffer extent by 10% extent = extent.buffered((extent.height() + extent.width()) / 20.0) ms.setExtent(extent) ms.setOutputSize(image.size()) context = QgsRenderContext.fromMapSettings(ms) context.setPainter(painter) context.setScaleFactor(96 / 25.4) # 96 DPI painter.begin(image) image.fill(QColor(255, 255, 255)) symbol.startRender(context) symbol.renderFeature(f, context) symbol.stopRender(context) painter.end() self.assertTrue( self.imageCheck('symbol_layer', 'symbollayer_disabled', image))
def testItemsInBounds(self): layer = QgsAnnotationLayer( 'test', QgsAnnotationLayer.LayerOptions( QgsProject.instance().transformContext())) self.assertTrue(layer.isValid()) item1uuid = layer.addItem( QgsAnnotationPolygonItem( QgsPolygon( QgsLineString([ QgsPoint(12, 13), QgsPoint(14, 13), QgsPoint(14, 15), QgsPoint(12, 13) ])))) item2uuid = layer.addItem( QgsAnnotationLineItem( QgsLineString( [QgsPoint(11, 13), QgsPoint(12, 13), QgsPoint(12, 150)]))) item3uuid = layer.addItem(QgsAnnotationMarkerItem(QgsPoint(120, 13))) rc = QgsRenderContext() self.assertFalse(layer.itemsInBounds(QgsRectangle(-10, -10, -9, 9), rc)) self.assertCountEqual( layer.itemsInBounds(QgsRectangle(12, 13, 14, 15), rc), [item1uuid, item2uuid]) self.assertCountEqual( layer.itemsInBounds(QgsRectangle(12, 130, 14, 150), rc), [item2uuid]) self.assertCountEqual( layer.itemsInBounds(QgsRectangle(110, 0, 120, 20), rc), [item3uuid])
def testSetPainterFlags(self): rc = QgsRenderContext() p = QPainter() im = QImage(1000, 600, QImage.Format_RGB32) p.begin(im) rc.setPainterFlagsUsingContext(p) self.assertFalse(p.testRenderHint(QPainter.Antialiasing)) try: self.assertFalse(p.testRenderHint(QPainter.LosslessImageRendering)) except AttributeError: pass rc.setPainter(p) rc.setFlag(QgsRenderContext.Antialiasing, True) rc.setFlag(QgsRenderContext.LosslessImageRendering, True) rc.setPainterFlagsUsingContext(p) self.assertTrue(p.testRenderHint(QPainter.Antialiasing)) try: self.assertTrue(p.testRenderHint(QPainter.LosslessImageRendering)) except AttributeError: pass p.end()
def testQgsGraduatedSymbolRendererV2_1(self): """Test QgsGraduatedSymbolRendererV2: Basic get/set functions """ # Create a renderer renderer = QgsGraduatedSymbolRendererV2() symbol = createMarkerSymbol() renderer.setSourceSymbol(symbol.clone()) self.assertEqual(symbol.dump(), renderer.sourceSymbol().dump(), "Get/set renderer source symbol") attr = '"value"*"value"' renderer.setClassAttribute(attr) self.assertEqual(attr, renderer.classAttribute(), "Get/set renderer class attribute") for m in ( QgsGraduatedSymbolRendererV2.Custom, QgsGraduatedSymbolRendererV2.EqualInterval, QgsGraduatedSymbolRendererV2.Quantile, QgsGraduatedSymbolRendererV2.Jenks, QgsGraduatedSymbolRendererV2.Pretty, QgsGraduatedSymbolRendererV2.StdDev, ): renderer.setMode(m) self.assertEqual(m, renderer.mode(), "Get/set renderer mode") format = createLabelFormat() renderer.setLabelFormat(format) self.assertEqual(dumpLabelFormat(format), dumpLabelFormat(renderer.labelFormat()), "Get/set renderer label format") ramp = createColorRamp() renderer.setSourceColorRamp(ramp) self.assertEqual(dumpColorRamp(ramp), dumpColorRamp(renderer.sourceColorRamp()), "Get/set renderer color ramp") renderer.setInvertedColorRamp(True) self.assertTrue(renderer.invertedColorRamp(), "Get/set renderer inverted color ramp") renderer.setInvertedColorRamp(False) self.assertFalse(renderer.invertedColorRamp(), "Get/set renderer inverted color ramp") value = '"value"*2' exp = QgsSymbolLayerV2Utils.fieldOrExpressionToExpression(value) valuestr = QgsSymbolLayerV2Utils.fieldOrExpressionFromExpression(exp) renderer.setRotationField(value) self.assertEqual(valuestr, renderer.rotationField(), "Get/set renderer rotation field") value = '"value"*3' exp = QgsSymbolLayerV2Utils.fieldOrExpressionToExpression(value) valuestr = QgsSymbolLayerV2Utils.fieldOrExpressionFromExpression(exp) renderer.setSizeScaleField(value) self.assertEqual(valuestr, renderer.sizeScaleField(), "Get/set renderer size scale field") renderer.setSourceColorRamp(ramp) self.assertEqual(dumpColorRamp(ramp), dumpColorRamp(renderer.sourceColorRamp()), "Get/set renderer color ramp") for sm in ( QgsSymbolV2.ScaleArea, QgsSymbolV2.ScaleDiameter, ): renderer.setScaleMethod(sm) self.assertEqual(str(sm), str(renderer.scaleMethod()), "Get/set renderer scale method") # test for classificatio with varying size renderer.setGraduatedMethod(QgsGraduatedSymbolRendererV2.GraduatedSize) renderer.setSourceColorRamp(None) renderer.addClassLowerUpper(0, 2) renderer.addClassLowerUpper(2, 4) renderer.addClassLowerUpper(4, 6) renderer.setSymbolSizes(2, 13) self.assertEqual(renderer.maxSymbolSize(), 13) self.assertEqual(renderer.minSymbolSize(), 2) refSizes = [2, (13 + 2) * .5, 13] ctx = QgsRenderContext() for idx, symbol in enumerate(renderer.symbols(ctx)): self.assertEqual(symbol.size(), refSizes[idx])
def on_click_Carregar(self): global cur global conn global nomBD1 global contra1 global host1 global port1 global usuari1 llistaErrors = self.controlErrorsCarrega() if len(llistaErrors) != 0: llista = "Llista d'errors:\n\n" for i in range(0, len(llistaErrors)): llista += ("- " + llistaErrors[i] + '\n') QMessageBox.information(None, "Error", llista) return select = 'select * from "GTC_Update"."ControlActualitzacio";' try: cur.execute(select) vec = cur.fetchall() conn.commit() except Exception as e: print(e.message, e.args) print("ERROR select Control") if (vec[0][0]): label = "Actualment s'està modificant el GTC.\nIntrodueix la paraula clau per carregar la capa." val = self.on_click_CarregarAux(label) if val == '': return comprovarParaulaClau = vec[0][3] if (comprovarParaulaClau != val): QMessageBox.information(None, "Error", "La paraula clau no és la correcta.") return else: label = "Actualment NO s'està modificant el GTC.\nIntrodueix la paraula clau per carregar la capa." val = self.on_click_CarregarAux(label) if val == '': return update = 'update "GTC_Update"."ControlActualitzacio" set "modificant" = true;\n' update += 'update "GTC_Update"."ControlActualitzacio" set "usuariModificador" = \'' + val + '\';\n' update += 'update "GTC_Update"."ControlActualitzacio" set "horaModificacio" = CURRENT_TIMESTAMP;' try: cur.execute(update) conn.commit() except Exception as e: print(e.message, e.args) print("ERROR update Control (modificant, paraula clau)") if (not vec[0][1]): create = 'drop table if exists "GTC_Update"."UpdateGTC";\n' create += 'create table "GTC_Update"."UpdateGTC" as (select * from "SegmentsXarxaCarrers" order by id);\n' create += 'ALTER TABLE "GTC_Update"."UpdateGTC" DROP COLUMN id;\n' create += 'ALTER TABLE "GTC_Update"."UpdateGTC" ADD COLUMN id serial;\n' create += 'ALTER TABLE "GTC_Update"."UpdateGTC" ADD PRIMARY KEY (id);\n' try: cur.execute(create) conn.commit() except Exception as e: print("ERROR create GTC per actualitzar") print(e.message.encode('utf8', 'strict'), e.args.encode('utf8', 'strict')) select = 'select to_char("horaModificacio", \'DD/MM/YY HH24:MI\') from "GTC_Update"."ControlActualitzacio";' try: cur.execute(select) vec = cur.fetchall() conn.commit() except Exception as e: print(e.message, e.args) print("ERROR select Control") self.dlg.text_info.setText("Data de l'inici de la modificació: " + vec[0][0]) uri = QgsDataSourceUri() try: uri.setConnection(host1, port1, nomBD1, usuari1, contra1) except Exception as e: print(e.message, e.args) print("Error a la connexió") sql_total = 'select * from "GTC_Update"."UpdateGTC" order by id' QApplication.processEvents() uri.setDataSource("GTC_Update", "UpdateGTC", "the_geom", "", "") QApplication.processEvents() ''' # 13.2 Es prepara el titol de la capa que apareixerà a la llegenda ''' titol = "UpdateGTC" vlayer = QgsVectorLayer(uri.uri(False), titol, "postgres") QApplication.processEvents() if vlayer.isValid(): symbols = vlayer.renderer().symbols(QgsRenderContext()) symbol = symbols[0] '''S'afegeix el color a la nova entitat''' symbol.setColor(QColor.fromRgb(0, 0, 0)) QgsProject.instance().addMapLayer(vlayer, False) root = QgsProject.instance().layerTreeRoot() myLayerNode = QgsLayerTreeLayer(vlayer) root.insertChildNode(0, myLayerNode) myLayerNode.setCustomProperty("showFeatureCount", False) QApplication.processEvents() ''''S'afegeix la capa a la pantalla''' iface.mapCanvas().refresh() #qgis.utils.iface.legendInterface().refreshLayerSymbology(vlayer) else: print("No s'ha carregat la capa")
def testConvertToMapUnits(self): ms = QgsMapSettings() ms.setExtent(QgsRectangle(0, 0, 100, 100)) ms.setOutputSize(QSize(100, 50)) ms.setOutputDpi(300) r = QgsRenderContext.fromMapSettings(ms) # renderer scale should be about 1:291937841 # start with no min/max scale c = QgsMapUnitScale() size = r.convertToMapUnits(2, QgsUnitTypes.RenderMapUnits, c) self.assertEqual(size, 2.0) size = r.convertToMapUnits(2, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(size, 47.244094, places=5) size = r.convertToMapUnits(5.66929, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(size, 47.2440833, places=5) size = r.convertToMapUnits(5.66929, QgsUnitTypes.RenderInches, c) self.assertAlmostEqual(size, 3401.574, places=5) size = r.convertToMapUnits(2, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(size, 4.0, places=5) # minimum size greater than the calculated size, so size should be limited to minSizeMM c.minSizeMM = 5 c.minSizeMMEnabled = True size = r.convertToMapUnits(2, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(size, 118.1102362, places=5) # only conversion from mapunits should be affected size = r.convertToMapUnits(2, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(size, 47.244094, places=5) size = r.convertToMapUnits(5.66929, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(size, 47.2440833, places=5) size = r.convertToMapUnits(5.66929, QgsUnitTypes.RenderInches, c) self.assertAlmostEqual(size, 3401.574, places=5) size = r.convertToMapUnits(2, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(size, 4.0, places=5) c.minSizeMMEnabled = False # maximum size less than the calculated size, so size should be limited to maxSizeMM c.maxSizeMM = 0.05 c.maxSizeMMEnabled = True size = r.convertToMapUnits(2, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(size, 1.1811023622047245, places=5) # only conversion from mapunits should be affected size = r.convertToMapUnits(2, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(size, 47.244094, places=5) size = r.convertToMapUnits(5.66929, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(size, 47.2440833, places=5) size = r.convertToMapUnits(5.66929, QgsUnitTypes.RenderInches, c) self.assertAlmostEqual(size, 3401.574, places=5) size = r.convertToMapUnits(2, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(size, 4.0, places=5) c.maxSizeMMEnabled = False # test with minimum scale set c.minScale = 1 / 150000000.0 size = r.convertToMapUnits(2, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(size, 15.57001821, places=5) # only conversion from mapunits should be affected size = r.convertToMapUnits(2, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(size, 47.244094, places=5) size = r.convertToMapUnits(5.66929, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(size, 47.2440833, places=5) size = r.convertToMapUnits(5.66929, QgsUnitTypes.RenderInches, c) self.assertAlmostEqual(size, 3401.574, places=5) size = r.convertToMapUnits(2, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(size, 4.0, places=5) c.minScale = 0 # test with maximum scale set c.maxScale = 1 / 1550000000.0 size = r.convertToMapUnits(2, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(size, 1.50677595625, places=5) # only conversion from mapunits should be affected size = r.convertToMapUnits(2, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(size, 47.244094, places=5) size = r.convertToMapUnits(5.66929, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(size, 47.2440833, places=5) size = r.convertToMapUnits(5.66929, QgsUnitTypes.RenderInches, c) self.assertAlmostEqual(size, 3401.574, places=5) size = r.convertToMapUnits(2, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(size, 4.0, places=5) c.maxScale = 0
def writeLayersAndGroups(layers, groups, visible, folder, popup, settings, json, matchCRS, clustered, iface, restrictToExtent, extent): canvas = iface.mapCanvas() basemapList = settings["Appearance"]["Base layer"] basemaps = [basemapOL()[item] for _, item in enumerate(basemapList)] if len(basemapList) > 1: baseGroup = "Base maps" else: baseGroup = "" baseLayer = """var baseLayer = new ol.layer.Group({ 'title': '%s', layers: [%s\n] });""" % (baseGroup, ','.join(basemaps)) layerVars = "" layer_names_id = {} for count, (layer, encode2json, cluster) in enumerate(zip(layers, json, clustered)): layer_names_id[layer.id()] = str(count) try: if is25d(layer, canvas, restrictToExtent, extent): pass else: layerVars += "\n".join([layerToJavascript(iface, layer, encode2json, matchCRS, cluster, restrictToExtent, extent, count)]) except: try: layerVars += "\n".join([layerToJavascript(iface, layer, encode2json, matchCRS, cluster, restrictToExtent, extent, count)]) except: pass groupVars = "" groupedLayers = {} for group, groupLayers in groups.iteritems(): groupLayerObjs = "" for layer in groupLayers: try: if isinstance(layer, TileLayer): continue except: pass groupLayerObjs += ("lyr_" + safeName(layer.name()) + layer_names_id[layer.id()] + ",") groupVars += ('''var %s = new ol.layer.Group({ layers: [%s], title: "%s"});\n''' % ("group_" + safeName(group), groupLayerObjs, group)) for layer in groupLayers: groupedLayers[layer.id()] = safeName(group) mapLayers = ["baseLayer"] usedGroups = [] osmb = "" for count, layer in enumerate(layers): try: renderer = layer.rendererV2() if is25d(layer, canvas, restrictToExtent, extent): shadows = "" renderer = layer.rendererV2() renderContext = QgsRenderContext.fromMapSettings( canvas.mapSettings()) fields = layer.pendingFields() renderer.startRender(renderContext, fields) for feat in layer.getFeatures(): if isinstance(renderer, QgsCategorizedSymbolRendererV2): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) catIndex = renderer.categoryIndexForValue(attrValue) categories = renderer.categories() symbol = categories[catIndex].symbol() elif isinstance(renderer, QgsGraduatedSymbolRendererV2): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) ranges = renderer.ranges() for range in ranges: if (attrValue >= range.lowerValue() and attrValue <= range.upperValue()): symbol = range.symbol().clone() else: symbol = renderer.symbolForFeature2(feat, renderContext) symbolLayer = symbol.symbolLayer(0) if not symbolLayer.paintEffect().effectList()[0].enabled(): shadows = "'2015-07-15 10:00:00'" renderer.stopRender(renderContext) osmb = """ var osmb = new OSMBuildings(map).date(new Date({shadows})); osmb.set(json_{sln}{count});""".format(shadows=shadows, sln=safeName(layer.name()), count=unicode(count)) else: try: if not isinstance(layer, TileLayer): mapLayers.append("lyr_" + safeName(layer.name()) + unicode(count)) except: mapLayers.append("lyr_" + safeName(layer.name()) + unicode(count)) except: QgsMessageLog.logMessage(traceback.format_exc(), "qgis2web", level=QgsMessageLog.CRITICAL) try: if not isinstance(layer, TileLayer): mapLayers.append("lyr_" + safeName(layer.name()) + unicode(count)) except: mapLayers.append("lyr_" + safeName(layer.name()) + unicode(count)) visibility = "" for layer, v in zip(mapLayers[1:], visible): visibility += "\n".join(["%s.setVisible(%s);" % (layer, unicode(v).lower())]) group_list = ["baseLayer"] if len(basemapList) else [] no_group_list = [] for count, layer in enumerate(layers): try: if is25d(layer, canvas, restrictToExtent, extent): pass else: if layer.id() in groupedLayers: groupName = groupedLayers[layer.id()] if groupName not in usedGroups: group_list.append("group_" + safeName(groupName)) usedGroups.append(groupName) else: no_group_list.append("lyr_" + safeName(layer.name()) + unicode(count)) except: if layer.id() in groupedLayers: groupName = groupedLayers[layer.id()] if groupName not in usedGroups: group_list.append("group_" + safeName(groupName)) usedGroups.append(groupName) else: no_group_list.append("lyr_" + safeName(layer.name()) + unicode(count)) layersList = [] for layer in (group_list + no_group_list): layersList.append(layer) layersListString = "var layersList = [" + ",".join(layersList) + "];" fieldAliases = "" fieldImages = "" fieldLabels = "" blend_mode = "" for count, (layer, labels) in enumerate(zip(layers, popup)): sln = safeName(layer.name()) + unicode(count) if layer.type() == layer.VectorLayer and not is25d(layer, canvas, restrictToExtent, extent): fieldList = layer.pendingFields() aliasFields = "" imageFields = "" labelFields = "" for field, label in zip(labels.keys(), labels.values()): labelFields += "'%(field)s': '%(label)s', " % ( {"field": field, "label": label}) labelFields = "{%(labelFields)s});\n" % ( {"labelFields": labelFields}) labelFields = "lyr_%(name)s.set('fieldLabels', " % ( {"name": sln}) + labelFields fieldLabels += labelFields for f in fieldList: fieldIndex = fieldList.indexFromName(unicode(f.name())) aliasFields += "'%(field)s': '%(alias)s', " % ( {"field": f.name(), "alias": layer.attributeDisplayName(fieldIndex)}) widget = layer.editFormConfig().widgetType(fieldIndex) imageFields += "'%(field)s': '%(image)s', " % ( {"field": f.name(), "image": widget}) aliasFields = "{%(aliasFields)s});\n" % ( {"aliasFields": aliasFields}) aliasFields = "lyr_%(name)s.set('fieldAliases', " % ( {"name": sln}) + aliasFields fieldAliases += aliasFields imageFields = "{%(imageFields)s});\n" % ( {"imageFields": imageFields}) imageFields = "lyr_%(name)s.set('fieldImages', " % ( {"name": sln}) + imageFields fieldImages += imageFields blend_mode = """lyr_%(name)s.on('precompose', function(evt) { evt.context.globalCompositeOperation = '%(blend)s'; });""" % ( {"name": sln, "blend": BLEND_MODES[layer.blendMode()]}) path = os.path.join(folder, "layers", "layers.js") with codecs.open(path, "w", "utf-8") as f: if basemapList: f.write(baseLayer + "\n") f.write(layerVars + "\n") f.write(groupVars + "\n") f.write(visibility + "\n") f.write(layersListString + "\n") f.write(fieldAliases) f.write(fieldImages) f.write(fieldLabels) f.write(blend_mode) return osmb
def testCopyConstructor(self): """ Test the copy constructor """ c1 = QgsRenderContext() c1.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysText) c1.setMapExtent(QgsRectangle(1, 2, 3, 4)) c2 = QgsRenderContext(c1) self.assertEqual(c2.textRenderFormat(), QgsRenderContext.TextFormatAlwaysText) self.assertEqual(c2.mapExtent(), QgsRectangle(1, 2, 3, 4)) c1.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysOutlines) c2 = QgsRenderContext(c1) self.assertEqual(c2.textRenderFormat(), QgsRenderContext.TextFormatAlwaysOutlines) c1.setIsTemporal(True) c1.setTemporalRange( QgsDateTimeRange(QDateTime(2020, 1, 1, 0, 0), QDateTime(2010, 12, 31, 23, 59))) c2 = QgsRenderContext(c1) self.assertEqual(c2.isTemporal(), True) self.assertEqual( c2.temporalRange(), QgsDateTimeRange(QDateTime(2020, 1, 1, 0, 0), QDateTime(2010, 12, 31, 23, 59)))
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 testRenderedFeatureHandlers(self): rc = QgsRenderContext() self.assertFalse(rc.renderedFeatureHandlers()) self.assertFalse(rc.hasRenderedFeatureHandlers()) ms = QgsMapSettings() rc = QgsRenderContext.fromMapSettings(ms) self.assertFalse(rc.renderedFeatureHandlers()) self.assertFalse(rc.hasRenderedFeatureHandlers()) handler = TestFeatureHandler() handler2 = TestFeatureHandler() ms.addRenderedFeatureHandler(handler) ms.addRenderedFeatureHandler(handler2) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.renderedFeatureHandlers(), [handler, handler2]) self.assertTrue(rc.hasRenderedFeatureHandlers()) rc2 = QgsRenderContext(rc) self.assertEqual(rc2.renderedFeatureHandlers(), [handler, handler2]) self.assertTrue(rc2.hasRenderedFeatureHandlers())
def testVectorSimplification(self): """ Test vector simplification hints, ensure they are copied correctly from map settings """ rc = QgsRenderContext() self.assertEqual(rc.vectorSimplifyMethod().simplifyHints(), QgsVectorSimplifyMethod.NoSimplification) ms = QgsMapSettings() rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.vectorSimplifyMethod().simplifyHints(), QgsVectorSimplifyMethod.NoSimplification) rc2 = QgsRenderContext(rc) self.assertEqual(rc2.vectorSimplifyMethod().simplifyHints(), QgsVectorSimplifyMethod.NoSimplification) method = QgsVectorSimplifyMethod() method.setSimplifyHints(QgsVectorSimplifyMethod.GeometrySimplification) ms.setSimplifyMethod(method) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.vectorSimplifyMethod().simplifyHints(), QgsVectorSimplifyMethod.GeometrySimplification) rc2 = QgsRenderContext(rc) self.assertEqual(rc2.vectorSimplifyMethod().simplifyHints(), QgsVectorSimplifyMethod.GeometrySimplification)
def testCustomRenderingFlags(self): rc = QgsRenderContext() rc.setCustomRenderingFlag('myexport', True) rc.setCustomRenderingFlag('omitgeometries', 'points') self.assertTrue(rc.customRenderingFlags()['myexport']) self.assertEqual(rc.customRenderingFlags()['omitgeometries'], 'points') # test that custom flags are correctly copied from settings settings = QgsMapSettings() settings.setCustomRenderingFlag('myexport', True) settings.setCustomRenderingFlag('omitgeometries', 'points') rc = QgsRenderContext.fromMapSettings(settings) self.assertTrue(rc.customRenderingFlags()['myexport']) self.assertEqual(rc.customRenderingFlags()['omitgeometries'], 'points')
def testConvertToPainterUnits(self): # test QgsSymbolLayerUtils::convertToPainterUnits() using QgsMapUnitScale ms = QgsMapSettings() ms.setExtent(QgsRectangle(0, 0, 100, 100)) ms.setOutputSize(QSize(100, 50)) ms.setOutputDpi(300) r = QgsRenderContext.fromMapSettings(ms) # renderer scale should be about 1:291937841 # start with no min/max scale c = QgsMapUnitScale() size = QgsSymbolLayerUtils.convertToPainterUnits( r, 2, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(size, 1.0, places=5) size = QgsSymbolLayerUtils.convertToPainterUnits( r, 2, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(size, 23.622047, places=5) size = QgsSymbolLayerUtils.convertToPainterUnits( r, 2, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(size, 66.9601332, places=5) size = QgsSymbolLayerUtils.convertToPainterUnits( r, 2, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(size, 2.0, places=5) # minimum size greater than the calculated size, so size should be limited to minSizeMM c.minSizeMM = 5 c.minSizeMMEnabled = True size = QgsSymbolLayerUtils.convertToPainterUnits( r, 2, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(size, 59.0551181, places=5) # only conversion from mapunits should be affected size = QgsSymbolLayerUtils.convertToPainterUnits( r, 2, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(size, 23.622047, places=5) size = QgsSymbolLayerUtils.convertToPainterUnits( r, 2, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(size, 66.9601332, places=5) size = QgsSymbolLayerUtils.convertToPainterUnits( r, 2, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(size, 2.0, places=5) c.minSizeMMEnabled = False # maximum size less than the calculated size, so size should be limited to maxSizeMM c.maxSizeMM = 0.1 c.maxSizeMMEnabled = True size = QgsSymbolLayerUtils.convertToPainterUnits( r, 2, QgsUnitTypes.RenderMapUnits, c) self.assertAlmostEqual(size, 1.0, places=5) # only conversion from mapunits should be affected size = QgsSymbolLayerUtils.convertToPainterUnits( r, 2, QgsUnitTypes.RenderMillimeters, c) self.assertAlmostEqual(size, 23.622047, places=5) size = QgsSymbolLayerUtils.convertToPainterUnits( r, 2, QgsUnitTypes.RenderPoints, c) self.assertAlmostEqual(size, 66.9601332, places=5) size = QgsSymbolLayerUtils.convertToPainterUnits( r, 2, QgsUnitTypes.RenderPixels, c) self.assertAlmostEqual(size, 2.0, places=5)
def apply_masks(self, layer_bound): layers = QgsProject.instance().mapLayers().values() mask_dict = {} #Creating symbol layer reference list grid_symbol_ref_list = [] renderer = layer_bound.renderer() grid_symbol_rule_id = renderer.rootRule().children()[0].ruleKey() layer_id = layer_bound.id() symbol_list = renderer.symbols(QgsRenderContext()) symbol_layer_list = symbol_list[0].symbolLayers() for smb in range(1, len(symbol_layer_list)): idx_list = [] idx_list.append(smb) idx_list.append(0) symbol_id = QgsSymbolLayerId(grid_symbol_rule_id, idx_list) temp = QgsSymbolLayerReference(layer_id, symbol_id) grid_symbol_ref_list.append(temp) #Listing available label masks for layer in layers: if not layer.type() == QgsMapLayer.VectorLayer: continue labels = layer.labeling() if not labels: continue providers = [] if isinstance(labels, QgsVectorLayerSimpleLabeling): providers.append('--SINGLE--RULE--') if isinstance(labels, QgsRuleBasedLabeling): providers = [x.ruleKey() for x in labels.rootRule().children()] for provider in providers: if provider == '--SINGLE--RULE--': label_settings = labels.settings() else: label_settings = labels.settings(provider) label_format = label_settings.format() masks = label_format.mask() if not masks.enabled(): continue #Applying available lable masks to grid layer symbology mask_symbol_list = masks.maskedSymbolLayers() new_symbol_mask = [] for item in mask_symbol_list: if item.layerId() == layer_id: continue new_symbol_mask.append(item) for item in grid_symbol_ref_list: new_symbol_mask.append(item) masks.setMaskedSymbolLayers(new_symbol_mask) label_format.setMask(masks) label_settings.setFormat(label_format) if provider == '--SINGLE--RULE--': labels.setSettings(label_settings) else: labels.setSettings(label_settings, provider) layer.setLabeling(labels) return
def testRenderWithTransform(self): layer = QgsAnnotationLayer( 'test', QgsAnnotationLayer.LayerOptions( QgsProject.instance().transformContext())) self.assertTrue(layer.isValid()) item = QgsAnnotationPolygonItem( QgsPolygon( QgsLineString([ QgsPoint(11.5, 13), QgsPoint(12, 13), QgsPoint(12, 13.5), QgsPoint(11.5, 13) ]))) item.setSymbol( QgsFillSymbol.createSimple({ 'color': '200,100,100', 'outline_color': 'black', 'outline_width': '2' })) item.setZIndex(1) layer.addItem(item) item = QgsAnnotationLineItem( QgsLineString( [QgsPoint(11, 13), QgsPoint(12, 13), QgsPoint(12, 15)])) item.setSymbol( QgsLineSymbol.createSimple({ 'color': '#ffff00', 'line_width': '3' })) item.setZIndex(2) layer.addItem(item) item = QgsAnnotationMarkerItem(QgsPoint(12, 13)) item.setSymbol( QgsMarkerSymbol.createSimple({ 'color': '100,200,200', 'size': '6', 'outline_color': 'black' })) item.setZIndex(3) layer.addItem(item) layer.setCrs(QgsCoordinateReferenceSystem('EPSG:4326')) settings = QgsMapSettings() settings.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:3857')) settings.setExtent(QgsRectangle(1250958, 1386945, 1420709, 1532518)) settings.setOutputSize(QSize(300, 300)) settings.setFlag(QgsMapSettings.Antialiasing, False) rc = QgsRenderContext.fromMapSettings(settings) rc.setCoordinateTransform( QgsCoordinateTransform(layer.crs(), settings.destinationCrs(), QgsProject.instance())) image = QImage(200, 200, QImage.Format_ARGB32) image.setDotsPerMeterX(96 / 25.4 * 1000) image.setDotsPerMeterY(96 / 25.4 * 1000) image.fill(QColor(255, 255, 255)) painter = QPainter(image) rc.setPainter(painter) try: renderer = layer.createMapRenderer(rc) renderer.render() finally: painter.end() self.assertTrue( self.imageCheck('layer_render_transform', 'layer_render_transform', image))
def getMatchingFeatures(self, geometry, contains, singleSelect): newFeatures = [] if geometry.type() != QgsWkbTypes.PolygonGeometry: return newFeatures layer = self.canvas.currentLayer() if layer is None: return newFeatures selectGeomTrans = QgsGeometry(geometry) try: ct = QgsCoordinateTransform(self.canvas.mapSettings().destinationCrs(), layer.crs(), QgsProject.instance()) if not ct.isShortCircuited() and selectGeomTrans.type() == QgsWkbTypes.PolygonGeometry: poly = selectGeomTrans.asPolygon() if len(poly) == 1 and len(poly[0]) == 5: ringIn = poly[0] ringOut = [] ringOut.append(ringIn[0]) i = 1 for j in range(1, 5): v = QgsVector((ringIn[j] - ringIn[j - 1]) / 10.0) for k in range(9): ringOut.append(ringOut[i - 1] + v) i += 1 ringOut.append(ringIn[j]) i += 1 selectGeomTrans = QgsGeometry.fromPolygonXY([ringOut]) selectGeomTrans.transform(ct) except QgsCsException as e: QgsMessageLog.logMessage("Selection extends beyond layer's coordinate system") return newFeatures context = QgsRenderContext.fromMapSettings(self.canvas.mapSettings()) context.expressionContext().appendScope(QgsExpressionContextUtils.layerScope(layer)) r = None if layer.renderer(): r = layer.renderer().clone() r.startRender(context, layer.fields()) request = QgsFeatureRequest() request.setFilterRect(selectGeomTrans.boundingBox()) request.setFlags(QgsFeatureRequest.ExactIntersect) if r: request.setSubsetOfAttributes(r.usedAttributes(context), layer.fields()) else: request.setSubsetOfAttributes([]) closestFeatureId = 0 foundSingleFeature = False closestFeatureDist = sys.float_info.max for f in layer.getFeatures(request): context.expressionContext().setFeature(f) if r and not r.willRenderFeature(f, context): continue g = f.geometry() if contains: if not selectGeomTrans.contains(g): continue else: if not selectGeomTrans.intersects(g): continue if singleSelect: foundSingleFeature = True distance = g.distance(selectGeomTrans) if distance <= closestFeatureDist: closestFeatureDist = distance closestFeatureId = f.id() else: newFeatures.append(f.id()) if singleSelect and foundSingleFeature: newFeatures.append(closestFeatureId) if r: r.stopRender(context) return newFeatures
def on_click_Inici(self): llistaErrors = self.controlErrorsValida() if len(llistaErrors) != 0: llista = "Llista d'errors:\n\n" for i in range(0, len(llistaErrors)): llista += ("- " + llistaErrors[i] + '\n') QMessageBox.information(None, "Error", llista) return textBox = 'INICI DEL PROCÉS DE VALIDACIÓ:\n' textBox += 'Elminació dels vertex:' self.dlg.text_info.setText(textBox) self.MouText() QApplication.processEvents() conta_errors = 0 self.barraEstat_processant() drop = 'DROP TABLE IF EXISTS "GTC_Update"."UpdateGTC_vertices_pgr";' try: cur.execute(drop) conn.commit() except Exception as e: print("ERROR drop vertexs GTC per actualitzar") self.barraEstat_connectat() print(e.message, e.args) textBox += '...OK\n' textBox += 'Creació d\'una nova topologia' self.dlg.text_info.setText(textBox) self.MouText() QApplication.processEvents() create = 'select pgr_createTopology(\'GTC_Update.UpdateGTC\', 0.001,clean:=true);' try: cur.execute(create) vec = cur.fetchall() conn.commit() if vec[0][0] != 'OK': QMessageBox.information( None, "Error", "No s'ha creat la topologia correctament.") print(vec) return except Exception as e: self.barraEstat_connectat() print("ERROR create vertexs GTC per actualitzar") print(e.message, e.args) textBox += '...OK\n' textBox += 'Comprovació de la nova topologia' self.dlg.text_info.setText(textBox) self.MouText() QApplication.processEvents() create = 'SELECT pgr_analyzeGraph(\'GTC_Update.UpdateGTC\', 0.001);' try: cur.execute(create) vec = cur.fetchall() conn.commit() if vec[0][0] != 'OK': QMessageBox.information( None, "Error", "S'ha detectat un error a la topologia.") self.barraEstat_connectat() return except Exception as e: self.barraEstat_connectat() print("ERROR create vertexs GTC per actualitzar") print(e.message, e.args) textBox += '...OK\n' textBox += 'Comprovació dels punts amb possibles errors: ' self.dlg.text_info.setText(textBox) self.MouText() QApplication.processEvents() select = 'SELECT * FROM "GTC_Update"."UpdateGTC_vertices_pgr" WHERE chk = 1;' try: cur.execute(select) vec = cur.fetchall() conn.commit() if (len(vec) != 0): uri = QgsDataSourceUri() try: uri.setConnection(host1, port1, nomBD1, usuari1, contra1) except: print("Error a la connexio") select = 'SELECT * FROM "GTC_Update"."UpdateGTC_vertices_pgr" WHERE chk = 1' QApplication.processEvents() uri.setDataSource("", "(" + select + ")", "the_geom", "", "id") QApplication.processEvents() ''' # 13.2 Es prepara el titol de la capa que apareixerà a la llegenda ''' titol = "Nodes a revisar" vlayer = QgsVectorLayer(uri.uri(False), titol, "postgres") QApplication.processEvents() if vlayer.isValid(): symbols = vlayer.renderer().symbols(QgsRenderContext()) symbol = symbols[0] '''S'afegeix el color a la nova entitat''' symbol.setColor(QColor.fromRgb(255, 0, 0)) QgsProject.instance().addMapLayer(vlayer, False) root = QgsProject.instance().layerTreeRoot() myLayerNode = QgsLayerTreeLayer(vlayer) root.insertChildNode(0, myLayerNode) myLayerNode.setCustomProperty("showFeatureCount", False) QApplication.processEvents() ''''S'afegeix la capa a la pantalla''' iface.mapCanvas().refresh() #qgis.utils.iface.legendInterface().refreshLayerSymbology(vlayer) else: print("No s'ha carregat la capa de punts") self.barraEstat_connectat() QApplication.processEvents() textBox += 'S\'ha(n) detectat ' + str( len(vec)) + ' punt(s) amb possibles errades.\n' self.dlg.text_info.setText(textBox) self.MouText() QApplication.processEvents() return except Exception as e: self.barraEstat_connectat() print("ERROR create vertexs GTC per actualitzar") print(e.message[0].decode('utf8'), e.args) return textBox += 'No s\'han detectat errades.\n' textBox += 'Detecció de trams aïllats: ' self.dlg.text_info.setText(textBox) self.MouText() QApplication.processEvents() select = 'SELECT a.* FROM "GTC_Update"."UpdateGTC" a, "GTC_Update"."UpdateGTC_vertices_pgr" b, "GTC_Update"."UpdateGTC_vertices_pgr" c WHERE a.source=b.id AND b.cnt=1 AND a.target=c.id AND c.cnt=1;' try: cur.execute(select) vec = cur.fetchall() conn.commit() if (len(vec) != 0): uri = QgsDataSourceUri() try: uri.setConnection(host1, port1, nomBD1, usuari1, contra1) except: print("Error a la connexio") select = 'SELECT a.* FROM "GTC_Update"."UpdateGTC" a, "GTC_Update"."UpdateGTC_vertices_pgr" b, "GTC_Update"."UpdateGTC_vertices_pgr" c WHERE a.source=b.id AND b.cnt=1 AND a.target=c.id AND c.cnt=1' QApplication.processEvents() uri.setDataSource("", "(" + select + ")", "the_geom", "", "id") QApplication.processEvents() ''' # 13.2 Es prepara el titol de la capa que apareixerà a la llegenda ''' titol = "Trams sense connectivitat a revisar" vlayer = QgsVectorLayer(uri.uri(False), titol, "postgres") QApplication.processEvents() if vlayer.isValid(): symbols = vlayer.renderer().symbols(QgsRenderContext()) symbol = symbols[0] '''S'afegeix el color a la nova entitat''' symbol.setColor(QColor.fromRgb(255, 0, 0)) symbol.setWidth(1) QgsProject.instance().addMapLayer(vlayer, False) root = QgsProject.instance().layerTreeRoot() myLayerNode = QgsLayerTreeLayer(vlayer) root.insertChildNode(0, myLayerNode) myLayerNode.setCustomProperty("showFeatureCount", False) QApplication.processEvents() ''''S'afegeix la capa a la pantalla''' iface.mapCanvas().refresh() #qgis.utils.iface.legendInterface().refreshLayerSymbology(vlayer) else: print("No s'ha carregat la capa de segments aïllats") self.barraEstat_connectat() QApplication.processEvents() textBox += 'S\'ha(n) detectat ' + str( len(vec)) + ' tram(s) aïllat(s).\n' self.dlg.text_info.setText(textBox) self.MouText() QApplication.processEvents() return except Exception as e: self.barraEstat_connectat() print("ERROR Segments aillats") print(e.message, e.args) return textBox += 'No s\'han detectat segments aïllats.\n' self.dlg.text_info.setText(textBox) self.MouText() QApplication.processEvents() #============================================== # 1. LINIES AMB DOS PUNTS I CAMP SOURCE #============================================== self.barraEstat_processant() sql_xarxa = 'select distinct(R.id) id,R.source Vertex, camp from (select S."the_geom",S."id",st_x(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_startpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr")) union ' sql_xarxa += 'select S."the_geom",S."id",st_x(st_endpoint(S."the_geom")),S."target", \'T\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_endpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union ' sql_xarxa += 'select S."the_geom",S."id",st_y(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_startpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union ' sql_xarxa += 'select S."the_geom",S."id",st_y(st_endpoint(S."the_geom")),S."target",\'T\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_endpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )))R where (ST_NPoints(R.the_geom)=2 and R.camp=\'S\') order by R.id,R.source;' #print sql_xarxa try: cur.execute(sql_xarxa) vec = cur.fetchall() conta_errors += len(vec) #print str(len(vec)) for x in range(0, len(vec)): sql_1 = 'select "source","target" from "GTC_Update"."UpdateGTC" where "id"=' + str( vec[x][0]) + ';' cur.execute(sql_1) vec2 = cur.fetchall() update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_AddPoint(the_geom, (select "the_geom" from "GTC_Update"."UpdateGTC_vertices_pgr" where id=' + str( vec2[0][1]) + '),1) WHERE "id"=' + str(vec[x][0]) + ';' cur.execute(update) conn.commit() update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_RemovePoint(the_geom, 0) WHERE "id"=' + str( vec[x][0]) + ';' cur.execute(update) conn.commit() update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_AddPoint(the_geom, (select "the_geom" from "GTC_Update"."UpdateGTC_vertices_pgr" where id=' + str( vec2[0][0]) + '),0) WHERE "id"=' + str(vec[x][0]) + ';' cur.execute(update) conn.commit() update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_RemovePoint(the_geom, ST_NPoints(the_geom) - 1) WHERE "id"=' + str( vec[x][0]) + ';' cur.execute(update) conn.commit() except Exception as e: print(e.message, e.args) print("ERROR SQL_XARXA") #============================================== # 2. LINIES AMB DOS PUNTS I CAMP TARGET #============================================== sql_xarxa = 'select distinct(R.id) id,R.source Vertex, camp from (select S."the_geom",S."id",st_x(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_startpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr")) union ' sql_xarxa += 'select S."the_geom",S."id",st_x(st_endpoint(S."the_geom")),S."target", \'T\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_endpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union ' sql_xarxa += 'select S."the_geom",S."id",st_y(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_startpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union ' sql_xarxa += 'select S."the_geom",S."id",st_y(st_endpoint(S."the_geom")),S."target",\'T\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_endpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )))R where (ST_NPoints(R.the_geom)=2 and R.camp=\'T\') order by R.id,R.source;' #print sql_xarxa try: cur.execute(sql_xarxa) vec = cur.fetchall() conta_errors += len(vec) #print str(len(vec)) for x in range(0, len(vec)): sql_1 = 'select "source","target" from "GTC_Update"."UpdateGTC" where "id"=' + str( vec[x][0]) + ';' cur.execute(sql_1) vec2 = cur.fetchall() update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_AddPoint(the_geom, (select "the_geom" from "GTC_Update"."UpdateGTC_vertices_pgr" where id=' + str( vec2[0][0]) + '),0) WHERE "id"=' + str(vec[x][0]) + ';' cur.execute(update) conn.commit() update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_RemovePoint(the_geom, ST_NPoints(the_geom) - 1) WHERE "id"=' + str( vec[x][0]) + ';' cur.execute(update) conn.commit() update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_AddPoint(the_geom, (select "the_geom" from "GTC_Update"."UpdateGTC_vertices_pgr" where id=' + str( vec2[0][1]) + '),ST_NPoints(the_geom)) WHERE "id"=' + str( vec[x][0]) + ';' cur.execute(update) conn.commit() update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_RemovePoint(the_geom, 0) WHERE "id"=' + str( vec[x][0]) + ';' cur.execute(update) conn.commit() except Exception as e: print(e.message, e.args) print("ERROR SQL_XARXA") #============================================== # 3. LINIES AMB MES DE DOS PUNTS I CAMP SOURCE #============================================== sql_xarxa = 'select distinct(R.id) id,R.source Vertex, camp from (select S."the_geom",S."id",st_x(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_startpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr")) union ' sql_xarxa += 'select S."the_geom",S."id",st_x(st_endpoint(S."the_geom")),S."target", \'T\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_endpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union ' sql_xarxa += 'select S."the_geom",S."id",st_y(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_startpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union ' sql_xarxa += 'select S."the_geom",S."id",st_y(st_endpoint(S."the_geom")),S."target",\'T\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_endpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )))R where (ST_NPoints(R.the_geom)<>2 and R.camp=\'S\') order by R.id,R.source;' #print sql_xarxa try: cur.execute(sql_xarxa) vec = cur.fetchall() conta_errors += len(vec) #print str(len(vec)) for x in range(0, len(vec)): sql_1 = 'select "source","target" from "GTC_Update"."UpdateGTC" where "id"=' + str( vec[x][0]) + ';' cur.execute(sql_1) vec2 = cur.fetchall() update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_RemovePoint(the_geom, 0) WHERE "id"=' + str( vec[x][0]) + ';' cur.execute(update) conn.commit() update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_AddPoint(the_geom, (select "the_geom" from "GTC_Update"."UpdateGTC_vertices_pgr" where id=' + str( vec2[0][0]) + '),0) WHERE "id"=' + str(vec[x][0]) + ';' cur.execute(update) conn.commit() except Exception as e: print(e.message, e.args) print("ERROR SQL_XARXA") #============================================== # 4. LINIES AMB MES DE DOS PUNTS I CAMP TARGET #============================================== sql_xarxa = 'select distinct(R.id) id,R.source Vertex, camp from (select S."the_geom",S."id",st_x(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_startpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr")) union ' sql_xarxa += 'select S."the_geom",S."id",st_x(st_endpoint(S."the_geom")),S."target", \'T\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_endpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union ' sql_xarxa += 'select S."the_geom",S."id",st_y(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_startpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union ' sql_xarxa += 'select S."the_geom",S."id",st_y(st_endpoint(S."the_geom")),S."target",\'T\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_endpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )))R where (ST_NPoints(R.the_geom)<>2 and R.camp=\'T\') order by R.id,R.source;' #print sql_xarxa try: cur.execute(sql_xarxa) vec = cur.fetchall() conta_errors += len(vec) #print str(len(vec)) for x in range(0, len(vec)): sql_1 = 'select "source","target" from "GTC_Update"."UpdateGTC" where "id"=' + str( vec[x][0]) + ';' cur.execute(sql_1) vec2 = cur.fetchall() update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_RemovePoint(the_geom, ST_NPoints(the_geom) - 1) WHERE "id"=' + str( vec[x][0]) + ';' cur.execute(update) conn.commit() update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_AddPoint(the_geom, (select "the_geom" from "GTC_Update"."UpdateGTC_vertices_pgr" where id=' + str( vec2[0][1]) + '),ST_NPoints(the_geom)) WHERE "id"=' + str( vec[x][0]) + ';' cur.execute(update) conn.commit() except Exception as e: print(e.message, e.args) print("ERROR SQL_XARXA") if conta_errors != 0: llista = "Errors trobats i reparats:" llista += (' ' + str(conta_errors) + '\n') else: llista = "No s'han detectat errors\n" textBox += llista self.dlg.text_info.setText(textBox) self.MouText() #UPDATE CAMPS DE CONTROL update = 'UPDATE "GTC_Update"."ControlActualitzacio" set modificant = false, modificat=true, "horaModificacio" = NULL, "usuariModificador" = NULL;' try: cur.execute(update) conn.commit() html = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:\'MS Shell Dlg 2\'; font-size:10pt; font-weight:400; font-style:normal;"><div style=\"align:center\"><span style=\"background:#00FF00;font-size:14pt\">GRAF VALIDAT!<\span><\div></body></html>' self.dlg.text_info.insertHtml(html) self.MouText() except Exception as e: print(e.message, e.args) print( "ERROR update Control (modificant,modificat, paraula clau, timestamp" ) self.barraEstat_connectat()
def testTemporalState(self): rc = QgsRenderContext() self.assertEqual(rc.isTemporal(), False) self.assertIsNotNone(rc.temporalRange())
def testGettersSetters(self): """ Basic getter/setter tests """ c = QgsRenderContext() c.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysText) self.assertEqual(c.textRenderFormat(), QgsRenderContext.TextFormatAlwaysText) c.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysOutlines) self.assertEqual(c.textRenderFormat(), QgsRenderContext.TextFormatAlwaysOutlines) c.setMapExtent(QgsRectangle(1, 2, 3, 4)) self.assertEqual(c.mapExtent(), QgsRectangle(1, 2, 3, 4)) self.assertTrue(c.zRange().isInfinite()) c.setZRange(QgsDoubleRange(1, 10)) self.assertEqual(c.zRange(), QgsDoubleRange(1, 10))
def testUsedAttributes(self): layer, renderer, mapsettings = self._setUp() ctx = QgsRenderContext.fromMapSettings(mapsettings) self.assertCountEqual(renderer.usedAttributes(ctx), {})
def processAlgorithm(self, parameters, context, feedback): self.parameters = parameters self.context = context self.feedback = feedback filename = self.parameterAsFileOutput(parameters, self.PrmOutputKmz, context) source = self.parameterAsSource(parameters, self.PrmInputLayer, context) # Before we go further check to make sure we have a valid vector layer wkbtype = source.wkbType() geomtype = QgsWkbTypes.geometryType(wkbtype) if geomtype == QgsWkbTypes.UnknownGeometry or geomtype == QgsWkbTypes.NullGeometry: raise QgsProcessingException( 'Algorithm input is not a valid point, line, or polygon layer.' ) layer = self.parameterAsLayer(parameters, self.PrmInputLayer, context) if self.PrmNameField not in parameters or parameters[ self.PrmNameField] is None: name_field = None else: name_field = self.parameterAsString(parameters, self.PrmNameField, context) desc_fields = self.parameterAsFields(parameters, self.PrmDescriptionField, context) desc_cnt = len(desc_fields) export_style = self.parameterAsInt(parameters, self.PrmExportStyle, context) if self.PrmUseGoogleIcon not in parameters or parameters[ self.PrmUseGoogleIcon] is None: google_icon = None else: google_icon = self.parameterAsEnum(parameters, self.PrmUseGoogleIcon, context) self.line_width_factor = self.parameterAsDouble( parameters, self.PrmLineWidthFactor, context) alt_interpret = self.parameterAsEnum(parameters, self.PrmAltitudeInterpretation, context) if self.PrmAltitudeMode not in parameters or parameters[ self.PrmAltitudeMode] is None: default_alt_mode = None else: default_alt_mode = ALTITUDE_MODES[self.parameterAsEnum( parameters, self.PrmAltitudeMode, context)] alt_mode_field = self.parameterAsString(parameters, self.PrmAltitudeModeField, context) altitude_field = self.parameterAsString(parameters, self.PrmAltitudeField, context) altitude_addend = self.parameterAsDouble(parameters, self.PrmAltitudeAddend, context) date_time_stamp_field = self.parameterAsString( parameters, self.PrmDateTimeStampField, context) date_stamp_field = self.parameterAsString(parameters, self.PrmDateStampField, context) time_stamp_field = self.parameterAsString(parameters, self.PrmTimeStampField, context) date_time_begin_field = self.parameterAsString( parameters, self.PrmDateTimeBeginField, context) date_begin_field = self.parameterAsString(parameters, self.PrmDateBeginField, context) time_begin_field = self.parameterAsString(parameters, self.PrmTimeBeginField, context) date_time_end_field = self.parameterAsString(parameters, self.PrmDateTimeEndField, context) date_end_field = self.parameterAsString(parameters, self.PrmDateEndField, context) time_end_field = self.parameterAsString(parameters, self.PrmTimeEndField, context) if self.PrmPhotoField not in parameters or parameters[ self.PrmPhotoField] is None: photo_path_field = None else: photo_path_field = self.parameterAsString(parameters, self.PrmPhotoField, context) self.photos = {} hasz = QgsWkbTypes.hasZ(wkbtype) if alt_interpret == 0: hasz = False default_alt_mode = None alt_mode_field = None altitude_field = None elif alt_interpret == 2: hasz = False src_crs = source.sourceCrs() if src_crs != self.epsg4326: geomTo4326 = QgsCoordinateTransform(src_crs, self.epsg4326, QgsProject.instance()) self.symcontext = QgsRenderContext.fromMapSettings( settings.canvas.mapSettings()) self.png_icons = [] self.cat_styles = {} kml = simplekml.Kml() kml.resetidcounter() if layer: try: self.render = layer.renderer() self.exp_context = QgsExpressionContext() self.exp_context.appendScopes( QgsExpressionContextUtils.globalProjectLayerScopes(layer)) except Exception: if export_style: export_style = 0 feedback.reportError( 'Layer style cannot be determined. Processing will continue without symbol style export.' ) else: if export_style: feedback.reportError( 'There appears to be a valid source, but not a valid layer style. Processing will continue without symbol style export.' ) export_style = 0 if export_style: render_type = self.render.type() if render_type == 'singleSymbol': export_style = 1 elif render_type == 'categorizedSymbol': style_field = self.render.classAttribute() self.field_exp = QgsExpression(style_field) export_style = 2 elif render_type == 'graduatedSymbol': style_field = self.render.classAttribute() self.field_exp = QgsExpression(style_field) export_style = 3 else: feedback.reportError( 'Only single, categorized, and graduated symbol styles can be exported. Processing will continue without symbol style export.' ) export_style = 0 if export_style: self.initStyles(export_style, google_icon, name_field, geomtype, kml) folder = kml.newfolder(name=source.sourceName()) altitude = 0 featureCount = source.featureCount() total = 100.0 / featureCount if featureCount else 0 num_features = 0 iterator = source.getFeatures() for cnt, feature in enumerate(iterator): if feedback.isCanceled(): break num_features += 1 if altitude_field: try: altitude = float(feature[altitude_field]) except Exception: altitude = 0 geom = feature.geometry() if src_crs != self.epsg4326: geom.transform(geomTo4326) if geom.isMultipart() or (name_field and geomtype == QgsWkbTypes.PolygonGeometry): kmlgeom = folder.newmultigeometry() kml_item = kmlgeom else: kmlgeom = folder kml_item = None if geomtype == QgsWkbTypes.PointGeometry: # POINTS for pt in geom.parts(): kmlpart = kmlgeom.newpoint() self.setAltitudeMode(kmlpart, feature, default_alt_mode, alt_mode_field) if kml_item is None: kml_item = kmlpart if hasz: kmlpart.coords = [(pt.x(), pt.y(), pt.z() + altitude_addend)] else: kmlpart.coords = [(pt.x(), pt.y(), altitude + altitude_addend)] elif geomtype == QgsWkbTypes.LineGeometry: # LINES for part in geom.parts(): kmlpart = kmlgeom.newlinestring() self.setAltitudeMode(kmlpart, feature, default_alt_mode, alt_mode_field) if kml_item is None: kml_item = kmlpart if hasz: kmlpart.coords = [(pt.x(), pt.y(), pt.z() + altitude_addend) for pt in part] else: kmlpart.coords = [(pt.x(), pt.y(), altitude + altitude_addend) for pt in part] elif geomtype == QgsWkbTypes.PolygonGeometry: # POLYGONS if name_field: centroid = geom.centroid().asPoint() name = '{}'.format(feature[name_field]) labelpart = kmlgeom.newpoint(coords=[(centroid.x(), centroid.y())], name=name) for part in geom.parts(): kmlpart = kmlgeom.newpolygon() self.setAltitudeMode(kmlpart, feature, default_alt_mode, alt_mode_field) if kml_item is None: kml_item = kmlpart num_interior_rings = part.numInteriorRings() ext_ring = part.exteriorRing() if hasz: kmlpart.outerboundaryis = [(pt.x(), pt.y(), pt.z() + altitude_addend) for pt in ext_ring] else: kmlpart.outerboundaryis = [(pt.x(), pt.y(), altitude + altitude_addend) for pt in ext_ring] if num_interior_rings: ib = [] for i in range(num_interior_rings): if hasz: ib.append([(pt.x(), pt.y(), pt.z() + altitude_addend) for pt in part.interiorRing(i)]) else: ib.append([(pt.x(), pt.y(), altitude + altitude_addend) for pt in part.interiorRing(i)]) kmlpart.innerboundaryis = ib self.exportStyle(kml_item, feature, export_style, geomtype) if name_field: self.exportName(kml_item, feature[name_field]) if photo_path_field: photo_path = feature[photo_path_field].strip() if os.path.exists(photo_path): if not (photo_path in self.photos): local_path = kml.addfile(photo_path) self.photos[photo_path] = local_path else: photo_path = None else: photo_path = None if desc_cnt == 1: self.exportDescription(kml_item, feature[desc_fields[0]], photo_path) elif desc_cnt > 1: self.exportFields(kml_item, desc_fields, feature, photo_path) # Process the first date / time fields date_time_str = self.parseDateTimeValues(feature, date_time_stamp_field, date_stamp_field, time_stamp_field) if date_time_str: kml_item.timestamp.when = date_time_str date_time_str = self.parseDateTimeValues(feature, date_time_begin_field, date_begin_field, time_begin_field) if date_time_str: kml_item.timespan.begin = date_time_str date_time_str = self.parseDateTimeValues(feature, date_time_end_field, date_end_field, time_end_field) if date_time_str: kml_item.timespan.end = date_time_str if cnt % 100 == 0: feedback.setProgress(int(cnt * total)) if num_features == 0: feedback.pushInfo('No features processed') else: kml.savekmz(filename) self.cleanup() return ({})
def writeVector(writer, layerId, properties, progress=None, renderer=None, noFeature=False): mapLayer = QgsProject.instance().mapLayer(layerId) if mapLayer is None: return settings = writer.settings baseExtent = settings.baseExtent progress = progress or dummyProgress renderContext = QgsRenderContext.fromMapSettings(settings.mapSettings) expContext = settings.mapSettings.expressionContext() prop = VectorPropertyReader(writer.objectTypeManager, renderContext, expContext, mapLayer, properties) obj_mod = writer.objectTypeManager.module(prop.mod_index) if obj_mod is None: logMessage("Module not found") return # prepare triangle mesh geom_type = mapLayer.geometryType() if geom_type == QgsWkbTypes.PolygonGeometry and prop.type_index == 1 and prop.isHeightRelativeToDEM(): # Overlay progress(None, "Initializing triangle mesh for overlay polygons") writer.triangleMesh() progress(None, "Writing vector layer: {0}".format(mapLayer.name())) # write layer object layer = VectorLayer(writer, mapLayer, prop, obj_mod) writer.writeLayer(layer, layer.fieldNames) if noFeature: return # initialize symbol rendering mapLayer.renderer().startRender(renderContext, mapLayer.pendingFields()) # features to export request = QgsFeatureRequest() clipGeom = None if properties.get("radioButton_IntersectingFeatures", False): request.setFilterRect(layer.transform.transformBoundingBox(baseExtent.boundingBox(), QgsCoordinateTransform.ReverseTransform)) if properties.get("checkBox_Clip"): extent = baseExtent.clone().scale(0.999999) # clip with slightly smaller extent than map canvas extent clipGeom = extent.geometry() for feat in layer.features(request, clipGeom): if writer.isCanceled: break # write feature obj_mod.write(writer, layer, feat) # writer.writeFeature(layer, feat, obj_mod) # stack attributes in writer if layer.writeAttrs: writer.addAttributes(feat.attributes()) # write attributes if layer.writeAttrs: writer.writeAttributes() # write materials writer.writeMaterials(layer.materialManager) mapLayer.renderer().stopRender(renderContext)
def build(self, build_blocks=False): mapLayer = self.layer.mapLayer if mapLayer is None: return properties = self.layer.properties baseExtent = self.settings.baseExtent mapSettings = self.settings.mapSettings renderContext = QgsRenderContext.fromMapSettings(mapSettings) self.prop = VectorPropertyReader(objectTypeRegistry(), renderContext, mapLayer, properties) if self.prop.objType is None: logMessage("Object type not found") return # prepare triangle mesh if self.prop.objType.name == "Overlay" and self.prop.isHeightRelativeToDEM( ): # get the grid size of the DEM layer which polygons overlay demProp = self.settings.getPropertyReaderByLayerId( properties.get("comboBox_altitudeMode")) if demProp: self.demSize = demProp.demSize(mapSettings.outputSize()) layer = VectorLayer(self.settings, mapLayer, self.prop, self.materialManager, self.modelManager) self._layer = layer self.hasLabel = layer.hasLabel() self.clipGeom = None # feature request request = QgsFeatureRequest() if properties.get("radioButton_IntersectingFeatures", False): request.setFilterRect( layer.transform.transformBoundingBox( baseExtent.boundingBox(), QgsCoordinateTransform.ReverseTransform)) # geometry for clipping if properties.get( "checkBox_Clip" ) and self.prop.objType.name != "Triangular Mesh": extent = baseExtent.clone().scale( 0.999999 ) # clip with slightly smaller extent than map canvas extent self.clipGeom = extent.geometry() # initialize symbol rendering, and then get features (geometry, attributes, color, etc.) mapLayer.renderer().startRender(renderContext, mapLayer.fields()) self.features = layer.features(request) mapLayer.renderer().stopRender(renderContext) # materials/models data = {} if self.prop.objType.name != "Model File": for feat in self.features: feat.material = self.prop.objType.material( self.settings, layer, feat) feat.model = None data["materials"] = self.materialManager.buildAll( self.imageManager, self.pathRoot, self.urlRoot, base64=self.settings.base64) else: for feat in self.features: feat.material = None feat.model = self.prop.objType.model(self.settings, layer, feat) data["models"] = self.modelManager.build(self.pathRoot is not None) if build_blocks: data["blocks"] = [block.build() for block in self.blocks()] d = { "type": "layer", "id": self.layer.jsLayerId, "properties": self.layerProperties(), "data": data } if DEBUG_MODE: d["PROPERTIES"] = properties return d
def testQgsGraduatedSymbolRenderer_1(self): """Test QgsGraduatedSymbolRenderer: Basic get/set functions """ # Create a renderer renderer = QgsGraduatedSymbolRenderer() symbol = createMarkerSymbol() renderer.setSourceSymbol(symbol.clone()) self.assertEqual(symbol.dump(), renderer.sourceSymbol().dump(), "Get/set renderer source symbol") attr = '"value"*"value"' renderer.setClassAttribute(attr) self.assertEqual(attr, renderer.classAttribute(), "Get/set renderer class attribute") for m in ( QgsGraduatedSymbolRenderer.Custom, QgsGraduatedSymbolRenderer.EqualInterval, QgsGraduatedSymbolRenderer.Quantile, QgsGraduatedSymbolRenderer.Jenks, QgsGraduatedSymbolRenderer.Pretty, QgsGraduatedSymbolRenderer.StdDev, ): renderer.setMode(m) self.assertEqual(m, renderer.mode(), "Get/set renderer mode") format = createLabelFormat() renderer.setLabelFormat(format) self.assertEqual( dumpLabelFormat(format), dumpLabelFormat(renderer.labelFormat()), "Get/set renderer label format") ramp = createColorRamp() renderer.setSourceColorRamp(ramp) self.assertEqual( dumpColorRamp(ramp), dumpColorRamp(renderer.sourceColorRamp()), "Get/set renderer color ramp") renderer.setInvertedColorRamp(True) self.assertTrue(renderer.invertedColorRamp(), "Get/set renderer inverted color ramp") renderer.setInvertedColorRamp(False) self.assertFalse(renderer.invertedColorRamp(), "Get/set renderer inverted color ramp") renderer.setSourceColorRamp(ramp) self.assertEqual( dumpColorRamp(ramp), dumpColorRamp(renderer.sourceColorRamp()), "Get/set renderer color ramp") # test for classificatio with varying size renderer.setGraduatedMethod(QgsGraduatedSymbolRenderer.GraduatedSize) renderer.setSourceColorRamp(None) renderer.addClassLowerUpper(0, 2) renderer.addClassLowerUpper(2, 4) renderer.addClassLowerUpper(4, 6) renderer.setSymbolSizes(2, 13) self.assertEqual(renderer.maxSymbolSize(), 13) self.assertEqual(renderer.minSymbolSize(), 2) refSizes = [2, (13 + 2) * .5, 13] ctx = QgsRenderContext() for idx, symbol in enumerate(renderer.symbols(ctx)): self.assertEqual(symbol.size(), refSizes[idx])
def testReprojectionErrorsWhileRendering(self): # WKT of a polygon which causes reprojection errors while rendering # (apologies for the ridiculously complex wkt, but I can't find a way to reproduce with simplifiction) wkt = 'MultiPolygon (((16.93392988400009358 42.77094147300012139, 16.88493899800005238 42.72939687700012712, ' \ '16.80298912900011032 42.76349518400014915, 16.85816491000014139 42.78400299700011544, ' \ '16.93392988400009358 42.77094147300012139)),((17.38200931100010393 42.79783763200002511, ' \ '17.65894616000011297 42.74298737200008702, 17.74887129000009622 42.69456614800010641, ' \ '17.32374108200008322 42.79083893400003547, 17.38200931100010393 42.79783763200002511)),' \ '((16.768565300000148 42.97223541900014254, 17.03207441500009622 42.98261139500014849, ' \ '17.13184655000009116 42.96954987200014386, 17.20020592500009116 42.92177969000012183, ' \ '16.85141035200010151 42.90070221600008438, 16.65544681100004709 42.92625560099999404, ' \ '16.70679772200014668 42.96954987200014386, 16.63168379000003938 42.98261139500014849, ' \ '16.768565300000148 42.97223541900014254)),((17.05567467500011958 43.02895742400001211, ' \ '17.24024498800011429 43.02277252800014651, 17.74146569100011561 42.83926015800001608, ' \ '17.70736738400009358 42.88703034100014122, 17.65334906206413734 42.8909283361407887, ' \ '17.70158573400010482 42.91950022500007833, 17.81175988700005064 42.909862570000044, ' \ '17.85847538200005147 42.81697418200012351, 18.22413781700009849 42.62807098500009317, ' \ '18.43735477700010961 42.55921213800017711, 18.4371480710000526 42.4934022020000981, ' \ '18.49642988400009358 42.41632721600008438, 18.23894290500010129 42.55906810100005089, ' \ '18.21753991000014139 42.6201032570001388, 18.07601972700010151 42.65131256700003348, ' \ '18.0432235040000819 42.70205312700007028, 17.90162194100014403 42.75189850500014188, ' \ '17.8928328790000819 42.79083893400003547, 17.72095787900005348 42.8262393250000315, ' \ '17.7618921230000808 42.77871328300012976, 17.74870853000004445 42.77204010600017625, ' \ '17.21387780000011958 42.98261139500014849, 17.04615319100011561 42.9950625670000619, ' \ '17.00163821700004974 43.05149974200010377, 17.05567467500011958 43.02895742400001211)),' \ '((16.19467207100007045 43.07440827000000638, 16.254893425000148 43.06854889500006323, ' \ '16.08716881600014403 43.01146067900008063, 16.04883873800011429 43.06517161700004692, ' \ '16.19467207100007045 43.07440827000000638)),((16.56275475400011032 43.22898997600010773, ' \ '16.65951582100009887 43.21596914300012315, 16.72771243600001867 43.16461823100003414, ' \ '17.19336998800014271 43.12726471600016964, 16.67017662900013875 43.12547435099999404, ' \ '16.37159264400014536 43.19550202000006323, 16.49642988400006516 43.21808502800014651, ' \ '16.58326256600014403 43.18866608300005794, 16.52051842500006273 43.22898997600010773, ' \ '16.56275475400011032 43.22898997600010773)),((16.80681399800010922 43.34247467700005529, ' \ '16.89234459700011826 43.31220123900006058, 16.84620201900008851 43.27338288000005662, ' \ '16.62826582100012729 43.26373932500008834, 16.50074303500014139 43.28424713700003679, ' \ '16.42188561300008587 43.31757233300011478, 16.40577233200011165 43.33270905200011214, ' \ '16.45346113400009358 43.35317617400009738, 16.42628014400008851 43.39411041900011412, ' \ '16.44703209700008983 43.39484284100014122, 16.80681399800010922 43.34247467700005529)),' \ '((16.29818769600012729 43.40363190300011809, 16.30274498800008587 43.38727448100009099, ' \ '16.39144941500012465 43.34638092700005529, 16.348643425000148 43.33869049700003018, ' \ '16.20045006600014403 43.40704987200003018, 16.29818769600012729 43.40363190300011809)),' \ '((16.33415774800010922 43.50153229400014254, 16.3752547540000819 43.49017975500008504, ' \ '16.21143639400008851 43.49005768400009231, 16.26441491000014139 43.51288483300011478, ' \ '16.33415774800010922 43.50153229400014254)),((15.67888431100004709 43.64801666900014254, ' \ '15.74040774800010922 43.62750885600009099, 15.67204837300002396 43.63743724200010377, ' \ '15.60377037900013875 43.67470937700007028, 15.67888431100004709 43.64801666900014254)),' \ '((15.36736087300005238 43.79010651200015047, 15.39568118600007551 43.7724063170000619, ' \ '15.22779381600014403 43.87445709800014981, 15.24073326900014536 43.88076406500009341, ' \ '15.36736087300005238 43.79010651200015047)),((15.44271894600009887 43.89907461100013109, ' \ '15.35865319100014403 43.91937897300014981, 15.26124108200011165 44.01105377800003282, ' \ '15.38404381600008719 43.9701602230000077, 15.44271894600009887 43.89907461100013109)),' \ '((15.22575931100010393 44.06622955900014915, 15.25440514400008851 44.01788971600014122, ' \ '15.12183678500014139 44.09223053600005926, 15.06251061300008587 44.16193268400012073, ' \ '15.22575931100010393 44.06622955900014915)),((14.83545983200014007 44.15102773600013109, ' \ '14.85726972700010151 44.15204498900000374, 14.86915123800014271 44.14052969000006499, ' \ '14.83521569100008719 44.14166901200009363, 14.81983483200014007 44.15302155199999845, ' \ '14.82243899800005238 44.16868724200004692, 14.83545983200014007 44.15102773600013109)),' \ '((14.98511803500011297 44.09096914300012315, 15.21680748800008587 43.91278717700008372, ' \ '15.13331139400011693 43.92121002800003282, 15.19450931100004709 43.87262604400017096, ' \ '15.10661868600007551 43.92544179900015422, 14.84961998800014271 44.17560455900014915, ' \ '14.98511803500011297 44.09096914300012315)),((14.765961134000122 44.26504140800015819, ' \ '14.74854576900014536 44.26166413000014188, 14.73959394600012729 44.28017812700015554, ' \ '14.79167728000007287 44.27252838700003679, 14.765961134000122 44.26504140800015819)),' \ '((14.66138756600011561 44.30866120000014519, 14.6407983730000808 44.31183502800003282, ' \ '14.59506269600007045 44.34711334800006455, 14.643565300000148 44.32575104400011412, ' \ '14.66138756600011561 44.30866120000014519)),((14.81120853000004445 44.35004303600000242, ' \ '14.75619550900009358 44.36399974200004692, 14.76343834700008983 44.41535065300017493, ' \ '14.80323326900008851 44.40550364800004957, 14.81120853000004445 44.35004303600000242)),' \ '((14.27116946700002131 44.61253489800004957, 14.23259524800005238 44.62604401200012205, ' \ '14.2657983730000808 44.67951080900003547, 14.28044681100007551 44.67755768400009231, ' \ '14.27116946700002131 44.61253489800004957)),((14.84522545700008322 44.60053131700011875, ' \ '14.93824303500014139 44.59414297100001079, 15.07553144600007045 44.48407623900006058, ' \ '14.91114342500011958 44.54547760600014783, 15.04802493600004709 44.43943919500001982, ' \ '15.09669030000009116 44.41518789300000947, 15.04151451900014536 44.47662995000008834, ' \ '15.25440514400008851 44.34003327000000638, 15.165049675000148 44.36737702000006323, ' \ '15.22022545700008322 44.3127302100001117, 15.13086998800008587 44.33258698100003414, ' \ '15.17237389400014536 44.29913971600016964, 15.12875410200007309 44.31199778900018771, ' \ '15.08920332100009887 44.37421295800000109, 15.11719811300014271 44.38719310099999404, ' \ '15.04900149800010922 44.39468008000015686, 14.89747155000009116 44.49091217699999845, ' \ '14.91863040500010129 44.50454336100013109, 14.87696373800011429 44.55975983300005794, ' \ '14.73365319100008719 44.70319245000014519, 14.84522545700008322 44.60053131700011875)),' \ '((14.41000410200010151 44.60097890800001608, 14.52662194100011561 44.50372955900012073, ' \ '14.53435306100010393 44.48407623900006058, 14.42261803500008455 44.57387929900009738, ' \ '14.36304772200014668 44.57343170800000109, 14.38257897200014668 44.60325755399999537, ' \ '14.33578535200007309 44.71678294500010509, 14.39747155000009116 44.6856143250000315, ' \ '14.41000410200010151 44.60097890800001608)),((14.75326582100007045 44.84585195500012844, ' \ '14.74048912900011032 44.82050202000000638, 14.82243899800005238 44.77142975500005662, ' \ '14.84961998800014271 44.70319245000014519, 14.65788821700004974 44.79877350500014188, ' \ '14.7268172540000819 44.79877350500014188, 14.6858016290000819 44.8471540390000456, ' \ '14.75326582100007045 44.84585195500012844)),((14.47103925900006516 44.95392487200003018, ' \ '14.45191491000008455 44.79877350500014188, 14.47217858200011165 44.7079531920000619, ' \ '14.53435306100010393 44.63426341400010244, 14.51335696700007816 44.618841864000089, ' \ '14.42790774800005238 44.65656159100014122, 14.29420006600008719 44.9086367860001161, ' \ '14.30152428500011297 44.94342682500014519, 14.38738040500004445 44.90900299700003018, ' \ '14.39031009200004974 44.96039459800012139, 14.41138756600008719 44.95636627800014651, ' \ '14.27849368600004709 45.1133487000000315, 14.29957116000014139 45.16233958499999801, ' \ '14.35621178500014139 45.16925690300008966, 14.387705925000148 45.03904857000013351, ' \ '14.47103925900006516 44.95392487200003018)),((14.56332441500012465 45.24974192900008063, ' \ '14.62378991000011297 45.17548248900006058, 14.59742272200011826 45.16644928600005926, ' \ '14.66529381600011561 45.16181061400011743, 14.66529381600011561 45.08734772300006455, ' \ '14.74048912900011032 45.07306549700014386, 14.81495201900008851 44.97748444200009033, ' \ '14.70639082100009887 44.9467227230000077, 14.62891686300014271 44.97817617400004053, ' \ '14.62086022200008983 45.04559967700011214, 14.61695397200008983 45.02464427300007799, ' \ '14.51050866000014139 45.03217194200011875, 14.43873131600014403 45.07050202000006323, ' \ '14.4670516290000819 45.12409088700015047, 14.53012129000009622 45.13483307500014519, ' \ '14.53435306100010393 45.23753489800002114, 14.56332441500012465 45.24974192900008063)),' \ '((16.36947066200013978 46.54057118800012915, 16.63767134600004738 46.47447703100009164, ' \ '16.75508020000012266 46.38187286400001597, 16.83765913900006694 46.38187286400001597, ' \ '16.88923221800007468 46.29216257800014489, 17.05294315600005461 46.15346303300005104, ' \ '17.20859257000006437 46.11656606000003933, 17.27587528500004055 46.01202463800002818, ' \ '17.31680301900004793 45.99765859000002877, 17.29013798000011093 45.98463612900009423, ' \ '17.40620324700006449 45.94365671800015605, 17.59110152100009827 45.93621531200012953, ' \ '17.65652388500006964 45.84541982000014571, 17.80917606600013414 45.81441396100005647, ' \ '17.85806197100004056 45.77172922800004073, 18.21121870900006456 45.78537180600012846, ' \ '18.40438521300006869 45.74180857400001798, 18.57347049900010916 45.81668772400014689, ' \ '18.6556360270001278 45.90758656800015558, 18.7755253500000947 45.88283355700004051, ' \ '18.90130578600007993 45.93120269800006383, 18.87288374800004931 45.89523590100002082, ' \ '18.90699019400011593 45.86795074500018643, 18.85531376100007606 45.85735707600009903, ' \ '18.84497847500006174 45.8157058720000947, 18.96848514800012708 45.66873809800016204, ' \ '18.90357954900008508 45.57308502200005762, 18.94171675700005153 45.53892689999999277, ' \ '19.01809452300011571 45.56740061400002162, 19.10625451700005328 45.51164174500017623, ' \ '19.00961958800010621 45.49867095900005154, 19.00300500400010151 45.45536611000007099, ' \ '19.03742150900006891 45.42229319300010104, 18.97592655400006834 45.39495636000008005, ' \ '19.09199182100007874 45.34999786400005917, 19.12475467900009107 45.29811472600006539, ' \ '19.36308638500014467 45.24824696900010679, 19.40783817500010855 45.20313344400013023, ' \ '19.39068160000005037 45.16933705700016333, 19.22593713300008744 45.16194732700016345, ' \ '19.12186079900010327 45.195795390000157, 19.13767378700009658 45.14603098600004216, ' \ '19.04486291500009543 45.13724599300006446, 19.08227665200013234 45.08494944300004192, ' \ '19.0872375890000967 44.97710072800013847, 19.13167932100006396 44.95317454000003465, ' \ '19.06667036900009293 44.90568389900012392, 18.99142948400006503 44.9149339800001286, ' \ '19.01582076000008215 44.86563466400004074, 18.88962691200009658 44.86119049100013001, ' \ '18.78338016700013213 44.91374542300012251, 18.79175174900009893 45.00154368100008639, ' \ '18.73831831900008638 45.0159097290000858, 18.68405806500004473 45.08479441400000098, ' \ '18.64871138500012648 45.06267689999999959, 18.61667199700013953 45.09766184500010411, ' \ '18.54959598800010667 45.09476796500011631, 18.51703983500007666 45.05585561200003042, ' \ '18.23788374800011525 45.15745147700012296, 18.15365116400005263 45.0975584930001645, ' \ '18.00347945100011771 45.1493382780000303, 17.83573775200005684 45.0644338990000648, ' \ '17.68473921700012852 45.1639627080000281, 17.48185754400009273 45.11440500900012296, ' \ '17.49622359200009214 45.1416901650001563, 17.44775109900012922 45.13430043600014585, ' \ '17.44330692500011537 45.16205068000009248, 17.38243208800008688 45.1396231090000839, ' \ '17.26895064300006766 45.18954254200015441, 17.24548954300007608 45.15538442000017483, ' \ '17.18709517400012032 45.14856313100001728, 17.0363033440001459 45.23047027600007652, ' \ '17.00829471800011561 45.21615590500009318, 17.00829471800011561 45.24416453100009505, ' \ '16.94731652900014751 45.23568959600000028, 16.9243721930001243 45.28452382500016427, ' \ '16.81171757000004163 45.18122263700009, 16.52894413300009546 45.22225372400005483, ' \ '16.38921106000003647 45.11683380099999852, 16.31624393700010955 45.00123362300008978, ' \ '16.12152714000009723 45.09616322900008356, 16.02044803900011516 45.213933818000001, ' \ '15.79234826700013627 45.18980092400012438, 15.76361617000014803 44.97555043600003444, ' \ '15.7308533120001357 44.92723297200008403, 15.77343469200010873 44.84501576800015243, ' \ '15.71607385200013596 44.80320953400008932, 15.72847619600008784 44.76910308800002269, ' \ '15.80568078600006743 44.69665273000013883, 15.88877648900006534 44.72424794500012979, ' \ '15.96897831200004703 44.63924021400013942, 16.02830285600006732 44.62471913700009907, ' \ '16.04473596200011798 44.58937245700018082, 16.00608199000004106 44.54100331600012908, ' \ '16.11646285000011858 44.52146962500013672, 16.15966434700004584 44.41610138000002905, ' \ '16.13827030500004867 44.37760243800015303, 16.20286584400008678 44.35977406800010669, ' \ '16.18756962000011868 44.28241444999999032, 16.21578495300011014 44.20815541600011045, ' \ '16.32688928200008149 44.08237498000012522, 16.50103885900011846 43.99271637000008184, ' \ '16.67859908100004418 43.8406843060001421, 16.71260217300007866 43.77151540100005889, ' \ '17.03051558500007445 43.54847991900005866, 17.27050093600007585 43.46321380700000248, ' \ '17.28993127500007176 43.3034302780000786, 17.44206669100009321 43.15243174300015028, ' \ '17.6284119050001209 43.04657257100008394, 17.66272505700004558 42.96569895500012137, ' \ '17.63450972400008254 42.950402731000068, 17.51563561300008587 42.95888906500012183, ' \ '17.47087649800005238 43.01341380400010905, 17.50196373800014271 43.03099192900005221, ' \ '17.43360436300014271 43.01740143400009231, 17.46021569100011561 43.03099192900005221, ' \ '17.42611738400009358 43.06517161700004692, 17.4045516290000819 43.05149974200010377, ' \ '17.31625410200012993 43.12726471600016964, 17.11394290500004445 43.21320221600008438, ' \ '16.88062584700011826 43.40595123900006058, 16.62582441500009622 43.44904205900009231, ' \ '16.52466881600011561 43.51080963700009363, 16.39144941500012465 43.51080963700009363, ' \ '16.47339928500008455 43.5381533870001789, 16.43384850400013875 43.54975006700000506, ' \ '16.11768639400008851 43.52448151200003679, 16.17237389400014536 43.4896914730000077, ' \ '16.11312910200004467 43.47890859600009605, 15.95948326900011693 43.50397370000008834, ' \ '15.987315300000148 43.54490794500010509, 15.92530358200011165 43.55857982000004824, ' \ '15.91895592500009116 43.62872955900012073, 15.96631920700011165 43.64118073100003414, ' \ '15.90479576900014536 43.64801666900014254, 15.95297285200010151 43.65086497599999404, ' \ '15.95045006600008719 43.68854401200015047, 15.70630944100008719 43.76341380400005221, ' \ '15.6174422540000819 43.82550690300017493, 15.66309655000009116 43.81297435099999404, ' \ '15.67888431100004709 43.81928131700011875, 15.45508873800014271 43.92804596600014122, ' \ '15.14454186300011429 44.19546133000015686, 15.15219160200012993 44.23529694200014717, ' \ '15.11036217500011958 44.26434967700011214, 15.14063561300011429 44.28245677300013483, ' \ '15.17660566500009622 44.24994538000005662, 15.20777428500008455 44.27277252800014651, ' \ '15.19809004000012465 44.30166250200007028, 15.295258009000122 44.25067780199999845, ' \ '15.30274498800008587 44.29913971600016964, 15.26124108200011165 44.33258698100003414, ' \ '15.42448978000001603 44.26797109600006763, 15.52865644600009887 44.27179596600008438, ' \ '15.30795332100009887 44.35439687700007028, 15.00733483200014007 44.56972890800012976, ' \ '14.883799675000148 44.7236188820001388, 14.883799675000148 44.86147695500012844, 14.92164147200008983 ' \ '44.95880768400009231, 14.85279381600011561 45.09365469000000815, 14.65788821700004974 ' \ '45.19660065300017493, 14.57081139400008851 45.29364655200011214, 14.31153405000009116 ' \ '45.34398021000005485, 14.23259524800005238 45.14935944200000506, 14.17937259200007816 ' \ '45.13450755400005221, 14.19312584700008983 45.10561758000012844, 14.14389082100007045 ' \ '45.05939362200003018, 14.151377800000148 44.97748444200009033, 14.06885826900014536 ' \ '44.94953034100014122, 14.08383222700007309 44.9863955750000315, 14.04029381600014403 ' \ '45.03896719000015025, 14.0756942070000548 44.98371002800003282, 14.02051842500011958 ' \ '44.90110911700004692, 13.97266686300011429 44.90110911700004692, 13.99301191500009622 ' \ '44.88129303600014453, 13.97266686300011429 44.82664622599999404, 14.00001061300008587 ' \ '44.81305573100003414, 13.89014733200011165 44.83348216400010244, 13.91797936300014271 ' \ '44.77826569200009033, 13.90316816500009622 44.77240631700014717, 13.89698326900011693 ' \ '44.81305573100003414, 13.78711998800014271 44.87506745000008834, 13.84229576900008851 ' \ '44.88812897300006455, 13.79460696700010658 44.89496491100008768, 13.77409915500007287 ' \ '44.96381256700014717, 13.6232202480000808 45.07306549700014386, 13.61255944100014403 ' \ '45.11786530199999845, 13.72624759200004974 45.13450755400005221, 13.5959578790000819 ' \ '45.14541250200001343, 13.57545006600011561 45.26487864800007799, 13.60271243600001867 ' \ '45.28534577000012007, 13.57545006600011561 45.30646393400006389, 13.60954837300005238 ' \ '45.32013580900017757, 13.54127037900013875 45.34613678600005926, 13.50709069100014403 ' \ '45.51190827000000638, 13.62901778100007277 45.45898346000016943, 13.75929406800014476 ' \ '45.46316925100011019, 13.88900191200011136 45.42363678000005223, 13.98263960800005634 ' \ '45.47531321200001742, 13.97189091000012695 45.5142255660000643, 14.09291711400010172 ' \ '45.47391794800002174, 14.21869755100007637 45.49717234400004884, 14.37279667100006009 ' \ '45.47784535800009564, 14.4689148350000778 45.52559438100014688, 14.49857710800012001 ' \ '45.59618438800005435, 14.58094934100009255 45.66780792200010808, 14.66848921700008646 ' \ '45.53396596300005683, 14.79716353300005949 45.46518463200006011, 14.88160282300009385 ' \ '45.46978383400001178, 14.9226339110000481 45.51494903600017494, 15.13926151500010064 ' \ '45.43004465799999991, 15.32519331800011742 45.45283396399999276, 15.36136682100004691 ' \ '45.48203114900003641, 15.29666792800006192 45.52295888300012905, 15.2685559480001416 ' \ '45.60166208900012919, 15.37376916500011248 45.64021270800010655, 15.25501672300006817 ' \ '45.72346344000011698, 15.42906294700014769 45.77529490200011253, 15.45128381300008868 ' \ '45.81513743100013869, 15.67607629400006886 45.84169911700014666, 15.65943648300003588 ' \ '45.88882802400014782, 15.69798710100010908 46.0362092080000167, 15.58988000500005455 ' \ '46.11351715100001059, 15.62284956800010605 46.19170359400006021, 16.01920780400010358 ' \ '46.29882883700007312, 16.05961877400008575 46.33231516600015709, 16.0579651280001201 ' \ '46.37753204400003426, 16.2756262620000598 46.37316538500006402, 16.23490523300009158 ' \ '46.4933389280001137, 16.36947066200013978 46.54057118800012915))) ' geom = QgsGeometry.fromWkt(wkt) f = QgsFeature() f.setGeometry(geom) image = QImage(200, 200, QImage.Format_RGB32) painter = QPainter() ms = QgsMapSettings() crs = QgsCoordinateReferenceSystem.fromProj4( '+proj=ortho +lat_0=36.5 +lon_0=-118.8 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m +no_defs' ) self.assertTrue(crs.isValid()) ms.setDestinationCrs(crs) ms.setExtent(QgsRectangle(1374999.8, 3912610.7, 4724462.5, 6505499.6)) ms.setOutputSize(image.size()) context = QgsRenderContext.fromMapSettings(ms) context.setPainter(painter) context.setScaleFactor(96 / 25.4) # 96 DPI ct = QgsCoordinateTransform(QgsCoordinateReferenceSystem('epsg:4326'), crs, QgsProject.instance()) self.assertTrue(ct.isValid()) context.setCoordinateTransform(ct) context.setExtent( ct.transformBoundingBox(ms.extent(), QgsCoordinateTransform.ReverseTransform)) fill_symbol = QgsFillSymbol.createSimple({ 'color': '#ffffff', 'outline_color': '#ffffff', 'outline_width': '10' }) painter.begin(image) try: image.fill(QColor(0, 0, 0)) fill_symbol.startRender(context) fill_symbol.renderFeature(f, context) fill_symbol.stopRender(context) finally: painter.end() assert self.imageCheck('Reprojection errors polygon', 'reprojection_errors_polygon', image) #also test linestring linestring = QgsGeometry(geom.constGet().boundary()) f.setGeometry(linestring) line_symbol = QgsLineSymbol.createSimple({ 'color': '#ffffff', 'outline_width': '10' }) image = QImage(200, 200, QImage.Format_RGB32) painter.begin(image) try: image.fill(QColor(0, 0, 0)) line_symbol.startRender(context) line_symbol.renderFeature(f, context) line_symbol.stopRender(context) finally: painter.end() assert self.imageCheck('Reprojection errors linestring', 'reprojection_errors_linestring', image)
def writeVectorLayer(layer, safeLayerName, usedFields, highlight, popupsOnHover, popup, outputProjectFileName, wfsLayers, cluster, visible, json, legends, new_src, canvas, zIndex, restrictToExtent, extent, feedback, labelCode, useMultiStyle, useHeat, useShapes, useOSMB): feedback.showFeedback("Writing %s as JSON..." % layer.name()) zIndex = zIndex + 400 markerFolder = os.path.join(outputProjectFileName, "markers") labeltext = getLabels(layer, safeLayerName, outputProjectFileName) labelCode += labeltext (new_pop, popFuncs) = getPopups(layer, safeLayerName, highlight, popupsOnHover, popup) renderer = layer.rendererV2() layer_transp = 1 - (float(layer.layerTransparency()) / 100) style = "" if is25d(layer, canvas, restrictToExtent, extent): useOSMB = True shadows = "" renderer = layer.rendererV2() renderContext = QgsRenderContext.fromMapSettings(canvas.mapSettings()) fields = layer.pendingFields() renderer.startRender(renderContext, fields) for feat in layer.getFeatures(): if isinstance(renderer, QgsCategorizedSymbolRendererV2): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) catIndex = renderer.categoryIndexForValue(attrValue) categories = renderer.categories() symbol = categories[catIndex].symbol() elif isinstance(renderer, QgsGraduatedSymbolRendererV2): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) ranges = renderer.ranges() for range in ranges: if (attrValue >= range.lowerValue() and attrValue <= range.upperValue()): symbol = range.symbol().clone() else: symbol = renderer.symbolForFeature2(feat, renderContext) symbolLayer = symbol.symbolLayer(0) if not symbolLayer.paintEffect().effectList()[0].enabled(): shadows = "'2015-07-15 10:00:00'" renderer.stopRender(renderContext) new_obj = """ var osmb = new OSMBuildings(map).date(new Date({shadows})); osmb.set(json_{sln});""".format(shadows=shadows, sln=safeLayerName) elif isinstance(renderer, QgsHeatmapRenderer): useHeat = True (new_obj, legends, wfsLayers) = heatmapLayer(layer, safeLayerName, renderer, legends, wfsLayers) elif isinstance(renderer, QgsSingleSymbolRendererV2): (style, markerType, useShapes) = getLayerStyle(layer, safeLayerName, markerFolder, outputProjectFileName, useShapes) (new_obj, legends, wfsLayers, useMultiStyle) = singleLayer( renderer, outputProjectFileName, safeLayerName, wfsLayers, layer, cluster, json, usedFields, legends, markerType, useMultiStyle) elif isinstance(renderer, QgsCategorizedSymbolRendererV2): (style, markerType, useShapes) = getLayerStyle(layer, safeLayerName, markerFolder, outputProjectFileName, useShapes) (new_obj, legends, wfsLayers, useMultiStyle) = categorizedLayer( layer, renderer, safeLayerName, outputProjectFileName, usedFields, legends, cluster, json, wfsLayers, markerType, useMultiStyle) elif isinstance(renderer, QgsGraduatedSymbolRendererV2): (style, markerType, useShapes) = getLayerStyle(layer, safeLayerName, markerFolder, outputProjectFileName, useShapes) (new_obj, legends, wfsLayers, useMultiStyle) = graduatedLayer( layer, safeLayerName, renderer, outputProjectFileName, cluster, json, usedFields, legends, wfsLayers, markerType, useMultiStyle) elif isinstance(renderer, QgsRuleBasedRendererV2): (style, markerType, useShapes) = getLayerStyle(layer, safeLayerName, markerFolder, outputProjectFileName, useShapes) (new_obj, legends, wfsLayers, useMultiStyle) = ruleBasedLayer( layer, renderer, safeLayerName, outputProjectFileName, usedFields, legends, cluster, json, wfsLayers, markerType, useMultiStyle) blend = BLEND_MODES[layer.blendMode()] new_obj = u"""{style} map.createPane('pane_{sln}'); map.getPane('pane_{sln}').style.zIndex = {zIndex}; map.getPane('pane_{sln}').style['mix-blend-mode'] = '{blend}'; {new_obj}""".format(style=style, sln=safeLayerName, zIndex=zIndex, blend=blend, new_obj=new_obj) if usedFields != 0: new_src += new_pop.decode("utf-8") new_src += """ """ + new_obj if is25d(layer, canvas, restrictToExtent, extent): pass else: new_src += """ bounds_group.addLayer(layer_""" + safeLayerName + """);""" if visible: if cluster is False: new_src += """ map.addLayer(layer_""" + safeLayerName + """);""" else: new_src += """ cluster_""" + safeLayerName + """.addTo(map);""" feedback.completeStep() return (new_src, legends, wfsLayers, labelCode, useMultiStyle, useHeat, useShapes, useOSMB)