def run(self):
        lulc_nodata = raster_utils.get_nodata_from_uri(GLOBAL_LANDCOVER_URI)

        forest_lulc_codes = [1, 2, 3, 4, 5]

        mask_uri = os.path.join(OUTPUT_DIR, "forest_mask.tif")
        mask_nodata = 2

        def mask_nonforest(lulc):
            """Takes in a numpy array of landcover values and returns 1s
                where they match forest codes and 0 otherwise"""
            mask = numpy.empty(lulc.shape, dtype=numpy.int8)
            mask[:] = 1
            for lulc_code in forest_lulc_codes:
                mask[lulc == lulc_code] = 0
            mask[lulc == lulc_nodata] = mask_nodata
            return mask

        cell_size = raster_utils.get_cell_size_from_uri(GLOBAL_LANDCOVER_URI)
        raster_utils.vectorize_datasets(
            [GLOBAL_LANDCOVER_URI,], mask_nonforest, mask_uri, gdal.GDT_Byte,
            mask_nodata, cell_size, 'intersection', dataset_to_align_index=0,
            dataset_to_bound_index=None, aoi_uri=None,
            assert_datasets_projected=True, process_pool=None,
            vectorize_op=False, datasets_are_pre_aligned=True)

        raster_utils.distance_transform_edt(
            mask_uri, FOREST_EDGE_DISTANCE_URI)
 def run(self):
     raster_utils.vectorize_datasets(
         list(self.dataset_uri_list), self.dataset_pixel_op,
         self.dataset_out_uri, self.datatype_out,
         self.nodata_out, self.pixel_size_out, self.bounding_box_mode,
         dataset_to_align_index=self.dataset_to_align_index,
         vectorize_op=self.vectorize_op)
 def run(self):
     nodata = raster_utils.get_nodata_from_uri(UNION_LANDCOVER_URI)
     cell_size = raster_utils.get_cell_size_from_uri(UNION_LANDCOVER_URI)
     raster_utils.vectorize_datasets(
         [UNION_LANDCOVER_URI, UNION_BIOMASS_URI], lambda x, y: x,
         GLOBAL_LANDCOVER_URI,
         gdal.GDT_Int16, nodata, cell_size, "intersection",
         dataset_to_align_index=0, vectorize_op=False)
def _align_raster_with_biomass(input_uri, output_uri):
    """Function to use internally to take an input and align it with the
        GLOBAL_BIOMASS_URI raster"""
    nodata = raster_utils.get_nodata_from_uri(input_uri)
    if nodata is None:
        nodata = -9999
    cell_size = raster_utils.get_cell_size_from_uri(GLOBAL_BIOMASS_URI)
    raster_utils.vectorize_datasets(
        [input_uri, GLOBAL_BIOMASS_URI], lambda x, y: x,
        output_uri, gdal.GDT_Float32, nodata, cell_size, "dataset",
        dataset_to_bound_index=1, vectorize_op=False)
    def run(self):
        def union_op(*array_list):
            """Given an array stack return an array that has a value defined
                in the stack that is not nodata.  used for overlapping nodata
                stacks."""
            output_array = array_list[0]
            for array in array_list[1:]:
                output_array = numpy.where(
                    array != nodata, array, output_array)
            return output_array
        nodata = raster_utils.get_nodata_from_uri(self.dataset_uri_list[0])
        cell_size = raster_utils.get_cell_size_from_uri(
            self.dataset_uri_list[0])

        raster_utils.vectorize_datasets(
            list(self.dataset_uri_list), union_op, self.dataset_out_uri,
            gdal.GDT_Int16, nodata, cell_size, "union",
            dataset_to_align_index=0, vectorize_op=False)
	def run(self):
		biomass_raster_list = [
			"C:/Users/rpsharp/Dropbox_stanford/Dropbox/forest_edge_carbon/af_biov2ct1.tif",
			"C:/Users/rpsharp/Dropbox_stanford/Dropbox/forest_edge_carbon/am_biov2ct1.tif",
			"C:/Users/rpsharp/Dropbox_stanford/Dropbox/forest_edge_carbon/as_biov2ct1.tif",
		]

		nodata = raster_utils.get_nodata_from_uri(biomass_raster_list[0])
		cell_size = raster_utils.get_cell_size_from_uri(biomass_raster_list[0])

		def union_op(*biomass_array_list):
			output_array = biomass_array_list[0]
			for biomass_array in biomass_array_list[1:]:
				output_array = numpy.where(
					biomass_array != nodata, biomass_array, output_array)
			return output_array

		raster_utils.create_directories([os.path.dirname(self.output_uri)])

		raster_utils.vectorize_datasets(
	        biomass_raster_list, union_op, self.output_uri, gdal.GDT_Int16,
	        nodata, cell_size, 'union', dataset_to_align_index=0,
	        vectorize_op=False)
def average_layers():

    base_table_uri = "C:/Users/rich/Desktop/all_grid_results_100km_clean_v2.csv"
    base_table_file = open(base_table_uri, 'rU')
    table_header = base_table_file.readline()

    #need to mask the average layers to the biomass regions

    giant_layer_uri = "C:/Users/rich/Desktop/average_layers_projected/giant_layer.tif"

    af_uri = "C:/Users/rich/Desktop/af_biov2ct1.tif"
    am_uri = "C:/Users/rich/Desktop/am_biov2ct1.tif"
    as_uri = "C:/Users/rich/Desktop/as_biov2ct1.tif"
    cell_size = raster_utils.get_cell_size_from_uri(am_uri)
    #raster_utils.vectorize_datasets(
    #    [af_uri, am_uri, as_uri], lambda x,y,z: x+y+z, giant_layer_uri, gdal.GDT_Float32,
    #    -1, cell_size, 'union', vectorize_op=False)

    table_uri = base_table_uri
    table_file = open(table_uri, 'rU')
    
    table_header = table_file.readline().rstrip()


    lookup_table = raster_utils.get_lookup_from_csv(table_uri, 'ID100km')

    out_table_uri =  "C:/Users/rich/Desktop/all_grid_results_100km_human_elevation.csv"
    out_table_file = codecs.open(out_table_uri, 'w', 'utf-8')

    average_raster_list = [
        ("C:/Users/rich/Desktop/average_layers_projected/lighted_area_luminosity.tif", 'Lighted area density'),
        ("C:/Users/rich/Desktop/average_layers_projected/fi_average.tif", 'Fire densities'),
        ("C:/Users/rich/Desktop/average_layers_projected/glbctd1t0503m.tif", 'FAO_Cattle'),
        ("C:/Users/rich/Desktop/average_layers_projected/glbgtd1t0503m.tif", 'FAO_Goat'),
        ("C:/Users/rich/Desktop/average_layers_projected/glbpgd1t0503m.tif", 'FAO_Pig'),
        ("C:/Users/rich/Desktop/average_layers_projected/glbshd1t0503m.tif", 'FAO_Sheep'),
        ("C:/Users/rich/Desktop/average_layers_projected/glds00ag.tif", 'Human population density AG'),
        ("C:/Users/rich/Desktop/average_layers_projected/glds00g.tif", 'Human population density G'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_11.tif', '"11: Urban, Dense settlement"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_12.tif', '"12: Dense settlements, Dense settlements"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_22.tif', '"22: Irrigated villages, Villages"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_23.tif', '"23: Cropped & pastoral villages, Villages"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_24.tif', '"24: Pastoral villages, Villages"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_25.tif', '"25: Rainfed villages, Villages"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_26.tif', '"26: Rainfed mosaic villages, Villages"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_31.tif', '"31: Residential irrigated cropland, Croplands"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_32.tif', '"32: Residential rainfed mosaic, Croplands"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_33.tif', '"33: Populated irrigated cropland,   Croplands"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_34.tif', '"34: Populated rainfed cropland, Croplands"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_35.tif', '"35: Remote croplands, Croplands"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_41.tif', '"41: Residential rangelands, Rangelands"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_42.tif', '"42: Populated rangelands, Rangelands"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_43.tif', '"43: Remote rangelands, Rangelands"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_51.tif', '"51: Populated forests, Forested"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_52.tif', '"52: Remote forests, Forested"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_61.tif', '"61: Wild forests, Wildlands"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_62.tif', '"62: Sparse trees, Wildlands"'),
        ('C:/Users/rich/Desktop/average_layers_projected/anthrome_63.tif', '"63: Barren, Wildlands"'),
        ("C:/Users/rich/Desktop/average_layers_projected/5km_global_pantropic_dem.tif", '"Average Elevation"'),
        ]

    clipped_raster_list = []


    for average_raster_uri, header in average_raster_list:
        print 'clipping ' + average_raster_uri
        clipped_raster_uri = os.path.join(os.path.dirname(average_raster_uri), 'temp', os.path.basename(average_raster_uri))
        cell_size = raster_utils.get_cell_size_from_uri(average_raster_uri)
        raster_utils.vectorize_datasets(
            [average_raster_uri, giant_layer_uri], lambda x,y: x, clipped_raster_uri, gdal.GDT_Float32,
            -1, cell_size, 'intersection', vectorize_op=False)
        clipped_raster_list.append((clipped_raster_uri, header))

    dataset_list = [gdal.Open(uri) for uri, label in clipped_raster_list]
    band_list = [ds.GetRasterBand(1) for ds in dataset_list]
    nodata_list = [band.GetNoDataValue() for band in band_list]

    extended_table_headers = ','.join([header for _, header in average_raster_list])


    def write_to_file(value):
        try:
            out_table_file.write(value)
        except UnicodeDecodeError as e:
            out_table_file.write(value.decode('latin-1'))

    write_to_file(table_header + ',' + extended_table_headers + '\n')
    #print table_header + ',' + extended_table_headers

    for line in table_file:
        split_line = line.rstrip().split(',')
        grid_id = split_line[2]
    #for grid_id in lookup_table:
        try:
            split_grid_id = grid_id.split('-')
            grid_row_index, grid_col_index = map(int, split_grid_id)
        except ValueError as e:
            month_to_number = {
                'Jan': 1,
                'Feb': 2,
                'Mar': 3,
                'Apr': 4,
                'May': 5,
                'Jun': 6,
                'Jul': 7,
                'Aug': 8,
                'Sep': 9,
                'Oct': 10,
                'Nov': 11,
                'Dec': 12,
            }
            grid_row_index, grid_col_index = month_to_number[split_grid_id[0]], int(split_grid_id[1])
            
        print 'processing grid id ' + grid_id

        ds = dataset_list[0]
        base_srs = osr.SpatialReference(ds.GetProjection())
        lat_lng_srs = base_srs.CloneGeogCS()
        coord_transform = osr.CoordinateTransformation(
            base_srs, lat_lng_srs)
        gt = ds.GetGeoTransform()
        grid_resolution = 100 #100km
        
        row_coord = grid_row_index * grid_resolution * 1000 + GLOBAL_UPPER_LEFT_ROW
        col_coord = grid_col_index * grid_resolution * 1000 + GLOBAL_UPPER_LEFT_COL

        lng_coord, lat_coord, _ = coord_transform.TransformPoint(
            col_coord, row_coord)
        write_to_file(','.join(split_line[0:2]) + ',%d-%d,' % (grid_row_index, grid_col_index) + ','.join(split_line[3:11]) +',%f,%f,' % (lat_coord, lng_coord)+','.join(split_line[13:]))

        for (_, header), band, ds, nodata in zip(clipped_raster_list, band_list, dataset_list, nodata_list):

            gt = ds.GetGeoTransform()
            n_rows = ds.RasterYSize
            n_cols = ds.RasterXSize
               
            xoff = int(grid_col_index * (grid_resolution * 1000.0) / (gt[1]))
            yoff = int(grid_row_index * (grid_resolution * 1000.0) / (-gt[5]))
            win_xsize = int((grid_resolution * 1000.0) / (gt[1]))
            win_ysize = int((grid_resolution * 1000.0) / (gt[1]))

            if xoff + win_xsize > n_cols:
                win_xsize = n_cols - xoff
            if yoff + win_ysize > n_rows:
                win_ysize = n_rows - yoff

            block = band.ReadAsArray(
                xoff=xoff, yoff=yoff, win_xsize=win_xsize, win_ysize=win_ysize)
            block_average = numpy.average(block[block != nodata])
            write_to_file(',%f' % block_average)
        write_to_file('\n')
import os
import numpy
import gdal

from invest_natcap import raster_utils

anthrome_uri = "C:/Users/rich/Desktop/average_layers_projected/gl_anthrome.tif"
anthrome_ds = gdal.Open(anthrome_uri)
anthrome_band = anthrome_ds.GetRasterBand(1)

anthrome_array = anthrome_band.ReadAsArray()
unique_anthrome_ids = numpy.unique(anthrome_array)

for anthrome_id in unique_anthrome_ids:
    output_uri = os.path.join(os.path.dirname(anthrome_uri), 'anthrome_%d.tif' % anthrome_id)
    out_pixel_size = raster_utils.get_cell_size_from_uri(anthrome_uri)
    raster_utils.vectorize_datasets(
        [anthrome_uri], lambda x: x==anthrome_id, output_uri, gdal.GDT_Byte,
        127, out_pixel_size, "union", vectorize_op=False)

print numpy.unique(anthrome_array).shape
def process_ecoregion(prefix):
    ecoregion_shapefile_uri = os.path.join(
        DATA_DIR, 'ecoregions', 'ecoregions_projected.shp')

    ecoregion_lookup = raster_utils.extract_datasource_table_by_key(
        ecoregion_shapefile_uri, 'ECO_ID_U')
    ecoregion_nodata = -1
    ecoregion_lookup[ecoregion_nodata] = {
        'ECO_NAME': 'UNKNOWN',
        'ECODE_NAME': 'UNKNOWN',
        'WWF_MHTNAM': 'UNKNOWN',
        }

    lulc_raw_uri = os.path.join(DATA_DIR, '%s%s' % (prefix, LULC_BASE))
    biomass_raw_uri = os.path.join(DATA_DIR, '%s%s' % (prefix, BIOMASS_BASE))

    cell_size = raster_utils.get_cell_size_from_uri(lulc_raw_uri)

    lulc_uri = os.path.join(OUTPUT_DIR, "%s_lulc_aligned.tif" % (prefix))
    biomass_uri = os.path.join(OUTPUT_DIR, "%s_biomass_aligned.tif" % (prefix))

    raster_utils.align_dataset_list(
        [lulc_raw_uri, biomass_raw_uri], [lulc_uri, biomass_uri], ['nearest']*2,
        cell_size, 'intersection', 0, dataset_to_bound_index=None,
        aoi_uri=None, assert_datasets_projected=True, process_pool=None)

    #create ecoregion id
    ecoregion_dataset_uri = os.path.join(
        OUTPUT_DIR, "%s_ecoregion_id.tif" % (prefix))
    raster_utils.new_raster_from_base_uri(
        lulc_uri, ecoregion_dataset_uri, 'GTiff', ecoregion_nodata, gdal.GDT_Int16)
    raster_utils.rasterize_layer_uri(
        ecoregion_dataset_uri, ecoregion_shapefile_uri,
        option_list=["ATTRIBUTE=ECO_ID_U"])

    lulc_nodata = raster_utils.get_nodata_from_uri(lulc_uri)

    forest_lulc_codes = [1, 2, 3, 4, 5]

    mask_uri = os.path.join(OUTPUT_DIR, "%s_mask.tif" % prefix)
    mask_nodata = 2

    def mask_nonforest(lulc):
        mask = numpy.empty(lulc.shape, dtype=numpy.int8)
        mask[:] = 1
        for lulc_code in forest_lulc_codes:
            mask[lulc == lulc_code] = 0
        mask[lulc == lulc_nodata] = mask_nodata
        return mask

    raster_utils.vectorize_datasets(
        [lulc_uri,], mask_nonforest, mask_uri, gdal.GDT_Byte,
        mask_nodata, cell_size, 'intersection', dataset_to_align_index=0,
        dataset_to_bound_index=None, aoi_uri=None,
        assert_datasets_projected=True, process_pool=None, vectorize_op=False,
        datasets_are_pre_aligned=True)

    forest_edge_distance_uri = os.path.join(OUTPUT_DIR, "%s_forest_edge.tif" % prefix)
    raster_utils.distance_transform_edt(mask_uri, forest_edge_distance_uri)

    biomass_stats_uri = os.path.join(OUTPUT_DIR, "%s_biomass_stats.csv" % prefix)
    _aggregate_results(forest_edge_distance_uri, biomass_uri, ecoregion_dataset_uri, ecoregion_lookup, biomass_stats_uri)