コード例 #1
0
    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)
コード例 #2
0
ファイル: test_gdal_ogr_tools.py プロジェクト: sopac/inasafe
    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)
コード例 #3
0
ファイル: qgis_raster_tools.py プロジェクト: dynaryu/inasafe
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
コード例 #4
0
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
コード例 #5
0
    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)
コード例 #6
0
    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)