Beispiel #1
0
def log(message):
    common_functions.log(message)
    return
def prepare_canopy_data(input_tile_folder, tile_dimension, ndvi_raster_folder,
                        start_step, scratch_workspace, output_fc):
    try:
        arcpy.env.overwriteOutput = True
        arcpy.env.parallelProcessingFactor = "100%"
        arcpy.env.scratchWorkspace = os.path.normpath(scratch_workspace)
        arcpy.CheckOutExtension("Spatial")

        step_start = int(start_step)
        step_count = 1
        step_total = 14

        common_functions.log("Logging to " + arcpy.env.scratchFolder)
        common_functions.step_header(0, step_total, 'Input parameters', [
            input_tile_folder, tile_dimension, ndvi_raster_folder, start_step,
            scratch_workspace, output_fc
        ], [])

        input_tile_folder = os.path.normpath(input_tile_folder)
        ndvi_raster_folder = os.path.normpath(ndvi_raster_folder)
        output_fc = os.path.normpath(output_fc)

        tile_file_name_table = os.path.join(arcpy.env.scratchGDB,
                                            'tile_file_names')
        merged_tiles_unclumped = os.path.join(arcpy.env.scratchGDB,
                                              'merged_tiles_unclumped')
        fence_lines = os.path.join(arcpy.env.scratchGDB, 'fence_lines')
        fence_sitter_clumps_undissolved = os.path.join(
            arcpy.env.scratchGDB, 'fence_sitter_clumps_undissolved')
        fence_sitter_clumps_dissolved = os.path.join(
            arcpy.env.scratchGDB, 'fence_sitter_clumps_dissolved')
        merged_tiles_clumped = os.path.join(arcpy.env.scratchGDB,
                                            'merged_tiles_clumped')
        merged_ndvi_rasters = os.path.join(arcpy.env.scratchGDB,
                                           'merged_ndvi_rasters')
        zonal_ndvi = os.path.join(arcpy.env.scratchGDB, 'zonal_ndvi')
        #        canopies_without_ndvi = os.path.join(arcpy.env.scratchGDB, 'canopies_without_ndvi')
        canopies_without_ndvi = output_fc

        if step_count >= step_start:
            common_functions.step_header(step_count, step_total,
                                         'Collecting tile file names',
                                         [input_tile_folder],
                                         [tile_file_name_table])
            tile_file_names.create_table(input_tile_folder,
                                         tile_file_name_table)
        step_count += 1

        if step_count >= step_start:
            common_functions.step_header(step_count, step_total,
                                         'Populating TileId in all tiles',
                                         [input_tile_folder],
                                         [input_tile_folder])
            populate_field.populate([
                l + (
                    TILE_ID_COLUMN_NAME,
                    'Integer',
                )
                for l in tile_file_names.read_file_names(tile_file_name_table)
            ])
        step_count += 1

        if step_count >= step_start:
            common_functions.step_header(
                step_count, step_total,
                'Merging tiles into a single feature class',
                [tile_file_name_table], [merged_tiles_unclumped])
            merge_tiles.merge(tile_file_name_table, merged_tiles_unclumped)
        step_count += 1

        if step_count >= step_start:
            common_functions.step_header(
                step_count, step_total,
                'Adding and populating PolygonId field',
                [merged_tiles_unclumped], [merged_tiles_unclumped])
            populate_field.populate([(merged_tiles_unclumped, 'UNIQUE_ID',
                                      POLYGON_ID_COLUMN_NAME, 'Integer')])
        step_count += 1

        if step_count >= step_start:
            common_functions.step_header(step_count, step_total,
                                         'Creating fence lines',
                                         [tile_file_name_table], [fence_lines])
            interpolate_tile_extents.main_process_fc_files(
                tile_file_name_table, tile_dimension, fence_lines)
        step_count += 1

        if step_count >= step_start:
            common_functions.step_header(
                step_count, step_total,
                'Creating fence sitters feature class (all polygons that intersect a fence line)',
                [merged_tiles_unclumped, fence_lines],
                [fence_sitter_clumps_undissolved])
            arcpy.SpatialJoin_analysis(merged_tiles_unclumped, fence_lines,
                                       fence_sitter_clumps_undissolved,
                                       'JOIN_ONE_TO_ONE', 'KEEP_COMMON', '',
                                       'INTERSECT')
        step_count += 1

        if step_count >= step_start:
            common_functions.step_header(step_count, step_total,
                                         'Dissolve fence sitters into clumps',
                                         [fence_sitter_clumps_undissolved],
                                         [fence_sitter_clumps_dissolved])
            arcpy.Dissolve_management(fence_sitter_clumps_undissolved,
                                      fence_sitter_clumps_dissolved, "", "",
                                      "SINGLE_PART", "DISSOLVE_LINES")
        step_count += 1

        if step_count >= step_start:
            common_functions.step_header(step_count, step_total,
                                         'Adding and populating ClumpId',
                                         [fence_sitter_clumps_dissolved],
                                         [fence_sitter_clumps_dissolved])
            populate_field.populate([
                (fence_sitter_clumps_dissolved, 'UNIQUE_ID',
                 CLUMP_ID_COLUMN_NAME, 'Integer')
            ])
        step_count += 1

        if step_count >= step_start:
            common_functions.step_header(
                step_count, step_total, 'Append ClumpId to merged tiles',
                [merged_tiles_unclumped, fence_sitter_clumps_dissolved],
                [merged_tiles_clumped])
            arcpy.SpatialJoin_analysis(merged_tiles_unclumped,
                                       fence_sitter_clumps_dissolved,
                                       merged_tiles_clumped, "JOIN_ONE_TO_ONE",
                                       "KEEP_ALL", '', 'WITHIN')
        step_count += 1

        if step_count >= step_start:
            common_functions.step_header(
                step_count, step_total,
                'Stitching adjacent fence sitters together',
                [merged_tiles_clumped], [canopies_without_ndvi])
            merge_fence_sitters.merge(merged_tiles_clumped,
                                      canopies_without_ndvi)
        step_count += 1

        if step_count >= step_start:
            common_functions.step_header(step_count, step_total,
                                         'Merge NDVI rasters',
                                         [ndvi_raster_folder],
                                         [merged_ndvi_rasters])
            arcpy.Delete_management(merged_ndvi_rasters)
            arcpy.CreateMosaicDataset_management(
                os.path.dirname(merged_ndvi_rasters),
                os.path.basename(merged_ndvi_rasters),
                RASTER_COORDINATE_SYSTEM, 1, '32_BIT_FLOAT', 'NONE')
            arcpy.AddRastersToMosaicDataset_management(
                merged_ndvi_rasters, 'Raster Dataset', ndvi_raster_folder, '',
                '', '', '', '', '', '', '*.tif', False, 'OVERWRITE_DUPLICATES')
        step_count += 1

        if step_count >= step_start:
            common_functions.step_header(
                step_count, step_total, 'Computing NDVI zonal statistics',
                [canopies_without_ndvi, merged_ndvi_rasters], [zonal_ndvi])
            compute_zonal_stats.compute(canopies_without_ndvi,
                                        POLYGON_ID_COLUMN_NAME,
                                        merged_ndvi_rasters, zonal_ndvi)
            compute_zonal_stats
        step_count += 1

        if step_count >= step_start:
            common_functions.step_header(step_count, step_total,
                                         'Appending NDVI statistics',
                                         [canopies_without_ndvi, zonal_ndvi],
                                         [output_fc])
            join_files.join(output_fc, POLYGON_ID_COLUMN_NAME, zonal_ndvi,
                            POLYGON_ID_COLUMN_NAME, 'MAX;MEAN;STD')
        step_count += 1

        if step_count >= step_start:
            common_functions.step_header(step_count, step_total, 'Cleaning up',
                                         [], [])
            arcpy.DeleteField_management(output_fc, [
                'Join_Count', 'Shape_Length_1', 'Shape_Area_1', 'PolygonId_1',
                'COUNT', 'AREA_1'
            ])
        step_count += 1

    finally:
        arcpy.CheckInExtension("Spatial")