def testCalculateFeatureRequestGeometry(self): region = QgsMapClippingRegion(QgsGeometry.fromWkt('Polygon((0 0, 1 0, 1 1, 0 1, 0 0))')) region.setFeatureClip(QgsMapClippingRegion.FeatureClippingType.NoClipping) region2 = QgsMapClippingRegion(QgsGeometry.fromWkt('Polygon((0 0, 0.1 0, 0.1 2, 0 2, 0 0))')) region2.setFeatureClip(QgsMapClippingRegion.FeatureClippingType.NoClipping) rc = QgsRenderContext() geom, should_clip = QgsMapClippingUtils.calculateFeatureRequestGeometry([], rc) self.assertFalse(should_clip) self.assertTrue(geom.isNull()) geom, should_clip = QgsMapClippingUtils.calculateFeatureRequestGeometry([region], rc) geom.normalize() self.assertTrue(should_clip) self.assertEqual(geom.asWkt(1), 'Polygon ((0 0, 0 1, 1 1, 1 0, 0 0))') geom, should_clip = QgsMapClippingUtils.calculateFeatureRequestGeometry([region, region2], rc) geom.normalize() self.assertTrue(should_clip) self.assertEqual(geom.asWkt(1), 'Polygon ((0 0, 0 1, 0.1 1, 0.1 0, 0 0))') rc.setCoordinateTransform(QgsCoordinateTransform(QgsCoordinateReferenceSystem('EPSG:3857'), QgsCoordinateReferenceSystem('EPSG:4326'), QgsProject.instance())) geom, should_clip = QgsMapClippingUtils.calculateFeatureRequestGeometry([region, region2], rc) geom.normalize() self.assertTrue(should_clip) self.assertEqual(geom.asWkt(0), 'Polygon ((0 0, 0 111325, 11132 111325, 11132 0, 0 0))')
def testGetSet(self): region = QgsMapClippingRegion( QgsGeometry.fromWkt('Polygon((0 0, 1 0, 1 1, 0 1, 0 0))')) self.assertEqual(region.geometry().asWkt(), 'Polygon ((0 0, 1 0, 1 1, 0 1, 0 0))') region.setGeometry( QgsGeometry.fromWkt('Polygon((10 0, 11 0, 11 1, 10 1, 10 0))')) self.assertEqual(region.geometry().asWkt(), 'Polygon ((10 0, 11 0, 11 1, 10 1, 10 0))') self.assertEqual( region.featureClip(), QgsMapClippingRegion.FeatureClippingType.ClipToIntersection) region.setFeatureClip( QgsMapClippingRegion.FeatureClippingType.ClipPainterOnly) self.assertEqual( region.featureClip(), QgsMapClippingRegion.FeatureClippingType.ClipPainterOnly) layer = QgsVectorLayer( "Point?field=fldtxt:string&field=fldint:integer", "addfeat", "memory") layer2 = QgsVectorLayer( "Point?field=fldtxt:string&field=fldint:integer", "addfeat", "memory") self.assertEqual(len(region.restrictedLayers()), 0) region.setRestrictedLayers([layer, layer2]) self.assertCountEqual(region.restrictedLayers(), [layer, layer2])
def testIntersectionRuleBased(self): """ Test that rule based renderer using intersection clip paths correctly uses original feature area for rule evaluation, not clipped area """ poly_layer = QgsVectorLayer(os.path.join(TEST_DATA_DIR, 'polys.shp')) self.assertTrue(poly_layer.isValid()) sym1 = QgsFillSymbol.createSimple({'color': '#ff00ff', 'outline_color': '#000000', 'outline_width': '1'}) sym2 = QgsFillSymbol.createSimple({'color': '#00ffff', 'outline_color': '#000000', 'outline_width': '1'}) r1 = QgsRuleBasedRenderer.Rule(sym1, 0, 0, 'area($geometry)>25') r2 = QgsRuleBasedRenderer.Rule(sym2, 0, 0, 'ELSE') rootrule = QgsRuleBasedRenderer.Rule(None) rootrule.appendChild(r1) rootrule.appendChild(r2) renderer = QgsRuleBasedRenderer(rootrule) poly_layer.setRenderer(renderer) mapsettings = QgsMapSettings() mapsettings.setOutputSize(QSize(400, 400)) mapsettings.setOutputDpi(96) mapsettings.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:3857')) mapsettings.setExtent(QgsRectangle(-13875783.2, 2266009.4, -8690110.7, 6673344.5)) mapsettings.setLayers([poly_layer]) mapsettings.setEllipsoid('') region = QgsMapClippingRegion(QgsGeometry.fromWkt( 'Polygon ((-11725957 5368254, -12222900 4807501, -12246014 3834025, -12014878 3496059, -11259833 3518307, -10751333 3621153, -10574129 4516741, -10847640 5194995, -11105742 5325957, -11725957 5368254))')) region.setFeatureClip(QgsMapClippingRegion.FeatureClippingType.ClipToIntersection) region2 = QgsMapClippingRegion(QgsGeometry.fromWkt( 'Polygon ((-11032549 5421399, -11533344 4693167, -11086481 4229112, -11167378 3742984, -10616504 3553984, -10161936 3925771, -9618766 4668482, -9472380 5620753, -10115709 5965063, -11032549 5421399))')) region2.setFeatureClip(QgsMapClippingRegion.FeatureClippingType.ClipToIntersection) mapsettings.addClippingRegion(region) mapsettings.addClippingRegion(region2) renderchecker = QgsMultiRenderChecker() renderchecker.setMapSettings(mapsettings) renderchecker.setControlPathPrefix('vectorlayerrenderer') renderchecker.setControlName('expected_intersection_rule_based') result = renderchecker.runTest('expected_intersection_rule_based') self.report += renderchecker.report() self.assertTrue(result) # also try with symbol levels renderer.setUsingSymbolLevels(True) poly_layer.setRenderer(renderer) renderchecker = QgsMultiRenderChecker() renderchecker.setMapSettings(mapsettings) renderchecker.setControlPathPrefix('vectorlayerrenderer') renderchecker.setControlName('expected_intersection_rule_based') result = renderchecker.runTest('expected_intersection_rule_based') self.report += renderchecker.report() self.assertTrue(result)
def testRenderWithIntersectsRegions(self): poly_layer = QgsVectorLayer(os.path.join(TEST_DATA_DIR, 'polys.shp')) self.assertTrue(poly_layer.isValid()) sym1 = QgsFillSymbol.createSimple({ 'color': '#ff00ff', 'outline_color': '#000000', 'outline_width': '1' }) renderer = QgsSingleSymbolRenderer(sym1) poly_layer.setRenderer(renderer) mapsettings = QgsMapSettings() mapsettings.setOutputSize(QSize(400, 400)) mapsettings.setOutputDpi(96) mapsettings.setDestinationCrs( QgsCoordinateReferenceSystem('EPSG:3857')) mapsettings.setExtent( QgsRectangle(-13875783.2, 2266009.4, -8690110.7, 6673344.5)) mapsettings.setLayers([poly_layer]) region = QgsMapClippingRegion( QgsGeometry.fromWkt( 'Polygon ((-11725957 5368254, -12222900 4807501, -12246014 3834025, -12014878 3496059, -11259833 3518307, -10751333 3621153, -10574129 4516741, -10847640 5194995, -11105742 5325957, -11725957 5368254))' )) region.setFeatureClip( QgsMapClippingRegion.FeatureClippingType.NoClipping) region2 = QgsMapClippingRegion( QgsGeometry.fromWkt( 'Polygon ((-11032549 5421399, -11533344 4693167, -11086481 4229112, -11167378 3742984, -10616504 3553984, -10161936 3925771, -9618766 4668482, -9472380 5620753, -10115709 5965063, -11032549 5421399))' )) region2.setFeatureClip( QgsMapClippingRegion.FeatureClippingType.NoClipping) mapsettings.addClippingRegion(region) mapsettings.addClippingRegion(region2) renderchecker = QgsMultiRenderChecker() renderchecker.setMapSettings(mapsettings) renderchecker.setControlPathPrefix('vectorlayerrenderer') renderchecker.setControlName('expected_intersects_region') result = renderchecker.runTest('expected_intersects_region') self.report += renderchecker.report() self.assertTrue(result) # also try with symbol levels renderer.setUsingSymbolLevels(True) poly_layer.setRenderer(renderer) renderchecker = QgsMultiRenderChecker() renderchecker.setMapSettings(mapsettings) renderchecker.setControlPathPrefix('vectorlayerrenderer') renderchecker.setControlName('expected_intersects_region') result = renderchecker.runTest('expected_intersects_region') self.report += renderchecker.report() self.assertTrue(result)
def testRenderWithPainterClipRegionsMultiPolygon(self): poly_layer = QgsVectorLayer(os.path.join(TEST_DATA_DIR, 'polys.shp')) self.assertTrue(poly_layer.isValid()) sym1 = QgsFillSymbol.createSimple({ 'color': '#ff00ff', 'outline_color': '#000000', 'outline_width': '1' }) renderer = QgsSingleSymbolRenderer(sym1) poly_layer.setRenderer(renderer) mapsettings = QgsMapSettings() mapsettings.setOutputSize(QSize(400, 400)) mapsettings.setOutputDpi(96) mapsettings.setDestinationCrs( QgsCoordinateReferenceSystem('EPSG:3857')) mapsettings.setExtent( QgsRectangle(-13875783.2, 2266009.4, -8690110.7, 6673344.5)) mapsettings.setLayers([poly_layer]) region = QgsMapClippingRegion( QgsGeometry.fromWkt( 'MultiSurface (Polygon ((-10856627.66351187042891979 5625411.45629768911749125, -11083997.96136780828237534 4995770.63146586995571852, -10887235.20360786281526089 4357384.79517805296927691, -9684796.12840820662677288 4851477.9424419105052948, -10069576.63247209787368774 5428648.69853774644434452, -10856627.66351187042891979 5625411.45629768911749125)),Polygon ((-12045949.22152753174304962 5533588.83600971661508083, -12758667.65519132651388645 4868967.96535390708595514, -12478827.28859940730035305 4296169.71498607192188501, -11783598.87784760631620884 4077544.42858613422140479, -11223918.14466376602649689 4715930.26487395167350769, -11127723.01864779368042946 5673509.01930567622184753, -11359465.8222317285835743 5809056.69687363691627979, -12045949.22152753174304962 5533588.83600971661508083),(-11341975.79931973293423653 4790262.86224992945790291, -11722383.7976556234061718 4318032.24362606555223465, -12019714.18715953826904297 4606617.62167398259043694, -11757363.84347961470484734 4908320.51690589636564255, -11341975.79931973293423653 4790262.86224992945790291)))' )) region.setFeatureClip( QgsMapClippingRegion.FeatureClippingType.ClipPainterOnly) mapsettings.addClippingRegion(region) renderchecker = QgsMultiRenderChecker() renderchecker.setMapSettings(mapsettings) renderchecker.setControlPathPrefix('vectorlayerrenderer') renderchecker.setControlName('expected_painterclip_region_multi') result = renderchecker.runTest('expected_painterclip_region_multi') self.report += renderchecker.report() self.assertTrue(result) # also try with symbol levels renderer.setUsingSymbolLevels(True) poly_layer.setRenderer(renderer) renderchecker = QgsMultiRenderChecker() renderchecker.setMapSettings(mapsettings) renderchecker.setControlPathPrefix('vectorlayerrenderer') renderchecker.setControlName('expected_painterclip_region_multi') result = renderchecker.runTest('expected_painterclip_region_multi') self.report += renderchecker.report() self.assertTrue(result)
def testRenderClipRegion(self): layer = QgsPointCloudLayer( unitTestDataPath() + '/point_clouds/ept/rgb/ept.json', 'test', 'ept') self.assertTrue(layer.isValid()) layer.renderer().setPointSize(2) layer.renderer().setPointSizeUnit(QgsUnitTypes.RenderMillimeters) mapsettings = QgsMapSettings() mapsettings.setOutputSize(QSize(400, 400)) mapsettings.setOutputDpi(96) mapsettings.setDestinationCrs( QgsCoordinateReferenceSystem('EPSG:4326')) mapsettings.setExtent( QgsRectangle(152.977434544, -26.663017454, 152.977424882, -26.663009624)) mapsettings.setLayers([layer]) region = QgsMapClippingRegion( QgsGeometry.fromWkt( 'Polygon ((152.97742833685992991 -26.66301088198133584, 152.97742694456141521 -26.66301085776744983, 152.97742676295726483 -26.66301358182974468, 152.97742895431403554 -26.66301349708113833, 152.97742833685992991 -26.66301088198133584))' )) region.setFeatureClip( QgsMapClippingRegion.FeatureClippingType.ClipPainterOnly) region2 = QgsMapClippingRegion( QgsGeometry.fromWkt( 'Polygon ((152.97743215054714483 -26.66301111201326535, 152.97742715037946937 -26.66301116044103736, 152.97742754990858316 -26.66301436878107367, 152.97743264693181686 -26.66301491359353193, 152.97743215054714483 -26.66301111201326535))' )) region2.setFeatureClip( QgsMapClippingRegion.FeatureClippingType.ClipToIntersection) mapsettings.addClippingRegion(region) mapsettings.addClippingRegion(region2) renderchecker = QgsMultiRenderChecker() renderchecker.setMapSettings(mapsettings) renderchecker.setControlPathPrefix('pointcloudrenderer') renderchecker.setControlName('expected_clip_region') result = renderchecker.runTest('expected_clip_region') TestQgsPointCloudRgbRenderer.report += renderchecker.report() self.assertTrue(result)
def testRenderWithPainterClipRegions(self): raster_layer = QgsRasterLayer( os.path.join(TEST_DATA_DIR, 'rgb256x256.png')) self.assertTrue(raster_layer.isValid()) raster_layer.setCrs(QgsCoordinateReferenceSystem('EPSG:3857')) mapsettings = QgsMapSettings() mapsettings.setOutputSize(QSize(400, 400)) mapsettings.setOutputDpi(96) mapsettings.setDestinationCrs( QgsCoordinateReferenceSystem('EPSG:4326')) mapsettings.setExtent( QgsRectangle(0.0001451, -0.0001291, 0.0021493, -0.0021306)) mapsettings.setLayers([raster_layer]) region = QgsMapClippingRegion( QgsGeometry.fromWkt( 'Polygon ((0.00131242078273144 -0.00059281669806561, 0.00066744230712249 -0.00110186995774045, 0.00065145110524788 -0.00152830200772984, 0.00141369839460392 -0.00189076925022083, 0.00210931567614912 -0.00094195793899443, 0.00169354442740946 -0.00067810310806349, 0.00131242078273144 -0.00059281669806561))' )) region.setFeatureClip( QgsMapClippingRegion.FeatureClippingType.ClipPainterOnly) region2 = QgsMapClippingRegion( QgsGeometry.fromWkt( 'Polygon ((0.00067010750743492 -0.0007740503193111, 0.00064612070462302 -0.00151764120648011, 0.00153629760897587 -0.00158693641460339, 0.0014909892036645 -0.00063812510337699, 0.00106722235398754 -0.00055816909400397, 0.00067010750743492 -0.0007740503193111))' )) region2.setFeatureClip( QgsMapClippingRegion.FeatureClippingType.ClipToIntersection) mapsettings.addClippingRegion(region) mapsettings.addClippingRegion(region2) renderchecker = QgsMultiRenderChecker() renderchecker.setMapSettings(mapsettings) renderchecker.setControlPathPrefix('rasterlayerrenderer') renderchecker.setControlName('expected_painterclip_region') result = renderchecker.runTest('expected_painterclip_region') self.report += renderchecker.report() self.assertTrue(result)
def testLabelIntersectionGeometry(self): region = QgsMapClippingRegion( QgsGeometry.fromWkt('Polygon((0 0, 1 0, 1 1, 0 1, 0 0))')) region.setFeatureClip( QgsMapClippingRegion.FeatureClippingType.ClipToIntersection) region2 = QgsMapClippingRegion( QgsGeometry.fromWkt('Polygon((0 0, 0.1 0, 0.1 2, 0 2, 0 0))')) region2.setFeatureClip( QgsMapClippingRegion.FeatureClippingType.NoClipping) region3 = QgsMapClippingRegion( QgsGeometry.fromWkt('Polygon((0 0, 0.1 0, 0.1 2, 0 2, 0 0))')) region3.setFeatureClip( QgsMapClippingRegion.FeatureClippingType.ClipPainterOnly) rc = QgsRenderContext() geom, should_clip = QgsMapClippingUtils.calculateLabelIntersectionGeometry( [], rc) self.assertFalse(should_clip) self.assertTrue(geom.isNull()) geom, should_clip = QgsMapClippingUtils.calculateLabelIntersectionGeometry( [region], rc) self.assertTrue(should_clip) self.assertEqual(geom.asWkt(1), 'Polygon ((0 0, 1 0, 1 1, 0 1, 0 0))') # region2 is a Intersects type clipping region, should not apply here geom, should_clip = QgsMapClippingUtils.calculateLabelIntersectionGeometry( [region2], rc) self.assertFalse(should_clip) self.assertTrue(geom.isNull()) geom, should_clip = QgsMapClippingUtils.calculateLabelIntersectionGeometry( [region, region2], rc) self.assertTrue(should_clip) self.assertEqual(geom.asWkt(1), 'Polygon ((0 0, 1 0, 1 1, 0 1, 0 0))') # region3 is a PainterClip type clipping region, MUST be applied for labels geom, should_clip = QgsMapClippingUtils.calculateLabelIntersectionGeometry( [region, region2, region3], rc) self.assertTrue(should_clip) self.assertEqual(geom.asWkt(1), 'Polygon ((0.1 0, 0 0, 0 1, 0.1 1, 0.1 0))') rc.setCoordinateTransform( QgsCoordinateTransform(QgsCoordinateReferenceSystem('EPSG:3857'), QgsCoordinateReferenceSystem('EPSG:4326'), QgsProject.instance())) geom, should_clip = QgsMapClippingUtils.calculateLabelIntersectionGeometry( [region, region3], rc) self.assertTrue(should_clip) self.assertEqual( geom.asWkt(0), 'Polygon ((11132 0, 0 0, 0 111325, 11132 111325, 11132 0))')
def testPainterClipPath(self): region = QgsMapClippingRegion(QgsGeometry.fromWkt('Polygon((0 0, 1 0, 1 1, 0 1, 0 0))')) region.setFeatureClip(QgsMapClippingRegion.FeatureClippingType.ClipPainterOnly) region2 = QgsMapClippingRegion(QgsGeometry.fromWkt('Polygon((0 0, 0.1 0, 0.1 2, 0 2, 0 0))')) region2.setFeatureClip(QgsMapClippingRegion.FeatureClippingType.NoClipping) region3 = QgsMapClippingRegion(QgsGeometry.fromWkt('Polygon((0 0, 0.1 0, 0.1 2, 0 2, 0 0))')) region3.setFeatureClip(QgsMapClippingRegion.FeatureClippingType.ClipPainterOnly) rc = QgsRenderContext() for t in [QgsMapLayerType.VectorLayer, QgsMapLayerType.RasterLayer, QgsMapLayerType.MeshLayer, QgsMapLayerType.VectorTileLayer]: path, should_clip = QgsMapClippingUtils.calculatePainterClipRegion([], rc, t) self.assertFalse(should_clip) self.assertEqual(path.elementCount(), 0) for t in [QgsMapLayerType.VectorLayer, QgsMapLayerType.RasterLayer, QgsMapLayerType.MeshLayer, QgsMapLayerType.VectorTileLayer]: path, should_clip = QgsMapClippingUtils.calculatePainterClipRegion([region], rc, t) self.assertTrue(should_clip) self.assertEqual(QgsGeometry.fromQPolygonF(path.toFillPolygon()).asWkt(1), 'Polygon ((0 1, 1 1, 1 0, 0 0, 0 1))') # region2 is a Intersects type clipping region, should not apply for vector layers path, should_clip = QgsMapClippingUtils.calculatePainterClipRegion([region2], rc, QgsMapLayerType.VectorLayer) self.assertFalse(should_clip) self.assertEqual(path.elementCount(), 0) for t in [QgsMapLayerType.RasterLayer, QgsMapLayerType.MeshLayer, QgsMapLayerType.VectorTileLayer]: path, should_clip = QgsMapClippingUtils.calculatePainterClipRegion([region2], rc, t) self.assertTrue(should_clip) self.assertEqual(QgsGeometry.fromQPolygonF(path.toFillPolygon()).asWkt(1), 'Polygon ((0 1, 0.1 1, 0.1 -1, 0 -1, 0 1))') for t in [QgsMapLayerType.VectorLayer, QgsMapLayerType.RasterLayer, QgsMapLayerType.MeshLayer, QgsMapLayerType.VectorTileLayer]: path, should_clip = QgsMapClippingUtils.calculatePainterClipRegion([region, region2, region3], rc, t) self.assertTrue(should_clip) geom = QgsGeometry.fromQPolygonF(path.toFillPolygon()) geom.normalize() self.assertEqual(geom.asWkt(1), 'Polygon ((0 0, 0 1, 0.1 1, 0.1 0, 0 0))') rc.setMapToPixel(QgsMapToPixel(5, 10, 11, 200, 150, 0)) for t in [QgsMapLayerType.VectorLayer, QgsMapLayerType.RasterLayer, QgsMapLayerType.MeshLayer, QgsMapLayerType.VectorTileLayer]: path, should_clip = QgsMapClippingUtils.calculatePainterClipRegion([region, region3], rc, t) self.assertTrue(should_clip) self.assertEqual(QgsGeometry.fromQPolygonF(path.toFillPolygon()).asWkt(0), 'Polygon ((98 77, 98 77, 98 77, 98 77, 98 77))')