def test_polygonize_thresholds(self): """Test polygonize raster using gdal with some thresholds.""" raster_path = test_data_path('hazard', 'jakarta_flood_design.tif') inside_file_name, inside_layer_name, outside_file_name, \ outside_layer_name = polygonize_thresholds( raster_path, 0.5) # Syntactic sugar to ignore unused vars. _ = inside_layer_name _ = outside_layer_name driver = ogr.GetDriverByName('ESRI Shapefile') data_source = driver.Open(inside_file_name, 0) layer = data_source.GetLayer() feature_count = layer.GetFeatureCount() # print 'inside %s' % (inside_file_name) self.assertEquals(feature_count, 3) data_source2 = driver.Open(outside_file_name, 0) layer2 = data_source2.GetLayer() feature_count2 = layer2.GetFeatureCount() # print 'outside %s' % (outside_file_name) self.assertEquals(feature_count2, 1)
def test_polygonize_thresholds(self): """Test polygonize raster using gdal with some thresholds.""" raster_path = standard_data_path('hazard', 'jakarta_flood_design.tif') inside_file_name, inside_layer_name, outside_file_name, \ outside_layer_name = polygonize_thresholds( raster_path, 0.5) # Syntactic sugar to ignore unused vars. _ = inside_layer_name _ = outside_layer_name driver = ogr.GetDriverByName('ESRI Shapefile') data_source = driver.Open(inside_file_name, 0) layer = data_source.GetLayer() feature_count = layer.GetFeatureCount() # print 'inside %s' % (inside_file_name) self.assertEquals(feature_count, 3) data_source2 = driver.Open(outside_file_name, 0) layer2 = data_source2.GetLayer() feature_count2 = layer2.GetFeatureCount() # print 'outside %s' % (outside_file_name) self.assertEquals(feature_count2, 1)
def polygonize_gdal( raster, threshold_min=0.0, threshold_max=float('inf')): """ Function to polygonize raster. Areas (pixels) with threshold_min < pixel_values < threshold_max will be converted to polygons. :param raster: Raster layer :type raster: QgsRasterLayer :param threshold_min: Value that splits raster to flooded or not flooded. :type threshold_min: float :param threshold_max: Value that splits raster to flooded or not flooded. :type threshold_max: float :returns: Polygonal geometry :rtype: QgsGeometry """ # save qgis raster to disk base_name = unique_filename() file_name = base_name + '.tif' file_writer = QgsRasterFileWriter(file_name) pipe = QgsRasterPipe() provider = raster.dataProvider() if not pipe.set(provider.clone()): msg = "Cannot set pipe provider" raise GetDataError(msg) file_writer.writeRaster( pipe, provider.xSize(), provider.ySize(), provider.extent(), provider.crs()) ( inside_file_name, inside_layer_name, outside_file_name, outside_layer_name ) = polygonize_thresholds(file_name, threshold_min, threshold_max) inside_layer = \ QgsVectorLayer(inside_file_name, inside_layer_name, 'ogr') outside_layer = \ QgsVectorLayer(outside_file_name, outside_layer_name, 'ogr') if inside_layer.featureCount() == 0: return None, None else: return inside_layer, outside_layer
def test_split_by_polygon_in_out(self): """Test split_by_polygon in-out work""" raster_name = test_data_path( 'hazard', 'jakarta_flood_design.tif') exposure_name = test_data_path( 'exposure', 'roads_osm_4326.shp') qgis_exposure = QgsVectorLayer( exposure_name, 'EXPOSURE', 'ogr') inside_file_name, inside_layer_name, outside_file_name, \ outside_layer_name = polygonize_thresholds(raster_name, 0.1) polygon_in = \ QgsVectorLayer(inside_file_name, inside_layer_name, 'ogr') polygon_out = \ QgsVectorLayer(outside_file_name, outside_layer_name, 'ogr') layer = split_by_polygon_in_out( qgis_exposure, polygon_in, polygon_out, 'flooded', 1) feature_count = layer.featureCount() self.assertEqual(feature_count, 184) flooded = 0 iterator = layer.getFeatures() for feature in iterator: attributes = feature.attributes() if attributes[3] == 1: flooded += 1 self.assertEqual(flooded, 25)