Пример #1
0
def process(parsed, target, temp_metatile, temp_processed, save_offsetx, save_offsety, save_xsize, save_ysize, nodata, ot, *args, **kwargs):

    scale = parsed.s
    zfactor = parsed.z
    altitude = parsed.alt
    process_hillshade = "gdaldem hillshade -s %s -z %s -alt %s %s -of GTiff %s > /dev/null" %(scale, zfactor, altitude, temp_metatile, temp_processed)
    os.system(process_hillshade)
    nodata = 0
    ot = "-ot Byte"
    # open in numpy
    _, gt, _, nodata, array_numpy = numpy_read(temp_processed)
    processed_numpy = ndimage.median_filter(array_numpy, size=3)
    numpy_save(processed_numpy, target, save_offsetx, save_offsety, save_xsize, save_ysize, gt, nodata, ot)
Пример #2
0
def process(parsed, target, temp_metatile, temp_processed, save_offsetx, save_offsety, save_xsize, save_ysize, nodata, ot, *args, **kwargs):

    scale = parsed.s
    process_slopeshade = "gdaldem slope -s %s %s -of GTiff %s > /dev/null" %(scale, temp_metatile, temp_processed)
    os.system(process_slopeshade)
    nodata = 0
    ot = "-ot Byte"
    _, gt, _, nodata, array_numpy = numpy_read(temp_processed)
    array_numpy[array_numpy==nodata] = 0
    # convert to 8 bit and invert values
    array_numpy = -(array_numpy.astype(numpy.uint8)-255)
    array_numpy[array_numpy==0] = 255
    #print array_numpy.shape
    processed_numpy = array_numpy
    #print processed_numpy[1][3]
    numpy_save(processed_numpy, target, save_offsetx, save_offsety, save_xsize, save_ysize, gt, nodata, ot)
Пример #3
0
def process(parsed, target, temp_metatile, temp_processed, save_offsetx,
            save_offsety, save_xsize, save_ysize, nodata, ot, *args, **kwargs):

    scale = parsed.s
    process_slopeshade = "gdaldem slope -s %s %s -of GTiff %s > /dev/null" % (
        scale, temp_metatile, temp_processed)
    os.system(process_slopeshade)
    nodata = 0
    ot = "-ot Byte"
    _, gt, _, nodata, array_numpy = numpy_read(temp_processed)
    array_numpy[array_numpy == nodata] = 0
    # convert to 8 bit and invert values
    array_numpy = -(array_numpy.astype(numpy.uint8) - 255)
    array_numpy[array_numpy == 0] = 255
    #print array_numpy.shape
    processed_numpy = array_numpy
    #print processed_numpy[1][3]
    numpy_save(processed_numpy, target, save_offsetx, save_offsety, save_xsize,
               save_ysize, gt, nodata, ot)
def process(parsed, target, temp_metatile, temp_processed, save_offsetx, save_offsety, save_xsize, save_ysize, nodata, ot, *args, **kwargs):

    _, gt, _, nodata, array_numpy = numpy_read(temp_metatile)


    #target_db = target.split(".")[0] + ".sqlite"
    targetdb = "geodata"
    dbuser = "******"
    targettable = str(parsed.table)
    median = int(parsed.median)

    # geotransform values for tile
    xmin = gt[0] + (save_offsetx * gt[1])
    xmax = gt[0] + ((save_offsetx + save_xsize) * gt[1])
    ymin = gt[3] + ((save_offsety + save_ysize) * gt[5])
    ymax = gt[3] + (save_offsety * gt[5])

    # geotransform values for metatile
    save_offsetx = 0
    save_offsety = 0
    save_xsize = array_numpy.shape[1]
    save_ysize = array_numpy.shape[0]

    # reclassify
    '''
    11: cropland
    14: cropland
    20: cropland
    30: forest
    40: forest
    50: forest
    60: forest
    70: forest
    90: forest
    100: forest
    110: shrubland
    120: shrubland
    130: shrubland
    140: shrubland
    150: shrubland
    160: forest
    170: forest
    180: grassland
    190: sealed
    200: bare
    210: water
    220: ice
    230: nodata
    '''

    '''
    nodata: 0
    cropland: 1
    forest: 2
    shrubland: 3
    grassland: 4
    sealed: 5
    bare: 6
    water: 7
    ice: 8
    '''
    # vectorize (smooth edges)
    # smooth


    # reclassify
    ############
    classification = {
        11:1,
        14:1,
        20:1,
        30:2,
        40:2,
        50:2,
        60:2,
        70:2,
        90:2,
        100:2,
        110:3,
        120:3,
        130:3,
        140:3,
        150:3,
        160:2,
        170:2,
        180:4,
        190:5,
        200:6,
        210:7,
        220:8#,
        #230:0
    }

    temp_numpy = numpy.zeros((array_numpy.shape[0], array_numpy.shape[1]))
    
    for c in classification:
        idx = (array_numpy == c).nonzero()
        temp_numpy[idx] = classification[c]


    # median filter
    ###############
    processed_numpy = ndimage.median_filter(temp_numpy, size=median)


    #create Memory driver
    src_ds = gdal.Open( temp_metatile )
    format = "MEM"
    driver = gdal.GetDriverByName( format )
    mem_ds = driver.CreateCopy('', src_ds )
    # write filtered numpy array to GDAL band
    gdal_array.BandWriteArray(mem_ds.GetRasterBand(1), processed_numpy)
    mem_ds.GetRasterBand(1).WriteArray(processed_numpy)

    drv = ogr.GetDriverByName( 'Memory' )  
    ogr_ds = drv.CreateDataSource('out')  
    ogr_lyr = ogr_ds.CreateLayer('landcover')
    fieldname = 'type'
    field_defn = ogr.FieldDefn( fieldname, ogr.OFTInteger )
    ogr_lyr.CreateField(field_defn)
    ogr_field = ogr_lyr.GetLayerDefn().GetFieldIndex(fieldname)
    ogr_field = 0

    maskband = None
    
    gdal.Polygonize(mem_ds.GetRasterBand(1), maskband, ogr_lyr, ogr_field, [])

    
    # clip to tile boundary
    #######################
    ring = ogr.Geometry(ogr.wkbLinearRing)
    ring.AddPoint(xmin, ymin)
    ring.AddPoint(xmin, ymax)
    ring.AddPoint(xmax, ymax)
    ring.AddPoint(xmax, ymin)
    ring.AddPoint(xmin, ymin)
    clipbox = ogr.Geometry(ogr.wkbPolygon)
    clipbox.AddGeometry(ring)

    cliplayer = ogr_ds.CreateLayer('clipbox', geom_type=ogr.wkbPolygon)
    clipfeaturedefn = cliplayer.GetLayerDefn()
    clipfeature = ogr.Feature(clipfeaturedefn)
    clipfeature.SetGeometry(clipbox)
    cliplayer.CreateFeature(clipfeature)
    clipped = ogr_ds.CreateLayer('landcover_clipped', geom_type=ogr.wkbMultiPolygon)
    #clipped.ForceToMultiLineString()
    field_defn = ogr.FieldDefn('ID', ogr.OFTInteger)
    clipped.CreateField(field_defn)
    field_defn = ogr.FieldDefn('type', ogr.OFTInteger)
    clipped.CreateField(field_defn)

    ogr_lyr.Clip(cliplayer, clipped)

    connection = psycopg2.connect(database = targetdb, user = dbuser)
    # psql -d geodata -c "DROP TABLE landcover; CREATE TABLE landcover (id bigserial primary key, typeid double precision, type text);  SELECT AddGeometryColumn ('','landcover','the_geom',4326,'MULTIPOLYGON',2);"
    cursor = connection.cursor()


    for i in range(clipped.GetFeatureCount()):  
        insert = True
        feature = clipped.GetFeature(i)
        geometry = feature.GetGeometryRef()
        #print geometry.GetGeometryName()
        if geometry.GetGeometryName() in ("POLYGON", "MULTIPOLYGON") :
            continue
            #print "polygon"
        if geometry.GetGeometryName() == "GEOMETRYCOLLECTION" :
            geometry_new = ogr.Geometry(ogr.wkbMultiLineString)
            for i in xrange(geometry.GetGeometryCount()): 
                g = geometry.GetGeometryRef(i)
                if g.GetGeometryName() in ("POLYGON", "MULTIPOLYGON") :
                    #print "geometrycollection polygon"
                    geometry_new.AddGeometry(g.Clone())
                else:
                    print g.GetGeometryName()
            geometry = geometry_new
        if geometry.GetGeometryName() in ("LINESTRING", "MULTILINESTRING", "POINT", "MULTIPOINT") :
            insert = False

        if insert:
            lctype = feature.GetField("type")
            geometry.SetCoordinateDimension(2)
            wkt = geometry.ExportToWkt()
            cursor.execute("INSERT INTO " + targettable + " (type,the_geom) VALUES (%s, ST_Multi(ST_GeomFromText(%s, " +"4326)))", (lctype, wkt))
    connection.commit()  

    ogr_ds.Destroy()
    processed_numpy = []
    mem_ds = None



    #numpy_save(processed_numpy, target, save_offsetx, save_offsety, save_xsize, save_ysize, gt, nodata, ot)



    #processed_numpy = array_numpy
    #print "save processed_numpy"
    #print str(processed_numpy.shape[0]) + " " + str(processed_numpy.shape[1])

    
    cursor.close()
    connection.close()
Пример #5
0
def process(parsed, target, temp_metatile, temp_processed, save_offsetx, save_offsety, save_xsize, save_ysize, nodata, ot, *args, **kwargs):

    temp_voids = tempfile.mktemp() + ".geojson" #"tmp_voids_%s.geojson" % os.getpid()
    with open(temp_voids, "w+"):
        pass
    temp_voids_raster = tempfile.mktemp() #"/tmp/tmp_voids_raster_%s.tif" % os.getpid()
    with open(temp_voids_raster, "w+"):
        pass

    temp_secondary = tempfile.mktemp() #"/tmp/tmp_secondary_%s" % os.getpid()
    with open(temp_voids, "w+"):
        pass

    void_mask = parsed.voids
    secondary_source = parsed.secondary
    tertiary_source = parsed.tertiary
    landmask = parsed.landmask

    nodata = 0
    ot = "-ot Int16"

    # read primary data
    _, gt, _, nodata, primary_dem = numpy_read(temp_metatile)

    # TODO check if valid
    ulx, llx = gt[0], gt[0]
    uly, ury = gt[3], gt[3]
    urx, lrx = ulx + (gt[1] * primary_dem.shape[1]), ulx + (gt[1] * primary_dem.shape[1])
    lly, lry = uly + (gt[5] * primary_dem.shape[0]), uly + (gt[5] * primary_dem.shape[0])

    # read secondary
    clip_secondary = "gdal_translate -projwin %s %s %s %s %s %s" %(ulx, uly, lrx, lry, secondary_source, temp_secondary)
    print "%s: clipping secondary DEM" %(target)
    os.system(clip_secondary)
    _, gt, _, nodata, secondary_dem = numpy_read(temp_secondary)

    # clip void mask
    os.remove(temp_voids)
    clip_void_mask = "ogr2ogr -overwrite -f 'GeoJSON' %s %s -clipsrc %s %s %s %s" %(temp_voids, void_mask, llx, lly, urx, ury)
    print "%s: clipping void mask" %(target)
    os.system(clip_void_mask)
    
    # rasterize void mask
    rasterize_void_mask = "gdal_rasterize -burn 1 -i -te %s %s %s %s -tr %s %s -ot Byte %s %s" %(llx, lly, urx, ury, gt[1], -gt[5], temp_voids, temp_voids_raster)
    print "%s: rasterize void mask" %(target)
    os.system(rasterize_void_mask)
    _, gt, _, nodata, void_mask_raster = numpy_read(temp_voids_raster)
    
    ## numpy_read
    
    # fill gaps by overlaying numpy arrays
    # http://stackoverflow.com/questions/19817955/overlay-part-of-the-matrix-on-top-of-another

    processed_numpy = numpy.where(void_mask_raster != 0, primary_dem, secondary_dem)

    # clean up
    os.remove(temp_voids)
    os.remove(temp_voids_raster)
    os.remove(temp_secondary)
    
    if landmask:
        # read mask to numpy
        temp_landmask = tempfile.mktemp() #"/tmp/tmp_voids_raster_%s.tif" % os.getpid()
        with open(temp_landmask, "w+"):
            pass
        clip_landmask = "gdal_translate -projwin %s %s %s %s %s %s" %(ulx, uly, lrx, lry, landmask, temp_landmask)
        print clip_landmask
        os.system(clip_landmask)
        _, gt, _, nodata, numpy_landmask = numpy_read(temp_landmask)
        os.remove(temp_landmask)

        processed_numpy = numpy.where(numpy_landmask == 1, processed_numpy, 0)

    numpy_save(processed_numpy, target, save_offsetx, save_offsety, save_xsize, save_ysize, gt, nodata, ot)
Пример #6
0
def process(parsed, target, temp_metatile, temp_processed, save_offsetx, save_offsety, save_xsize, save_ysize, nodata, ot, *args, **kwargs):

    #target_db = target.split(".")[0] + ".sqlite"
    targetdb = "geodata"
    dbuser = "******"
    targettable = str(parsed.table)

    elevation = int(parsed.elevation)
    median = int(parsed.median)
    glacier_mask = parsed.glacier_mask
    nodata = 0
 
    #print "read temp_metatile"
    _, gt, _, nodata, array_numpy = numpy_read(temp_metatile)
    processed_numpy = ndimage.median_filter(array_numpy, size=median)
    #processed_numpy = array_numpy
    #print "save processed_numpy"
    #print str(processed_numpy.shape[0]) + " " + str(processed_numpy.shape[1])

    # geotransform values for tile
    xmin = gt[0] + (save_offsetx * gt[1])
    xmax = gt[0] + ((save_offsetx + save_xsize) * gt[1])
    ymin = gt[3] + ((save_offsety + save_ysize) * gt[5])
    ymax = gt[3] + (save_offsety * gt[5])

    # geotransform values for metatile
    save_offsetx = 0
    save_offsety = 0
    save_xsize = processed_numpy.shape[1]
    save_ysize = processed_numpy.shape[0]
    
    # create contours from processed_numpy
    ds = gdal.Open(temp_metatile)

    drv = ogr.GetDriverByName( 'Memory' )  
    ogr_ds = drv.CreateDataSource('out')  
    #ogr_ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('contours_ogr/contour.shp')
    ogr_lyr = ogr_ds.CreateLayer('contour', geom_type = ogr.wkbMultiLineString)
    field_defn = ogr.FieldDefn('ID', ogr.OFTInteger)
    ogr_lyr.CreateField(field_defn)
    field_defn = ogr.FieldDefn('elev', ogr.OFTReal)
    ogr_lyr.CreateField(field_defn)

    #create Memory driver
    src_ds = gdal.Open( temp_metatile )
    format = "MEM"
    driver = gdal.GetDriverByName( format )
    mem_ds = driver.CreateCopy('', src_ds )
    # write filtered numpy array to GDAL band
    gdal_array.BandWriteArray(mem_ds.GetRasterBand(1), processed_numpy)
    mem_ds.GetRasterBand(1).WriteArray(processed_numpy)

    # write contours to OGR layer
    gdal.ContourGenerate(mem_ds.GetRasterBand(1), elevation, 0, [], 0, 0, ogr_lyr, 0, 1)

    # convert 3D geometries to 2D
    for i in range(ogr_lyr.GetFeatureCount()):  
        feature = ogr_lyr.GetFeature(i)  
        geometry = feature.GetGeometryRef()
        geometry.SetCoordinateDimension(2)

    # clip to tile boundary
    ring = ogr.Geometry(ogr.wkbLinearRing)
    ring.AddPoint(xmin, ymin)
    ring.AddPoint(xmin, ymax)
    ring.AddPoint(xmax, ymax)
    ring.AddPoint(xmax, ymin)
    ring.AddPoint(xmin, ymin)
    clipbox = ogr.Geometry(ogr.wkbPolygon)
    clipbox.AddGeometry(ring)

    cliplayer = ogr_ds.CreateLayer('clipbox', geom_type=ogr.wkbPolygon)
    clipfeaturedefn = cliplayer.GetLayerDefn()
    clipfeature = ogr.Feature(clipfeaturedefn)
    clipfeature.SetGeometry(clipbox)
    cliplayer.CreateFeature(clipfeature)
    clipped = ogr_ds.CreateLayer('contour_clipped', geom_type=ogr.wkbMultiLineString)
    #clipped.ForceToMultiLineString()
    field_defn = ogr.FieldDefn('ID', ogr.OFTInteger)
    clipped.CreateField(field_defn)
    field_defn = ogr.FieldDefn('elev', ogr.OFTReal)
    clipped.CreateField(field_defn)

    ogr_lyr.Clip(cliplayer, clipped)

    # PostGIS connection
    #connection = db.connect('contours.sqlite')
    connection = psycopg2.connect(database = targetdb, user = dbuser)
    # psql -d geodata -c "DROP TABLE contours; CREATE TABLE contours (id bigserial primary key, elev double precision, type text);  SELECT AddGeometryColumn ('','contours','the_geom',4326,'MULTILINESTRING',2);"
    cursor = connection.cursor()

    if glacier_mask:
        # read glacier_mask
        shapefile = glacier_mask
        driver = ogr.GetDriverByName("ESRI Shapefile")
        dataSource = driver.Open(shapefile, 0)
        glacier_layer = dataSource.GetLayer()

        glacier_layer_clipped = ogr_ds.CreateLayer('glacier_clipped', geom_type=ogr.wkbPolygon)

        glacier_layer.Clip(cliplayer, glacier_layer_clipped)

        #print "processing land contours"
        # clip & save land contours
        land_clipped = ogr_ds.CreateLayer('contour_clipped', geom_type=ogr.wkbMultiLineString)
        field_defn = ogr.FieldDefn('ID', ogr.OFTInteger)
        land_clipped.CreateField(field_defn)
        field_defn = ogr.FieldDefn('elev', ogr.OFTReal)
        land_clipped.CreateField(field_defn)

        if glacier_layer_clipped.GetFeatureCount() == 0:
            land_clipped = clipped
        else:
            # create inverse clip
            inverse_clip = ogr_ds.CreateLayer('inverse_clip', geom_type=ogr.wkbPolygon)
            cliplayer.Erase(glacier_layer_clipped, inverse_clip)
            clipped.Clip(inverse_clip, land_clipped)


        contour_type = "land"

        for i in range(land_clipped.GetFeatureCount()):  
            feature = land_clipped.GetFeature(i)  
            geometry = feature.GetGeometryRef()
            # hack removing loose points from geometry
            if geometry.GetGeometryName() in ("POINT", "MULTIPOINT") :
                continue
            if geometry.GetGeometryName() == "GEOMETRYCOLLECTION" :
                geometry_new = ogr.Geometry(ogr.wkbMultiLineString)
                for i in xrange(geometry.GetGeometryCount()): 
                    g = geometry.GetGeometryRef(i)
                    if g.GetGeometryName() == "LINESTRING" :
                        geometry_new.AddGeometry(g.Clone())
                geometry = geometry_new
            elev = feature.GetField("elev")
            geometry.SetCoordinateDimension(2)
            wkt = geometry.ExportToWkt() 
            cursor.execute("INSERT INTO " + targettable + " (elev,the_geom,type) VALUES (%s, ST_Multi(ST_GeomFromText(%s, " +"4326)), %s)", (elev, wkt, contour_type))
        connection.commit()  


        #print "processing glacier contours"    
        # clip & save glacier contours
        glacier_clipped = ogr_ds.CreateLayer('glacier_clipped', geom_type=ogr.wkbMultiLineString)
        field_defn = ogr.FieldDefn('ID', ogr.OFTInteger)
        glacier_clipped.CreateField(field_defn)
        field_defn = ogr.FieldDefn('elev', ogr.OFTReal)
        glacier_clipped.CreateField(field_defn)
    
        clipped.Clip(glacier_layer_clipped, glacier_clipped)

        contour_type = "glaciated"

        for i in range(glacier_clipped.GetFeatureCount()):  
            feature = glacier_clipped.GetFeature(i)  
            geometry = feature.GetGeometryRef()
            # hack removing loose points from geometry
            if geometry.GetGeometryName() in ("POINT", "MULTIPOINT") :
                continue
            if geometry.GetGeometryName() == "GEOMETRYCOLLECTION" :
                geometry_new = ogr.Geometry(ogr.wkbMultiLineString)
                for i in xrange(geometry.GetGeometryCount()): 
                    g = geometry.GetGeometryRef(i)
                    if g.GetGeometryName() == "LINESTRING" :
                        geometry_new.AddGeometry(g.Clone())
                geometry = geometry_new
            elev = feature.GetField("elev")
            geometry.SetCoordinateDimension(2)
            wkt = geometry.ExportToWkt() 
            cursor.execute("INSERT INTO " + targettable + " (elev,the_geom,type) VALUES (%s, ST_Multi(ST_GeomFromText(%s, " +"4326)), %s)",(elev, wkt, contour_type))
        connection.commit()
    
    else:
        # save to POSTGIS
        for i in range(clipped.GetFeatureCount()):  
            feature = clipped.GetFeature(i)
            geometry = feature.GetGeometryRef()
            # hack removing loose points from geometry
            if geometry.GetGeometryName() in ("POINT", "MULTIPOINT") :
                continue
            if geometry.GetGeometryName() == "GEOMETRYCOLLECTION" :
                geometry_new = ogr.Geometry(ogr.wkbMultiLineString)
                for i in xrange(geometry.GetGeometryCount()): 
                    g = geometry.GetGeometryRef(i)
                    if g.GetGeometryName() == "LINESTRING" :
                        geometry_new.AddGeometry(g.Clone())
                geometry = geometry_new
            elev = feature.GetField("elev")
            #feature_geometry = ogr.ForceToMultiLineString(feature.GetGeometryRef())
            geometry.SetCoordinateDimension(2)
            wkt = geometry.ExportToWkt()
            cursor.execute("INSERT INTO " + targettable + " (elev,the_geom) VALUES (%s, ST_Multi(ST_GeomFromText(%s, " +"4326)))", (elev, wkt))
        connection.commit()  

    ogr_ds.Destroy()
    processed_numpy = []
    mem_ds = None
    #os.remove(target)
    #os.remove(temp_target)

    cursor.close()
    connection.close()
Пример #7
0
def process(parsed, target, temp_metatile, temp_processed, save_offsetx,
            save_offsety, save_xsize, save_ysize, nodata, ot, *args, **kwargs):

    _, gt, _, nodata, array_numpy = numpy_read(temp_metatile)

    #target_db = target.split(".")[0] + ".sqlite"
    targetdb = "geodata"
    dbuser = "******"
    targettable = str(parsed.table)
    median = int(parsed.median)

    # geotransform values for tile
    xmin = gt[0] + (save_offsetx * gt[1])
    xmax = gt[0] + ((save_offsetx + save_xsize) * gt[1])
    ymin = gt[3] + ((save_offsety + save_ysize) * gt[5])
    ymax = gt[3] + (save_offsety * gt[5])

    # geotransform values for metatile
    save_offsetx = 0
    save_offsety = 0
    save_xsize = array_numpy.shape[1]
    save_ysize = array_numpy.shape[0]

    # reclassify
    '''
    11: cropland
    14: cropland
    20: cropland
    30: forest
    40: forest
    50: forest
    60: forest
    70: forest
    90: forest
    100: forest
    110: shrubland
    120: shrubland
    130: shrubland
    140: shrubland
    150: shrubland
    160: forest
    170: forest
    180: grassland
    190: sealed
    200: bare
    210: water
    220: ice
    230: nodata
    '''
    '''
    nodata: 0
    cropland: 1
    forest: 2
    shrubland: 3
    grassland: 4
    sealed: 5
    bare: 6
    water: 7
    ice: 8
    '''
    # vectorize (smooth edges)
    # smooth

    # reclassify
    ############
    classification = {
        11: 1,
        14: 1,
        20: 1,
        30: 2,
        40: 2,
        50: 2,
        60: 2,
        70: 2,
        90: 2,
        100: 2,
        110: 3,
        120: 3,
        130: 3,
        140: 3,
        150: 3,
        160: 2,
        170: 2,
        180: 4,
        190: 5,
        200: 6,
        210: 7,
        220: 8  #,
        #230:0
    }

    temp_numpy = numpy.zeros((array_numpy.shape[0], array_numpy.shape[1]))

    for c in classification:
        idx = (array_numpy == c).nonzero()
        temp_numpy[idx] = classification[c]

    # median filter
    ###############
    processed_numpy = ndimage.median_filter(temp_numpy, size=median)

    #create Memory driver
    src_ds = gdal.Open(temp_metatile)
    format = "MEM"
    driver = gdal.GetDriverByName(format)
    mem_ds = driver.CreateCopy('', src_ds)
    # write filtered numpy array to GDAL band
    gdal_array.BandWriteArray(mem_ds.GetRasterBand(1), processed_numpy)
    mem_ds.GetRasterBand(1).WriteArray(processed_numpy)

    drv = ogr.GetDriverByName('Memory')
    ogr_ds = drv.CreateDataSource('out')
    ogr_lyr = ogr_ds.CreateLayer('landcover')
    fieldname = 'type'
    field_defn = ogr.FieldDefn(fieldname, ogr.OFTInteger)
    ogr_lyr.CreateField(field_defn)
    ogr_field = ogr_lyr.GetLayerDefn().GetFieldIndex(fieldname)
    ogr_field = 0

    maskband = None

    gdal.Polygonize(mem_ds.GetRasterBand(1), maskband, ogr_lyr, ogr_field, [])

    # clip to tile boundary
    #######################
    ring = ogr.Geometry(ogr.wkbLinearRing)
    ring.AddPoint(xmin, ymin)
    ring.AddPoint(xmin, ymax)
    ring.AddPoint(xmax, ymax)
    ring.AddPoint(xmax, ymin)
    ring.AddPoint(xmin, ymin)
    clipbox = ogr.Geometry(ogr.wkbPolygon)
    clipbox.AddGeometry(ring)

    cliplayer = ogr_ds.CreateLayer('clipbox', geom_type=ogr.wkbPolygon)
    clipfeaturedefn = cliplayer.GetLayerDefn()
    clipfeature = ogr.Feature(clipfeaturedefn)
    clipfeature.SetGeometry(clipbox)
    cliplayer.CreateFeature(clipfeature)
    clipped = ogr_ds.CreateLayer('landcover_clipped',
                                 geom_type=ogr.wkbMultiPolygon)
    #clipped.ForceToMultiLineString()
    field_defn = ogr.FieldDefn('ID', ogr.OFTInteger)
    clipped.CreateField(field_defn)
    field_defn = ogr.FieldDefn('type', ogr.OFTInteger)
    clipped.CreateField(field_defn)

    ogr_lyr.Clip(cliplayer, clipped)

    connection = psycopg2.connect(database=targetdb, user=dbuser)
    # psql -d geodata -c "DROP TABLE landcover; CREATE TABLE landcover (id bigserial primary key, typeid double precision, type text);  SELECT AddGeometryColumn ('','landcover','the_geom',4326,'MULTIPOLYGON',2);"
    cursor = connection.cursor()

    for i in range(clipped.GetFeatureCount()):
        insert = True
        feature = clipped.GetFeature(i)
        geometry = feature.GetGeometryRef()
        #print geometry.GetGeometryName()
        if geometry.GetGeometryName() in ("POLYGON", "MULTIPOLYGON"):
            continue
            #print "polygon"
        if geometry.GetGeometryName() == "GEOMETRYCOLLECTION":
            geometry_new = ogr.Geometry(ogr.wkbMultiLineString)
            for i in xrange(geometry.GetGeometryCount()):
                g = geometry.GetGeometryRef(i)
                if g.GetGeometryName() in ("POLYGON", "MULTIPOLYGON"):
                    #print "geometrycollection polygon"
                    geometry_new.AddGeometry(g.Clone())
                else:
                    print g.GetGeometryName()
            geometry = geometry_new
        if geometry.GetGeometryName() in ("LINESTRING", "MULTILINESTRING",
                                          "POINT", "MULTIPOINT"):
            insert = False

        if insert:
            lctype = feature.GetField("type")
            geometry.SetCoordinateDimension(2)
            wkt = geometry.ExportToWkt()
            cursor.execute(
                "INSERT INTO " + targettable +
                " (type,the_geom) VALUES (%s, ST_Multi(ST_GeomFromText(%s, " +
                "4326)))", (lctype, wkt))
    connection.commit()

    ogr_ds.Destroy()
    processed_numpy = []
    mem_ds = None

    #numpy_save(processed_numpy, target, save_offsetx, save_offsety, save_xsize, save_ysize, gt, nodata, ot)

    #processed_numpy = array_numpy
    #print "save processed_numpy"
    #print str(processed_numpy.shape[0]) + " " + str(processed_numpy.shape[1])

    cursor.close()
    connection.close()