Exemplo n.º 1
0
def test_polygonize_4():

    src_ds = gdal.Open('data/polygonize_in.grd')
    src_band = src_ds.GetRasterBand(1)

    # Create a memory OGR datasource to put results in.
    mem_drv = ogr.GetDriverByName('Memory')
    mem_ds = mem_drv.CreateDataSource('out')

    mem_layer = mem_ds.CreateLayer('poly', None, ogr.wkbPolygon)

    fd = ogr.FieldDefn('DN', ogr.OFTInteger)
    mem_layer.CreateField(fd)

    # run the algorithm.
    result = gdal.Polygonize(src_band, None, mem_layer, 0, ["8CONNECTED=8"])
    assert result == 0, 'Polygonize failed'

    # Confirm we get the set of expected features in the output layer.

    expected_feature_number = 16
    assert mem_layer.GetFeatureCount() == expected_feature_number

    expect = [
        107, 123, 132, 115, 132, 115, 140, 148, 123, 140, 132, 156, 100, 101,
        102, 103
    ]

    tr = ogrtest.check_features_against_list(mem_layer, 'DN', expect)

    assert tr
def mask2json(mask):
    memdrv = gdal.GetDriverByName('MEM')
    src_ds = memdrv.Create('', mask.shape[1], mask.shape[0], 1)
    geom = [0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
    src_ds.SetGeoTransform(geom)
    band = src_ds.GetRasterBand(1)
    band.WriteArray(mask)
    dst_layername = "results"
    drv = ogr.GetDriverByName("geojson")
    dst_ds = drv.CreateDataSource('results.json')
    dst_layer = dst_ds.CreateLayer(dst_layername, srs=None)
    fieldName = 'class_id'
    fd = ogr.FieldDefn(fieldName, ogr.OFTInteger)
    dst_layer.CreateField(fd)
    dst_field = 0
    gdal.Polygonize(band, None, dst_layer, dst_field, [], callback=None)
    dst_ds.Destroy()
    logging.info(f'results.json已保存')
    with open('results.json', 'r') as f:
        res = f.read()
        res = json.loads(res)
        features = res.get('features')
        res['features'] = list(map(adjust_json, features))
        logging.info(res)
    return json.dumps(res, ensure_ascii=False)
Exemplo n.º 3
0
def raster2shp(classifiy_raster, output_dir, bkg_value=0):
    ds = gdal.Open(classifiy_raster, gdal.GA_ReadOnly)
    srcband = ds.GetRasterBand(1)
    maskband = srcband.GetMaskBand()

    out_shp = os.path.join(output_dir, f'{Path(classifiy_raster).stem}.shp')
    drv = ogr.GetDriverByName('ESRI Shapefile')
    dst_ds = drv.CreateDataSource(out_shp)
    dst_srs = osr.SpatialReference()
    dst_srs.ImportFromWkt(ds.GetProjection())

    dst_layername = 'out'
    dst_layer = dst_ds.CreateLayer(dst_layername, srs=dst_srs)
    dst_fieldname = 'Category'
    fd = ogr.FieldDefn(dst_fieldname, ogr.OFTInteger)
    dst_layer.CreateField(fd)
    dst_field = 0
    options = []
    # 参数:输入栅格图像波段、掩码图像波段、矢量化后的矢量图层、需要将值写入属性字段的索引,比如Category索引为0、算法选项、进度条回调函数、进度条参数
    gdal.Polygonize(srcband, maskband, dst_layer, dst_field, options)

    ds = None

    # Remove backgroud value from converted shapefile
    pFeaturelayer = dst_ds.GetLayer(0)
    strFilter = f"Category = '{bkg_value}'"
    pFeaturelayer.SetAttributeFilter(strFilter)
    for pFeature in pFeaturelayer:
        pFeatureFID = pFeature.GetFID()
        pFeaturelayer.DeleteFeature(int(pFeatureFID))
Exemplo n.º 4
0
def polygonize(M, georef):
    """
    Polygonize a mask.
    Args:
        M: a numpy 'mask' array.
        georef: GDAL style georeference of mask.
    Returns:
        OGR datasource, OGR layer
    """
    # TODO: supply srs
    # polygonize an input Mask (bool or uint8 -todo, add more types)
    dst_fieldname = 'DN'
    # create a GDAL memory raster
    mem_driver = gdal.GetDriverByName("MEM")
    mask_ds = mem_driver.Create("dummy", int(M.shape[1]), int(M.shape[0]), 1,
                                gdal.GDT_Byte)
    mask_ds.SetGeoTransform(georef)
    mask_ds.GetRasterBand(1).WriteArray(M)  # write zeros to output
    # Ok - so now polygonize that - use the mask as ehem... mask...
    m_drv = ogr.GetDriverByName("Memory")
    ds = m_drv.CreateDataSource("dummy")
    lyr = ds.CreateLayer("polys", None, ogr.wkbPolygon)
    fd = ogr.FieldDefn(dst_fieldname, ogr.OFTInteger)
    lyr.CreateField(fd)
    dst_field = 0
    gdal.Polygonize(mask_ds.GetRasterBand(1), mask_ds.GetRasterBand(1), lyr,
                    dst_field)
    lyr.ResetReading()
    return ds, lyr
Exemplo n.º 5
0
def polygonize(img, shp_path):
    # mapping between gdal type and ogr field type
    type_mapping = {
        gdal.GDT_Byte: ogr.OFTInteger,
        gdal.GDT_UInt16: ogr.OFTInteger,
        gdal.GDT_Int16: ogr.OFTInteger,
        gdal.GDT_UInt32: ogr.OFTInteger,
        gdal.GDT_Int32: ogr.OFTInteger,
        gdal.GDT_Float32: ogr.OFTReal,
        gdal.GDT_Float64: ogr.OFTReal,
        gdal.GDT_CInt16: ogr.OFTInteger,
        gdal.GDT_CInt32: ogr.OFTInteger,
        gdal.GDT_CFloat32: ogr.OFTReal,
        gdal.GDT_CFloat64: ogr.OFTReal,
    }

    tif = os.path.split(img)[1]
    # print("reading {}...".format(tif))
    ds = gdal.Open(img)
    prj = ds.GetProjection()
    srcband = ds.GetRasterBand(1)
    # create shapefile datasource from geotiff file
    shp = os.path.split(shp_path)[1]
    print("creating {}...".format(shp))
    dst_layername = "Shape"
    drv = ogr.GetDriverByName("ESRI Shapefile")
    dst_ds = drv.CreateDataSource(shp_path)
    srs = osr.SpatialReference(wkt=prj)

    dst_layer = dst_ds.CreateLayer(dst_layername, srs=srs)
    raster_field = ogr.FieldDefn("level", type_mapping[srcband.DataType])
    dst_layer.CreateField(raster_field)
    gdal.Polygonize(srcband, srcband, dst_layer, 0, [], callback=None)
Exemplo n.º 6
0
def createGeoJSONFromRaster(geoJsonFileName,
                            array2d,
                            geom,
                            proj,
                            layerName="BuildingID",
                            fieldName="BuildingID"):
    memdrv = gdal.GetDriverByName('MEM')
    src_ds = memdrv.Create('', array2d.shape[1], array2d.shape[0], 1)
    src_ds.SetGeoTransform(geom)
    src_ds.SetProjection(proj)
    band = src_ds.GetRasterBand(1)
    band.WriteArray(array2d)

    dst_layername = "BuildingID"
    drv = ogr.GetDriverByName("geojson")
    dst_ds = drv.CreateDataSource(geoJsonFileName)
    dst_layer = dst_ds.CreateLayer(layerName, srs=None)

    fd = ogr.FieldDefn(fieldName, ogr.OFTInteger)
    dst_layer.CreateField(fd)
    dst_field = 1

    gdal.Polygonize(band, None, dst_layer, dst_field, [], callback=None)

    return
Exemplo n.º 7
0
def polygonize(shapepath, file, rasterpath):
    srcarray,projection,geotrans, shape = GetRasterDataSource(file, rasterpath)
    print "Start polygonizing.."
    start = time.time()
    srcarray[srcarray > 1] = 0 #we are interested in the class 1, we put everything else to 0
    drv = gdal.GetDriverByName('MEM')
    srs = osr.SpatialReference()
    srs.ImportFromWkt(projection)
    src_ds  = drv.Create('', shape[1], shape[0], 1, gdal.GDT_UInt16)
    src_ds.SetGeoTransform(geotrans)

    src_ds.SetProjection(projection)
    # gdal_array.BandWriteArray(src_ds.GetRasterBand(1), srcarray.T)
    gdal_array.BandWriteArray(src_ds.GetRasterBand(1), srcarray)

    srcband = src_ds.GetRasterBand(1)

    drv = ogr.GetDriverByName("ESRI Shapefile")
    dst_ds = drv.CreateDataSource(shapepath + file + ".shp")

    dst_layer = dst_ds.CreateLayer(shapepath + file, srs = srs)
    new_field = ogr.FieldDefn("type", ogr.OFTInteger)
    dst_layer.CreateField(new_field)

    new_field = None

    new_field = ogr.FieldDefn("area", ogr.OFTReal)

    # new_field.SetWidth(32)
    # new_field.SetPrecision(2) #added line to set precision (for floating point)
    dst_layer.CreateField(new_field)

    gdal.Polygonize(srcband, srcband, dst_layer, 0, [], callback = None )
    print "Number of features detected: ", dst_layer.GetFeatureCount()

    for feature in dst_layer:
        geom = feature.GetGeometryRef()
        area = geom.GetArea()
        feature.SetField("area", area)
        dst_layer.SetFeature(feature)

        # Filter per size
        if (geom.GetArea() < 1) or (geom.GetArea() > 100):
            dst_layer.DeleteFeature(feature.GetFID())


    dst_layer.SyncToDisk()
    dst_ds.ExecuteSQL("REPACK " + file)

    print "Number of features after deleting: ", dst_layer.GetFeatureCount()
    dst_ds = None

    print "*---------------------------*"
    print "Shapefile correctly saved in: " + shapepath
    end = time.time()
    print "Time for polygonizing: "
    print (end-start)
Exemplo n.º 8
0
    def boundary(self, file_name, array):

        src_ds = gdal.Open(file_name + '_BDR.tif')
        srcband = src_ds.GetRasterBand(1)
        data = srcband.ReadAsArray()
        data = data > 0
        drv = ogr.GetDriverByName("ESRI Shapefile")
        dst_ds = drv.CreateDataSource(file_name + ".shp")
        dst_layer = dst_ds.CreateLayer(file_name, srs=None)
        gdal.Polygonize(srcband, data, dst_layer, -1, [], callback=None)
Exemplo n.º 9
0
    def rast2vect(self, rasterTexture, legend):
        "convert raster to vector"
        gdal.AllRegister()
        options = []
        # open the image
        rasterTexture = str(rasterTexture)
        srcRaster = gdal.Open(rasterTexture, GA_ReadOnly)
        srcband = srcRaster.GetRasterBand(1)
        spatialReference = osr.SpatialReference()
        spatialReference.ImportFromWkt(srcRaster.GetProjectionRef())
        # 	Create output file.

        pathSource = os.path.dirname(rasterTexture)
        fileName = os.path.splitext(os.path.basename(rasterTexture))[0]

        driver = ogr.GetDriverByName('ESRI Shapefile')
        dstPath = os.path.join(pathSource, fileName + ".shp")
        dstFile = driver.CreateDataSource(dstPath)
        if os.path.exists(dstPath) == False:
            #Find or create destination layer.
            dstLayer = dstFile.CreateLayer("layer", spatialReference)
            #Create texture int code field from raster value
            fieldDef = ogr.FieldDefn("code", ogr.OFTInteger)
            dstLayer.CreateField(fieldDef)
            dst_field = 0
            #Polygonize
            prog_func = gdal.TermProgress
            result = gdal.Polygonize(srcband,
                                     None,
                                     dstLayer,
                                     dst_field,
                                     options,
                                     callback=prog_func)
            #Create texture label field
            fieldLabel = ogr.FieldDefn('label_txt', ogr.OFTString)
            fieldLabel.SetWidth(50)
            dstLayer.CreateField(fieldLabel)
            #fieldLabel = 1
            codeList = [line.split("=") for line in legend[1:-1]]
            codeDict = {int(v[0]): v[1] for (v) in codeList}
            for i in range(dstLayer.GetFeatureCount()):
                feature = dstLayer.GetFeature(i)
                code = feature.GetField("code")
                iIndex = feature.GetFieldIndex("label_txt")
                feature.SetField(iIndex, str(codeDict[code]))
                dstLayer.SetFeature(feature)
                feature.Destroy()
            dstFile.Destroy()
            return dstPath
        else:
            self.textEdit.append(
                """<b>There is a file with the same output name.
			Vector texture file will not be created. Only the raster texture
			file will be processed file.<\b>""")
            return 'None'
Exemplo n.º 10
0
def raster2polygon(inRaster, outPoly):
    src_ds = gdal.Open(inRaster)
    srcband = src_ds.GetRasterBand(1)
    drv = ogr.GetDriverByName("ESRI Shapefile")
    dst_ds = drv.CreateDataSource(outPoly + ".shp")
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(4326)

    # create the layer
    dst_layer = dst_ds.CreateLayer(outPoly, srs)
    gdal.Polygonize(srcband, srcband, dst_layer, -1, [], callback=None)
def create_shp_from_mask(shp_fname, mask_fname):
    # Create a shapefile from the mask that was just created
    # Initialize the information for the shapefile
    driver = ogr.GetDriverByName("ESRI Shapefile")
    shape_file = driver.CreateDataSource(shp_fname + ".shp")
    layer = shape_file.CreateLayer(shp_fname, srs=None)

    # Open the mask and polygonize it into the specified shape file
    mask = gdal.Open(mask_fname)
    mask_band = mask.GetRasterBand(1)
    gdal.Polygonize(mask_band, mask_band, layer, -1, [], callback=None)
Exemplo n.º 12
0
def netcdf2boundary_mask(ncFile, geographic):

    ### Extract metadata
    meta = nc2meta(ncFile)
    cols = meta['cols']
    rows = meta['rows']
    proj = osr.SpatialReference()
    proj.ImportFromEPSG(meta['epsg'])
    geoTrans = \
      (meta['minX'], meta['pixelSize'], 0, meta['maxY'], 0, -meta['pixelSize'])

    ### Reading time series
    dataset = nc.Dataset(ncFile, 'r')
    image = dataset.variables['image'][:]
    dataset.close()

    ### Save in memory
    data = image[0, :, :] / image[0, :, :]
    image = None
    gdalDriver = gdal.GetDriverByName('Mem')
    outRaster = gdalDriver.Create('out', rows, cols, 1, gdal.GDT_Byte)
    outRaster.SetGeoTransform(geoTrans)
    outRaster.SetProjection(proj.ExportToWkt())
    outBand = outRaster.GetRasterBand(1)
    outBand.WriteArray(data)
    inBand = None
    data = None

    ### Polygonize the raster image
    inBand = outRaster.GetRasterBand(1)
    ogrDriver = ogr.GetDriverByName('Memory')
    outVector = ogrDriver.CreateDataSource('out')
    outLayer = outVector.CreateLayer('boundary', srs=proj)
    fieldDefinition = ogr.FieldDefn('ID', ogr.OFTInteger)
    outLayer.CreateField(fieldDefinition)
    gdal.Polygonize(inBand, inBand, outLayer, 0, [], None)
    outRaster = None

    ### Extract geometry from layer
    inSpatialRef = outLayer.GetSpatialRef()
    multipolygon = ogr.Geometry(ogr.wkbMultiPolygon)
    for outFeature in outLayer:
        geometry = outFeature.GetGeometryRef()
        multipolygon.AddGeometry(geometry)
        outFeature = None
    outLayer = None

    ### Convert geometry from projected to geographic coordinates (if requested)
    if geographic == True:
        (multipolygon, outSpatialRef) = \
          geometry_proj2geo(multipolygon, inSpatialRef)
        return (multipolygon, outSpatialRef)
    else:
        return (multipolygon, inSpatialRef)
Exemplo n.º 13
0
def geotiff2boundary_ext(inGeotiff, maskFile, geographic):

  # Extract metadata
  (spatialRef, gt, shape, pixel) = raster_meta(inGeotiff)
  epsg = int(spatialRef.GetAttrValue('AUTHORITY', 1))
  (data, colFirst, rowsFirst, geoTrans, proj) = \
    geotiff2boundary_mask(inGeotiff, epsg, None)
  (rows, cols) = data.shape

  # Save in mask file (if defined)
  if maskFile is not None:
    gdalDriver = gdal.GetDriverByName('GTiff')
    outRaster = gdalDriver.Create(maskFile, rows, cols, 1, gdal.GDT_Byte)
    outRaster.SetGeoTransform(geoTrans)
    outRaster.SetProjection(proj.ExportToWkt())
    outBand = outRaster.GetRasterBand(1)
    outBand.WriteArray(data)
    outRaster = None

  # Save in memory
  gdalDriver = gdal.GetDriverByName('Mem')
  outRaster = gdalDriver.Create('out', rows, cols, 1, gdal.GDT_Byte)
  outRaster.SetGeoTransform(geoTrans)
  outRaster.SetProjection(proj.ExportToWkt())
  outBand = outRaster.GetRasterBand(1)
  outBand.WriteArray(data)
  data = None

  # Polygonize the raster image
  inBand = outRaster.GetRasterBand(1)
  ogrDriver = ogr.GetDriverByName('Memory')
  outVector = ogrDriver.CreateDataSource('out')
  outLayer = outVector.CreateLayer('boundary', srs=proj)
  fieldDefinition = ogr.FieldDefn('ID', ogr.OFTInteger)
  outLayer.CreateField(fieldDefinition)
  gdal.Polygonize(inBand, inBand, outLayer, 0, [], None)
  outRaster = None

  # Extract geometry from layer
  inSpatialRef = outLayer.GetSpatialRef()
  multipolygon = ogr.Geometry(ogr.wkbMultiPolygon)
  for outFeature in outLayer:
    geometry = outFeature.GetGeometryRef()
    multipolygon.AddGeometry(geometry)
    outFeature = None
  outLayer = None

  # Convert geometry from projected to geographic coordinates (if requested)
  if geographic == True:
    (multipolygon, outSpatialRef) = \
      geometry_proj2geo(multipolygon, inSpatialRef)
    return (multipolygon, outSpatialRef)
  else:
    return (multipolygon, inSpatialRef)
Exemplo n.º 14
0
def polygonize_1(is_int_polygonize=True):

    src_ds = gdal.Open('data/polygonize_in.grd')
    src_band = src_ds.GetRasterBand(1)

    # Create a memory OGR datasource to put results in.
    mem_drv = ogr.GetDriverByName('Memory')
    mem_ds = mem_drv.CreateDataSource('out')

    mem_layer = mem_ds.CreateLayer('poly', None, ogr.wkbPolygon)

    fd = ogr.FieldDefn('DN', ogr.OFTInteger)
    mem_layer.CreateField(fd)

    # run the algorithm.
    if is_int_polygonize:
        result = gdal.Polygonize(src_band, src_band.GetMaskBand(), mem_layer,
                                 0)
    else:
        result = gdal.FPolygonize(src_band, src_band.GetMaskBand(), mem_layer,
                                  0)
    if result != 0:
        gdaltest.post_reason('Polygonize failed')
        return 'fail'

    # Confirm we get the set of expected features in the output layer.

    expected_feature_number = 13
    if mem_layer.GetFeatureCount() != expected_feature_number:
        gdaltest.post_reason(
            'GetFeatureCount() returned %d instead of %d' %
            (mem_layer.GetFeatureCount(), expected_feature_number))
        return 'fail'

    expect = [107, 123, 115, 115, 140, 148, 123, 140, 156, 100, 101, 102, 103]

    tr = ogrtest.check_features_against_list(mem_layer, 'DN', expect)

    # check at least one geometry.
    if tr:
        mem_layer.SetAttributeFilter('dn = 156')
        feat_read = mem_layer.GetNextFeature()
        if ogrtest.check_feature_geometry(
                feat_read,
                'POLYGON ((440720 3751200,440720 3751020,440900 3751020,440900 3751200,440720 3751200),(440780 3751140,440840 3751140,440840 3751080,440780 3751080,440780 3751140))'
        ) != 0:
            tr = 0
        feat_read.Destroy()

    if tr:
        return 'success'
    else:
        return 'fail'
Exemplo n.º 15
0
def vectorize_labels_file_io(labeled_file,
                             out_ds,
                             out_layer,
                             out_format,
                             out_dsco=[],
                             out_lco=[],
                             id_attribute='bspot_id',
                             quiet=False):
    # This method does exactly the same as could be done with gdal_polygonize.py

    src_ds = gdal.Open(labeled_file)
    src_band = src_ds.GetRasterBand(1)

    # Create a memory OGR datasource to put results in.
    try:
        gdal.PushErrorHandler('CPLQuietErrorHandler')
        dst_ds = ogr.Open(out_ds, update=1)
        gdal.PopErrorHandler()
    except:
        dst_ds = None

    if not dst_ds:
        dst_drv = ogr.GetDriverByName(out_format)
        dst_ds = dst_drv.CreateDataSource(out_ds, options=out_dsco)

    srs = src_ds.GetSpatialRef()
    dst_layer = dst_ds.CreateLayer(out_layer,
                                   geom_type=ogr.wkbPolygon,
                                   srs=srs,
                                   options=out_lco)

    fd = ogr.FieldDefn(id_attribute, ogr.OFTInteger)
    dst_layer.CreateField(fd)

    # Use 8-connectedness
    options = ['8CONNECTED=8']

    # run the algorithm.
    if quiet:
        progress_callback = None
    else:
        progress_callback = gdal.TermProgress_nocb
    result = gdal.Polygonize(src_band,
                             src_band.GetMaskBand(),
                             dst_layer,
                             0,
                             options,
                             callback=progress_callback)

    src_band = None
    src_ds = None
    dst_ds = None
Exemplo n.º 16
0
def image_segmentation(image,
                       scale_param=10,
                       min_area=9,
                       max_area=None,
                       output=None,
                       of='ESRI Shapefile',
                       overwrite=True):
    # type: (str, int, int, int, str, str, bool) -> np.array
    """
    Use the Felsenszwalb algorithm for image segmentation. \n
    Original publication here: http://vision.stanford.edu/teaching/cs231b_spring1415/papers/IJCV2004_FelzenszwalbHuttenlocher.pdf \n
    Implementation here: https://scikit-image.org/docs/0.14.x/api/skimage.segmentation.html#skimage.segmentation.felzenszwalb

    :param image: Input image
    :param scale_param: The number of produced segments as well as their size can only be controlled indirectly through this
            parameter. Higher values result in larger clusters.
    :param min_area: Minimum segment size (in pixels)
    :param max_area: Maximum segment size (in pixels)
    :param output: Output name in case segments shall be exported
    :param of: Output format according to OGR driver standard
    :param overwrite: Overwrite output file, if it already exists
    :return:
    """
    img = io.imread(image)
    # img = exposure.equalize_hist(image)
    if get_raster_properties(image, dictionary=True)['bandnum'] > 1:
        segments = felzenszwalb(img,
                                multichannel=True,
                                scale=scale_param,
                                min_size=min_area)
    else:
        segments = felzenszwalb(img,
                                multichannel=False,
                                scale=scale_param,
                                min_size=min_area)
    if max_area:
        segments = remove_large_areas(segments, max_area)
    if output:
        from basic_functions.vector_tools import create_ds, close_rings
        temp = output.replace(os.path.splitext(output)[-1], '__TEMP.tif')
        export_image(temp, segments, image)
        ds = gdal.Open(temp)
        data_band = ds.GetRasterBand(1)
        sr = osr.SpatialReference()
        sr.ImportFromEPSG(get_epsg(image))
        out_ds, out_lyr = create_ds(output, of, ogr.wkbPolygon, sr, overwrite)
        gdal.Polygonize(data_band, None, out_lyr, -1, [], callback=None)
        out_lyr = None
        out_ds = None
        ds = None
        close_rings(output)
    return segments
Exemplo n.º 17
0
def polygonalize_raster(raster_path, target_vector_path):
    """Polygonalize `raster_path` to `target_vector_path` gpkg."""
    raster = gdal.OpenEx(raster_path, gdal.OF_RASTER)
    band = raster.GetRasterBand(1)
    gpkg_driver = ogr.GetDriverByName('gpkg')
    vector = gpkg_driver.CreateDataSource(target_vector_path)
    layer_name = os.path.basename(os.path.splitext(target_vector_path)[0])
    raster_srs = osr.SpatialReference(raster.GetProjection())
    target_layer = vector.CreateLayer(layer_name, raster_srs, ogr.wkbPolygon)
    target_layer.CreateField(ogr.FieldDefn('pix_val', ogr.OFTInteger))
    rasterize_callback = pygeoprocessing._make_logger_callback(
        "polygonalizing %.1f%% complete")
    gdal.Polygonize(band, None, target_layer, 0, callback=rasterize_callback)
Exemplo n.º 18
0
def vectorize_tiff(main_path, shp_name, ds_tiff):
    band = ds_tiff.GetRasterBand(1)
    dst_ds_shp = driver_shp.CreateDataSource((main_path+"/" + shp_name + ".shp"))
    srs = osr.SpatialReference()
    srs.ImportFromWkt(ds_tiff.GetProjectionRef())
    dst_layer = dst_ds_shp.CreateLayer(shp_name, geom_type=ogr.wkbPolygon, srs=srs)
    newField = ogr.FieldDefn('value', ogr.OFTInteger)
    dst_layer.CreateField(newField)
    gdal.Polygonize(band, None, dst_layer, 0, [], callback=None)
    dst_ds_shp.Destroy()
    band = None
    ds_tiff = None
    dst_ds_shp = None
Exemplo n.º 19
0
def dissolve_polygon(raster, shp):
    """
    Needs work.

    :param raster: use karst_raster or any soil raster.  We just need the GT object
    :param shp: shp file to be dissolved
    :return: raster object of dissolved shp file.
    """
    gt = raster.gt()
    x_min = gt[0]
    y_max = gt[3]
    x_res = raster.data.RasterXSize
    y_res = raster.data.RasterYSize
    x_max = x_min + gt[1] * x_res
    y_min = y_max + gt[5] * y_res
    pixel_width = gt[1]

    if not os.path.exists('temp_shapefiles'):
        os.mkdir('temp_shapefiles')

    out_file = "temp_shapefiles//karst_flat.shp"
    target_ds = gdal.GetDriverByName('MEM').Create('', x_res, y_res, 1, gdal.GDT_Byte)
    target_ds.SetGeoTransform((x_min, pixel_width, 0, y_min, 0, pixel_width))
    band = target_ds.GetRasterBand(1)
    band.SetNoDataValue(0)
    band.FlushCache()
    gdal.RasterizeLayer(target_ds, [1], shp.lyr, options=["ATTRIBUTE=Gridcode"])
    driver = ogr.GetDriverByName("ESRI Shapefile")
    out_ds = driver.CreateDataSource(out_file)
    srs = osr.SpatialReference()
    srs.ImportFromProj4(shp.prj4)
    out_lyr = out_ds.CreateLayer(out_file, srs=srs)
    fd = ogr.FieldDefn("DN", ogr.OFTInteger)
    out_lyr.CreateField(fd)
    gdal.Polygonize(band, band, out_lyr, -1, [])
    multi = ogr.Geometry(ogr.wkbMultiPolygon)
    for feat in out_lyr:
        if feat.geometry():
            feat.geometry().CloseRings()  # this copies the first point to the end
            wkt = feat.geometry().ExportToWkt()
            multi.AddGeometryDirectly(ogr.CreateGeometryFromWkt(wkt))
            out_lyr.DeleteFeature(feat.GetFID())
    union = multi.UnionCascaded()
    out_feat = ogr.Feature(out_lyr.GetLayerDefn())
    out_feat.SetGeometry(union)
    out_lyr.CreateFeature(out_feat)

    flat = dbShp(path=out_file)
    target_ds = None
    return flat
def Raster_to_Polygon(input_file, output_file):
    gdal.UseExceptions()
    src_ds = gdal.Open(input_file)
    if src_ds is None:
        raise Exception('Unable to open {}'.format(src_filename))

    srcband = src_ds.GetRasterBand(1)
    srd = srcband.GetMaskBand()

    dst_layername = output_file
    drv = ogr.GetDriverByName("ESRI Shapefile")
    dst_ds = drv.CreateDataSource(dst_layername + ".shp")
    dst_layer = dst_ds.CreateLayer(dst_layername, srs=None)
    gdal.Polygonize(srcband, srd, dst_layer, -1, [], callback=None)
Exemplo n.º 21
0
def make_shp(imgname):
    STATIC_FOLDER = '/app/app/static/'
    app.config['STATIC_FOLDER'] = STATIC_FOLDER
    origname = STATIC_FOLDER + imgname + '.tif'
    alignedname = STATIC_FOLDER + imgname + '_blackalign.png'
    alignedname_tif = STATIC_FOLDER + imgname + '_blackalign.tif'
    zipname = STATIC_FOLDER + imgname + '.zip'

    ziplist = [
        STATIC_FOLDER + imgname + '_shape.dbf',
        STATIC_FOLDER + imgname + '_shape.prj',
        STATIC_FOLDER + imgname + '_shape.shp',
        STATIC_FOLDER + imgname + '_shape.shx'
    ]

    source = gdal.Open(origname)
    srcbnd = np.array(source.GetRasterBand(1).ReadAsArray())
    alignments = gdal.Open(alignedname)
    alignband = np.array(alignments.GetRasterBand(1).ReadAsArray())

    dst_ds = gdal.GetDriverByName('GTiff').Create(alignedname_tif,
                                                  srcbnd.shape[1],
                                                  srcbnd.shape[0],
                                                  3,
                                                  gdal.GDT_Byte,
                                                  options=[
                                                      'PHOTOMETRIC=RGB',
                                                      'PROFILE=GeoTIFF',
                                                  ])
    gdalnumeric.CopyDatasetInfo(source, dst_ds)
    dst_ds.GetRasterBand(1).WriteArray(alignband)
    dst_ds.FlushCache()

    src_ds = dst_ds
    proj = osr.SpatialReference(wkt=src_ds.GetProjection())
    dst_layername = imgname + "_shape"
    srcband = src_ds.GetRasterBand(1)

    drv = ogr.GetDriverByName("ESRI Shapefile")
    dst_ds = drv.CreateDataSource(STATIC_FOLDER + dst_layername + ".shp")
    dst_layer = dst_ds.CreateLayer(dst_layername,
                                   proj,
                                   geom_type=ogr.wkbMultiLineString)
    gdal.Polygonize(srcband, None, dst_layer, -1, [], callback=None)

    dst_ds.FlushCache()

    with ZipFile(zipname, 'w') as zip:
        for file in ziplist:
            zip.write(file)
Exemplo n.º 22
0
def polygonize_stats(geo_files):
    for geo_file in geo_files:
        for raster in geo_file['rasters']:
            grid = gdal.Open(raster['stat_grid'])
            band = grid.GetRasterBand(1)
            driver = ogr.GetDriverByName('ESRI Shapefile')
            if os.path.exists(raster['stat_shp']):
                driver.DeleteDataSource(raster['stat_shp'])
            outshp = driver.CreateDataSource(raster['stat_shp'])
            ref = osr.SpatialReference()
            ref.ImportFromEPSG(4326)
            outlr = outshp.CreateLayer('poly', srs = ref)
            outlr.CreateField(ogr.FieldDefn('sig', ogr.OFTInteger))
            gdal.Polygonize(band, None, outlr, 0, [], callback=None)
Exemplo n.º 23
0
 def raster2shp(rasterfile,
                vectorshp,
                layername=None,
                fieldname=None,
                band_num=1,
                mask='default'):
     """Convert raster to ESRI shapefile"""
     FileClass.remove_files(vectorshp)
     FileClass.check_file_exists(rasterfile)
     # this allows GDAL to throw Python Exceptions
     gdal.UseExceptions()
     src_ds = gdal.Open(rasterfile)
     if src_ds is None:
         print('Unable to open %s' % rasterfile)
         sys.exit(1)
     try:
         srcband = src_ds.GetRasterBand(band_num)
     except RuntimeError as e:
         # for example, try GetRasterBand(10)
         print('Band ( %i ) not found, %s' % (band_num, e))
         sys.exit(1)
     if mask == 'default':
         maskband = srcband.GetMaskBand()
     elif mask is None or mask.upper() == 'NONE':
         maskband = None
     else:
         mask_ds = gdal.Open(mask)
         maskband = mask_ds.GetRasterBand(1)
     #  create output datasource
     if layername is None:
         layername = FileClass.get_core_name_without_suffix(rasterfile)
     drv = ogr_GetDriverByName(str('ESRI Shapefile'))
     dst_ds = drv.CreateDataSource(vectorshp)
     srs = None
     if src_ds.GetProjection() != '':
         srs = osr_SpatialReference()
         srs.ImportFromWkt(src_ds.GetProjection())
     dst_layer = dst_ds.CreateLayer(str(layername), srs=srs)
     if fieldname is None:
         fieldname = layername.upper()
     fd = ogr_FieldDefn(str(fieldname), OFTInteger)
     dst_layer.CreateField(fd)
     dst_field = 0
     result = gdal.Polygonize(srcband,
                              maskband,
                              dst_layer,
                              dst_field, ['8CONNECTED=8'],
                              callback=None)
     return result
Exemplo n.º 24
0
def raster_polygonize(mask_temp_mp, shp_temp_mp):

    src_ds = gdal.Open(mask_temp_mp)
    srcband = src_ds.GetRasterBand(1)
    dst_layername = shp_temp_mp
    drv = ogr.GetDriverByName("ESRI Shapefile")
    dst_ds = drv.CreateDataSource(dst_layername + ".shp")
    dst_layer = dst_ds.CreateLayer(dst_layername, srs=None)
    fd = ogr.FieldDefn("DN", ogr.OFTInteger)
    dst_layer.CreateField(fd)
    dst_field = dst_layer.GetLayerDefn().GetFieldIndex("DN")
    gdal.Polygonize(srcband, None, dst_layer, 0, [], callback=None)
    del src_ds, dst_ds, dst_layer, dst_field

    return dst_layername
Exemplo n.º 25
0
def binary_raster_to_vector(binary_raster_path,
                            output_vector_path,
                            driver="ESRI Shapefile"):
    """ Convert a binary raster to a vector """

    # Open the binary tile as read-only and get the driver GDAL is using to access the data
    binary_tile_fh = gdal.Open(binary_raster_path, gdal.GA_ReadOnly)
    input_raster_driver = binary_tile_fh.GetDriver()

    # Pull Metadata associated with the binary tile so we can create the output raster later
    raster_geotransform = binary_tile_fh.GetGeoTransform()
    raster_projection = binary_tile_fh.GetProjection()
    cols = binary_tile_fh.RasterXSize  # Get the number of columns
    rows = binary_tile_fh.RasterYSize  # Get the number of rows
    binary_tile = binary_tile_fh.GetRasterBand(1)  # Get the raster band
    binary_nodata = binary_tile.GetNoDataValue(
    )  # Get the NoData value so we can set our mask

    # Create the spatial ref for the output vector
    osr_ref = osr.SpatialReference()
    osr_ref.ImportFromWkt(raster_projection)

    # Create a memory OGR datasource to put results in.
    vect_driver = ogr.GetDriverByName(driver)
    vect_datasrc = vect_driver.CreateDataSource(output_vector_path)

    # Create the layer
    vect_layer = vect_datasrc.CreateLayer('poly', osr_ref, ogr.wkbPolygon)

    # Create a field
    fd = ogr.FieldDefn('value', ogr.OFTInteger)
    vect_layer.CreateField(fd)

    # run the algorithm.
    logger.info("  Runing Polygonize()...")
    logger.info("    converting raster to vector...")
    result = gdal.Polygonize(binary_tile, binary_tile.GetMaskBand(),
                             vect_layer, 0)
    logger.info("      done.")

    # Clean up
    logger.info("    cleaning up and closing out of datasources...")
    vect_layer = None
    vect_datasrc = None
    binary_tile = None
    binary_tile_fh = None
    logger.info("      done.")
    return output_vector_path
Exemplo n.º 26
0
def RasterToVector(tiffile,shpfile,maskfile = None):
    dataset = gdal.Open(tiffile)
    porj = dataset.GetProjection()
    srcband = dataset.GetRasterBand(1)
    srcband.SetNoDataValue(0)
    driver = ogr.GetDriverByName("ESRI Shapefile")
    if os.path.exists(shpfile):
        driver.DeleteDataSource(shpfile)
    outDatasource = driver.CreateDataSource(shpfile)
    srs = osr.SpatialReference()
    srs.ImportFromWkt(porj)
    outLayer = outDatasource.CreateLayer("polygonized", srs = srs)
    oFieldID = ogr.FieldDefn('DN',ogr.OFTInteger)
    outLayer.CreateField(oFieldID, 1)
    gdal.Polygonize( srcband, srcband, outLayer,0 , [], callback=None )
    outDatasource.Destroy()
Exemplo n.º 27
0
def geojson_from_preds(file_name,
                       preds,
                       layer_name="features",
                       field_name="features"):
    dset = gdal.Open(preds)
    band = dset.GetRasterBand(1)

    drv = ogr.GetDriverByName("ESRI Shapefile")
    dst_ds = drv.CreateDataSource(file_name)
    dst_layer = dst_ds.CreateLayer(layer_name, srs=None)

    fd = ogr.FieldDefn(field_name, ogr.OFTInteger)
    dst_layer.CreateField(fd)
    dst_field = 1

    gdal.Polygonize(band, None, dst_layer, dst_field, [], callback=None)
Exemplo n.º 28
0
def polygonize(raster_path, band, out_shp_path, epsg):
    # mapping between gdal type and ogr field type
    type_mapping = {
        gdal.GDT_Byte: ogr.OFTInteger,
        gdal.GDT_UInt16: ogr.OFTInteger,
        gdal.GDT_Int16: ogr.OFTInteger,
        gdal.GDT_UInt32: ogr.OFTInteger,
        gdal.GDT_Int32: ogr.OFTInteger,
        gdal.GDT_Float32: ogr.OFTReal,
        gdal.GDT_Float64: ogr.OFTReal,
        gdal.GDT_CInt16: ogr.OFTInteger,
        gdal.GDT_CInt32: ogr.OFTInteger,
        gdal.GDT_CFloat32: ogr.OFTReal,
        gdal.GDT_CFloat64: ogr.OFTReal
    }

    src_ds = gdal.Open(raster_path)
    src_band = src_ds.GetRasterBand(band)
    driver = ogr.GetDriverByName("ESRI Shapefile")
    if os.path.exists(out_shp_path):
        driver.DeleteDataSource(out_shp_path)
    outDataSource = driver.CreateDataSource(out_shp_path)
    out_spatial_ref = osr.SpatialReference()
    out_spatial_ref.ImportFromEPSG(epsg)

    outLayer = outDataSource.CreateLayer("polygonized",
                                         out_spatial_ref,
                                         geom_type=ogr.wkbPolygon)

    raster_field = ogr.FieldDefn('id', type_mapping[src_band.DataType])
    outLayer.CreateField(raster_field)

    progbar = ProgressBar(100, 50, "Polygonizing raster")

    def poly_progress(progress, msg, data):
        # double dfProgress, char const * pszMessage=None, void * pData=None
        progbar.update(int(progress * 100))

    gdal.Polygonize(src_band,
                    src_ds.GetRasterBand(band),
                    outLayer,
                    0, [],
                    callback=poly_progress)
    progbar.finish()

    outDataSource.Destroy()
    src_ds = None
Exemplo n.º 29
0
def create_slope_poly(folder, fn_dem, fn_sl_water):
    fn_sl_poly = folder + DemToTopoUtills.add_file_name_marker_shp(fn_dem, DemToTopoConsts.SLOPE_POLY_EXT)
    # print(fn_sl_poly)
    dn_sl = gdal.Open(fn_sl_water)
    band_input = dn_sl.GetRasterBand(1)

    # create the spatial reference, WGS84
    source_srs = osr.SpatialReference()
    source_srs.ImportFromEPSG(4326)

    driver_file = ogr.GetDriverByName("ESRI Shapefile")
    driver_mem = ogr.GetDriverByName('Memory')

    if os.path.exists(fn_sl_poly):
        driver_file.DeleteDataSource(fn_sl_poly)

    out_datasource_file = driver_file.CreateDataSource(fn_sl_poly)
    out_layer_file = out_datasource_file.CreateLayer("polygonized", source_srs, geom_type=ogr.wkbPolygon)

    out_datasource_mem = driver_mem.CreateDataSource('out')
    out_layer_mem = out_datasource_mem.CreateLayer("polygonized1", source_srs)

    gdal.Polygonize(band_input, band_input, out_layer_mem, -1, [], callback=None)

    for feat in out_layer_mem:
        # For each feature, get the geometry
        geom = feat.GetGeometryRef()
        area = geom.GetArea()
        if area > 0.0000009:
            out_layer_file.CreateFeature(feat)

    out_datasource_file = None
    out_datasource_mem = None
    dn_sl = None

    fn_sl_poly_prj = folder + DemToTopoUtills.add_file_name_marker_prj(fn_dem, DemToTopoConsts.SLOPE_POLY_EXT)
    spatial_ref = osr.SpatialReference()
    spatial_ref.ImportFromEPSG(4326)

    spatial_ref.MorphToESRI()
    file = open(fn_sl_poly_prj, 'w')
    file.write(spatial_ref.ExportToWkt())
    file.close()
    file = None

    DemToTopoUtills.print_dot()
    return fn_sl_poly
Exemplo n.º 30
0
def vectorize_labels_file(labeled_file, id_attribute='bspot_id'):
    """Vectorize bluespot id raster

    Parameters
    ----------
    labeled_file : str
        Path to GDAL supported file with bluespot ids (labels)
    id_attribute : str
        Attribute name to write bluespot id to

    Yields
    -------
    feature : dict
        Geojson formatted feature

    """
    src_ds = gdal.Open(labeled_file)
    src_band = src_ds.GetRasterBand(1)

    # Create a memory OGR datasource to put results in.
    mem_drv = ogr.GetDriverByName('Memory')
    mem_ds = mem_drv.CreateDataSource('out')

    mem_layer = mem_ds.CreateLayer('poly', None, ogr.wkbPolygon)

    fd = ogr.FieldDefn(id_attribute, ogr.OFTInteger)
    mem_layer.CreateField(fd)

    # Use 8-connectedness
    options = ['8CONNECTED=8']

    # run the algorithm.
    result = gdal.Polygonize(src_band, src_band.GetMaskBand(), mem_layer, 0,
                             options)
    if result != 0:
        raise Exception('Vectorization failed')

    feat_read = mem_layer.GetNextFeature()
    while feat_read:
        yield json.loads(feat_read.ExportToJson())
        feat_read.Destroy()
        feat_read = mem_layer.GetNextFeature()

    # Without these this code crashes in Python3
    del fd
    del src_ds
    del mem_ds