示例#1
0
def main():
    # GET PARAMETER VALUES
    Analysis_Area = arcpy.GetParameterAsText(0)
    Current_Anthro_Features_Provided = arcpy.GetParameterAsText(1)  # optional
    Dist_Lek = arcpy.GetParameterAsText(2)

    # DEFINE DIRECTORIES
    # Get the pathname to this script
    scriptPath = sys.path[0]
    arcpy.AddMessage("Script folder: " + scriptPath)
    # Construct pathname to workspace
    workspace = arcpy.Describe(Analysis_Area).path
    arcpy.AddMessage("Project geodatabase: " + workspace)

    # Instantiate a ccsStandard object
    ccsStandard = ccslib.ccsStandard(workspace, scriptPath)

    # ENVIRONMENT SETTINGS
    # Set workspaces
    arcpy.env.workspace = workspace
    scratch_folder = os.path.join(arcpy.Describe(workspace).path, 'scratch')
    if arcpy.Exists(scratch_folder):
        pass
    else:
        arcpy.CreateFolder_management(
            arcpy.Describe(workspace).path, 'scratch')
    arcpy.env.scratchWorkspace = scratch_folder
    # Overwrite outputs
    arcpy.env.overwriteOutput = True

    # DEFINE VARIABLES FOR INPUT DATA
    AnthroAttributeTable = ccsStandard.AnthroAttributeTable
    emptyRaster = ccsStandard.EmptyRaster
    inputDataPath = ccsStandard.InputDataPath

    # Filenames for feature classes and raster used by this script
    ELIGIBLE_PROPOSED_FEATURES = "Proposed_Surface_Disturbance_Eligible"
    DEBIT_PROJECT_AREA = "Debit_Project_Area"

    # Filenames for feature classes and rasters created by this script
    CURRENT_ANTHRO_FEATURES = "Current_Anthro_Features"
    PROJECTED_ANTHRO_FEATURES = "Projected_Anthro_Features"
    PERMANENT_ANTHRO_FEATURES = "Permanent_Anthro_Features"
    CURRENT_ANTHRO_DISTURBANCE = "Current_Anthro_Disturbance"
    PROJECTED_ANTHRO_DISTURBANCE = "Projected_Anthro_Disturbance"
    PERMANENT_ANTHRO_DISTURBANCE = "Permanent_Anthro_Disturbance"
    MAP_UNITS = "Map_Units"

    # ------------------------------------------------------------------------

    # FUNCTION CALLS
    # Check tool version
    ccslib.CheckToolVersion()

    # Check out Spatial Analyst extension
    ccslib.CheckOutSpatialAnalyst()

    # Check Analysis_Area
    expected_fcs = [ELIGIBLE_PROPOSED_FEATURES, DEBIT_PROJECT_AREA]
    ccslib.CheckPolygonInput(Analysis_Area, expected_fcs=expected_fcs)

    # Create Current_Anthro_Features layer, or copy provided into geodatabase
    if Current_Anthro_Features_Provided:
        # Clear selection, if present
        ccslib.ClearSelectedFeatures(Current_Anthro_Features_Provided)

        # Check Current_Anthro_Features
        required_fields = [
            "Type", "Subtype", "Overlap_Status", "Returned",
            "Subtype_As_Modified"
        ]
        no_null_fields = None
        expected_fcs = None
        ccslib.CheckPolygonInput(Current_Anthro_Features_Provided,
                                 required_fields, expected_fcs, no_null_fields)

        # Update message
        arcpy.AddMessage("Copying Current_Anthro_Features to project "
                         "geodatabase")

        # Copy Current_Anthro_Features to geodatabase
        provided_input = Current_Anthro_Features_Provided
        parameter_name = CURRENT_ANTHRO_FEATURES
        Current_Anthro_Features = ccslib.AdoptParameter(provided_input,
                                                        parameter_name,
                                                        preserve_existing=True)

    else:
        # Update message
        arcpy.AddMessage("Merging all clipped anthropogenic features to "
                         "create the Current_Anthro_Features layer")

        # Merge features (selecting only polygon features)
        fileList = arcpy.ListFeatureClasses("Anthro*Clip",
                                            feature_type="Polygon")
        out_name = CURRENT_ANTHRO_FEATURES
        Current_Anthro_Features = ccslib.MergeFeatures(fileList, out_name)

    # Simplify fields. critical to remove any fields named
    # 'Surface_Disturbance' in Current_Anthro_Features before joining
    # Proposed_Surface_Disturbance to create Projected_Anthro_Features
    allowable_fields = [
        "Type", "Subtype", "SubtypeID", "Subtype_As_Modified",
        "Overlap_Status", "Returned"
    ]
    ccslib.SimplifyFields(Current_Anthro_Features, allowable_fields)

    # Remove subtypes from Current_Anthro_Features
    feature = Current_Anthro_Features
    subtypes = arcpy.da.ListSubtypes(feature)
    try:
        if len(subtypes) == 1 and subtypes[0]['SubtypeField'] == '':
            pass
        else:
            for subtype in subtypes:
                arcpy.RemoveSubtype_management(feature, subtype)
                arcpy.AddMessage("Subtype removed")
    except arcpy.ExecuteError:
        arcpy.AddMessage("Could not remove Subtype Domain from "
                         "Current_Anthro_Features")

    # Add Domains for Type and Subtype
    try:
        arcpy.RemoveDomainFromField_management(feature, "Type")
        arcpy.AssignDomainToField_management(feature, "Type", "Type")
    except arcpy.ExecuteError:
        arcpy.AddMessage("Could not update Type Domain for "
                         "Current_Anthro_Features")
    try:
        arcpy.RemoveDomainFromField_management(feature, "Subtype")
        arcpy.AssignDomainToField_management(feature, "Subtype", "Subtype")
    except arcpy.ExecuteError:
        arcpy.AddMessage("Could not update Subtype Domain for "
                         "Current_Anthro_Features")
    try:
        arcpy.RemoveDomainFromField_management(feature, "Subtype_As_Modified")
        arcpy.AssignDomainToField_management(feature, "Subtype", "Subtype")
    except arcpy.ExecuteError:
        arcpy.AddMessage("Could not update Type Domain for "
                         "Current_Anthro_Features")

    # Calculate Current_Anthro_Disturbance
    extent_fc = Analysis_Area
    anthro_features = Current_Anthro_Features
    term = ccsStandard.DebitTerms[0]
    Current_Anthro_Disturbance = ccslib.CalcAnthroDist(extent_fc,
                                                       anthro_features,
                                                       emptyRaster,
                                                       AnthroAttributeTable,
                                                       term)
    Current_Anthro_Disturbance.save(CURRENT_ANTHRO_DISTURBANCE)

    # Update message
    arcpy.AddMessage("Current_Anthro_Disturbance Calculated")
    arcpy.AddMessage("Removing any anthropogenic features from the "
                     "Current_Anthro_Features layer that will be "
                     "replaced or upgraded from one subtype to another "
                     "by the debit project")

    # Calculate post-project anthropogenic disturbance
    mod_field = "Overlap_Status"
    removed_code = "Removed"
    subtype_mod_field = "Subtype_As_Modified"
    out_name = PROJECTED_ANTHRO_FEATURES
    Projected_Anthro_Features = ccslib.SelectProposed(
        Current_Anthro_Features, ELIGIBLE_PROPOSED_FEATURES, mod_field,
        removed_code, subtype_mod_field, out_name)

    # Simplify fields (do not remove Surface Disturbance or Reclassified
    # Subtype field for use in SelectPermanent())
    allowable_fields = [
        "Type", "Subtype", "SubtypeID", "Overlap_Status", "Returned",
        "Subtype_As_Modified"
        "Surface_Disturbance", "Reclassified_Subtype"
    ]
    ccslib.SimplifyFields(Projected_Anthro_Features, allowable_fields)

    # Calculate Projected_Anthro_Disturbance
    extent_fc = Analysis_Area
    anthro_features = Projected_Anthro_Features
    term = ccsStandard.DebitTerms[1]
    Projected_Anthro_Disturbance = ccslib.CalcAnthroDist(
        extent_fc, anthro_features, emptyRaster, AnthroAttributeTable, term)
    Projected_Anthro_Disturbance.save(PROJECTED_ANTHRO_DISTURBANCE)

    # Update message
    arcpy.AddMessage("Projected_Anthro_Disturbance Calculated")
    arcpy.AddMessage("Creating Permanent Anthro Features and calculating "
                     "disturbance")

    # Calculate permanent anthropogenic disturbance
    # Select permanent anthropogenic features from Projected Anthro Features
    mod_field = "Overlap_Status"
    returned_field = "Returned"
    subtype_mod_field = "Subtype_As_Modified"
    duration_field = "Surface_Disturbance"
    permanent_codes = ["Term_Reclassified", "Permanent"]
    reclass_code = "Term_Reclassified"
    reclass_subtype_field = "Reclassified_Subtype"
    out_name = PERMANENT_ANTHRO_FEATURES
    Permanent_Anthro_Features = ccslib.SelectPermanent(
        Current_Anthro_Features, ELIGIBLE_PROPOSED_FEATURES, mod_field,
        returned_field, subtype_mod_field, duration_field, permanent_codes,
        reclass_code, reclass_subtype_field, out_name)

    # Simplify fields
    allowable_fields = [
        "Type", "Subtype", "SubtypeID", "Overlap_Status", "Returned",
        "Subtype_As_Modified"
        "Surface_Disturbance", "Reclassified_Subtype"
    ]
    ccslib.SimplifyFields(Permanent_Anthro_Features, allowable_fields)

    # Calculate Permanent Anthro Disturbance
    extent_fc = Analysis_Area
    anthro_features = Permanent_Anthro_Features
    term = ccsStandard.DebitTerms[2]
    Permanent_Anthro_Disturbance = ccslib.CalcAnthroDist(
        extent_fc, anthro_features, emptyRaster, AnthroAttributeTable, term)
    Permanent_Anthro_Disturbance.save(PERMANENT_ANTHRO_DISTURBANCE)

    # Update message
    arcpy.AddMessage("Permanent_Anthro_Disturbance Calculated")

    # Calculate local scale modifiers for Current, Projected, and
    # Permanent condition
    extent_fc = Analysis_Area
    terms = ccsStandard.DebitTerms
    for term in terms:
        anthro_disturbance = term + "_Anthro_Disturbance"
        ccslib.CalcModifiers(extent_fc, inputDataPath, Dist_Lek,
                             anthro_disturbance, term)

    # Calculate impact intensity for debit project
    try:
        ccslib.calcDebitImpact(inputDataPath)

        # Add debit project impact to map
        layerFile = ccsStandard.getLayerFile("Debit_Project_Impact.lyr")
        ccslib.AddToMap("Debit_Project_Impact", layerFile, zoom_to=True)
    except:
        pass

    # Update message
    arcpy.AddMessage("Creating Map Units layer")

    # Create Map_Units layer
    Project_Area = DEBIT_PROJECT_AREA
    out_name = MAP_UNITS
    Map_Units = ccslib.CreateMapUnits(Project_Area, out_name)

    # Update message
    arcpy.AddMessage("Creating pre-defined map units of Wet Meadows")

    # Intersect the Map_Units layer with the NV Wet Meadows layer
    in_feature = ccsStandard.Wet_Meadows
    field_name = "Meadow"
    na_value = "No Meadow"
    ccslib.CreatePreDefinedMapUnits(Map_Units, in_feature, field_name,
                                    na_value)

    # Update message
    arcpy.AddMessage("Creating pre-defined map units of PJ")

    # Intersect the Map_Units layer with the Phase III PJ layer
    in_feature = ccsStandard.PJ_Phase_III
    field_name = "Conifer_Phase"
    ccslib.CreatePreDefinedMapUnits(Map_Units, in_feature, field_name)

    # Update message
    arcpy.AddMessage("Creating pre-defined map units of proposed surface "
                     "disturbance")

    # Intersect the Map_Units layer with the proposed surface disturbance
    in_features = ELIGIBLE_PROPOSED_FEATURES
    ccslib.CreatePreDefinedMapUnits(Map_Units, in_features, field_name)

    # Remove unwanted fields from Map Units feature class
    allowable_fields = [
        "Disturbance_Type", "BROTEC", "Conifer_Phase", "Meadow"
    ]
    ccslib.SimplifyFields(Map_Units, allowable_fields)

    # Populate empty attributes with Indirect
    feature = Map_Units
    fieldName = "Disturbance_Type"
    where_clause = "{} = ''".format(
        arcpy.AddFieldDelimiters(feature, fieldName))
    with arcpy.da.UpdateCursor(feature, fieldName, where_clause) as cursor:
        for row in cursor:
            row[0] = "Indirect"
            cursor.updateRow(row)

    # Add Map_Units to map
    layerFile = ccsStandard.getLayerFile("Map_Units.lyr")
    ccslib.AddToMap(Map_Units, layerFile)

    # Add fields Map_Unit_ID, Map_Unit_Name, and Precip to map unit
    input_feature = Map_Units
    fields = ["Map_Unit_ID", "Map_Unit_Name", "Notes"]
    fieldTypes = ["SHORT", "TEXT", "TEXT"]
    ccslib.AddFields(input_feature, fields, fieldTypes, copy_existing=True)

    # Add Domains to Map_Units layer
    # Create Domain for Map_Unit_ID attributes
    input_feature = Map_Units
    domainName = "Map_Unit_ID"
    range_low = 0
    range_high = 10000
    ccslib.AddRangeDomain(input_feature, workspace, domainName, range_low,
                          range_high)

    # Create Domain for Meadow attributes
    featureList = [Map_Units]
    domainName = "Meadow"
    codeList = ["Altered", "Unaltered", "No Meadow"]
    ccslib.AddCodedTextDomain(featureList, workspace, domainName, codeList)

    # Clean up
    arcpy.Delete_management("in_memory")

    # Save map document and exit
    if arcpy.ListInstallations()[0] == 'arcgispro':
        p = arcpy.mp.ArcGISProject("CURRENT")
        p.save()
    else:
        mxd = arcpy.mapping.MapDocument("CURRENT")
        mxd.save()
示例#2
0
def main():
    # GET PARAMETER VALUES
    Map_Units_Provided = arcpy.GetParameterAsText(0)  # optional
    Proposed_Modified_Features_Provided = arcpy.GetParameterAsText(1)  # optional
    Project_Folder = arcpy.GetParameterAsText(2)

    # DEFINE DIRECTORIES
    # Get the pathname to this script
    scriptPath = sys.path[0]
    arcpy.AddMessage("Script folder: " + scriptPath)
    arcpy.AddMessage("Python version: " + sys.version)
    # Construct pathname to workspace
    if Map_Units_Provided:
        workspace = arcpy.Describe(Map_Units_Provided).path
    elif Proposed_Modified_Features_Provided:
        workspace = arcpy.Describe(Proposed_Modified_Features_Provided).path
    else:
        arcpy.AddMessage("Please provide either a Map_Units or " +
                         "Proposed_Modified_Features layer.")
        sys.exit(0)
    arcpy.AddMessage("Project geodatabase: " + workspace)
    Project_Folder = arcpy.Describe(workspace).path
    arcpy.AddMessage("Project folder:" + Project_Folder)
    
    # Instantiate a ccsStandard object
    ccsStandard = ccslib.ccsStandard(workspace, scriptPath)

    # ENVIRONMENT SETTINGS
    # Set workspaces
    arcpy.env.workspace = workspace
    scratch_folder = os.path.join(
        arcpy.Describe(workspace).path, 'scratch'
        )
    if arcpy.Exists(scratch_folder):
        pass
    else:
        arcpy.CreateFolder_management( arcpy.Describe(workspace).path, 'scratch')
    arcpy.env.scratchWorkspace = scratch_folder
    # Overwrite outputs
    arcpy.env.overwriteOutput = True

    # DEFINE GLOBAL VARIABLES
    AnthroAttributeTable = ccsStandard.AnthroAttributeTable
    # Filenames for feature class and rasters created by this script
    INDIRECT_IMPACT_AREA = "Indirect_Impact_Area"
    ANALYSIS_AREA = "Analysis_Area"
    # Filenames for feature classes or rasters used by this script
    MAP_UNITS = "Map_Units"
    PROPOSED_MODIFIED_FEATURES = "Proposed_Modified_Features"
    CREDIT_PROJECT_AREA = "Credit_Project_Area"

    # ------------------------------------------------------------------------

    # FUNCTION CALLS
    # Check provided layers
    if not Map_Units_Provided and not Proposed_Modified_Features_Provided:
        arcpy.AddError("ERROR:: Please provide a 'Map_Units' and/or "
                       "'Proposed_Modified_Features' feature.")
        sys.exit(0)

    if not Proposed_Modified_Features_Provided:
        # Ensure Proposed_Modified_Features does not exist
        if arcpy.Exists("Proposed_Modified_Features"):
            arcpy.AddError("ERROR:: A 'Proposed_Modified_Features' layer "
                           "was detected in the project's geodatabase. "
                           "Provide the 'Proposed_Modified_Features' layer "
                           "and re-run Credit Tool 2.")
            sys.exit(0)

    if Map_Units_Provided:
        # Clear selection, if present
        ccslib.ClearSelectedFeatures(Map_Units_Provided)

        # Check provided layer
        feature = Map_Units_Provided
        required_fields = ["Map_Unit_ID", "Map_Unit_Name", "Meadow"]
        no_null_fields = ["Map_Unit_ID", "Meadow"]
        expected_fcs = [CREDIT_PROJECT_AREA]
        ccslib.CheckPolygonInput(feature, required_fields, expected_fcs,
                                 no_null_fields)

        # Update Map Units layer with provided layer
        provided_input = Map_Units_Provided
        parameter_name = MAP_UNITS
        preserve_existing = False
        Map_Units = ccslib.AdoptParameter(provided_input, parameter_name,
                                          preserve_existing)

        # Add Map Units layer to map
        layerFile = ccsStandard.getLayerFile("Map_Units.lyr")
        ccslib.AddToMap(Map_Units, layerFile)

        # Provide location of Credit Project Area
        Credit_Project_Area = CREDIT_PROJECT_AREA

    # Set up flag for projects that propose to modify anthro features
    includes_anthro_mod = False

    if Proposed_Modified_Features_Provided:
        # Update flag
        includes_anthro_mod = True

        # Clear selection, if present
        ccslib.ClearSelectedFeatures(Proposed_Modified_Features_Provided)

        # Check provided layer
        required_fields = ["Type", "Subtype"]
        no_null_fields = required_fields
        expected_fcs = None
        ccslib.CheckPolygonInput(Proposed_Modified_Features_Provided,
                                 required_fields, expected_fcs, no_null_fields)

        # Update Proposed_Modified_Features with provided layer
        provided_input = Proposed_Modified_Features_Provided
        parameterName = PROPOSED_MODIFIED_FEATURES
        preserve_existing = False
        Proposed_Modified_Features = ccslib.AdoptParameter(
            provided_input, parameterName, preserve_existing
            )

        # Add Proposed Modified Features layer to map
        layerFile = ccsStandard.getLayerFile("SurfaceDisturbance.lyr")
        ccslib.AddToMap(Proposed_Modified_Features, layerFile)

        # Update message
        arcpy.AddMessage("Creating the area of indirect benefit")

        # Create Credit_Project_Area for projects that propose to modify
        # anthropogenic features
        # Create the Indirect_Impact_Area
        in_data = Proposed_Modified_Features
        out_name = INDIRECT_IMPACT_AREA
        Indirect_Impact_Area = ccslib.CreateIndirectImpactArea(
            in_data, AnthroAttributeTable, out_name
            )

        # Add field "Indirect"
        input_feature = Indirect_Impact_Area
        fieldsToAdd = ["Indirect"]
        fieldTypes = ["TEXT"]
        ccslib.AddFields(input_feature, fieldsToAdd, fieldTypes)

        # Update field 'Indirect' to equal 'True'
        with arcpy.da.UpdateCursor(Indirect_Impact_Area,
                                   fieldsToAdd) as cursor:
            for row in cursor:
                row[0] = "True"
                cursor.updateRow(row)

        if Map_Units_Provided:
            # Merge with Credit_Project_Boundary
            fileList = [Map_Units_Provided, Indirect_Impact_Area]
            out_name = "in_memory/Credit_Project_Boundary"
            Project_Area = arcpy.Union_analysis(fileList, out_name)
        else:
            Project_Area = Indirect_Impact_Area
                
        # Eliminate areas of non-habitat to create Credit_Project_Area
        out_name = CREDIT_PROJECT_AREA
        habitat_bounds = ccsStandard.HabitatBounds
        Credit_Project_Area = ccslib.EliminateNonHabitat(
            Project_Area, out_name, habitat_bounds
            )

    # Update message
    arcpy.AddMessage("Copying Credit_Project_Area as shapefile into project"
                     " folder")

    # Export feature class to shapefile in project folder so it can be sent to
    # NDOW for Dist_Lek layer
    arcpy.FeatureClassToShapefile_conversion(Credit_Project_Area,
                                             Project_Folder)

    # Update message
    arcpy.AddMessage("Creating Analysis Area")

    # Create Analysis Area
    out_name = ANALYSIS_AREA
    Analysis_Area = ccslib.CreateAnalysisArea(Credit_Project_Area,
                                              AnthroAttributeTable,
                                              out_name)

    # Add Analysis_Area to map
    layerFile = ccsStandard.getLayerFile("Analysis_Area.lyr")
    ccslib.AddToMap(Analysis_Area, layerFile, zoom_to=True)

    # Update message
    arcpy.AddMessage("Clipping all anthropogenic features to Analysis Area "
                     "and adding templates for digitizing new anthropogenic "
                     "features")

    # Clip all provided anthropogenic feature layers and add to map
    clip_features = Analysis_Area
    anthroFeaturePath = ccsStandard.AnthroFeaturePath
    ccslib.ClipAnthroFeaturesCredit(clip_features, anthroFeaturePath)
    featureList = arcpy.ListFeatureClasses("Anthro_*_Clip")

    # If the project proposes to modify anthropogenic features,
    # add a 'Subtype_As_Modified" field
    if includes_anthro_mod:
        fieldsToAdd = ["Subtype_As_Modified"]
        fieldTypes = ["TEXT"]
        for feature in featureList:
            ccslib.AddFields(feature, fieldsToAdd, fieldTypes)
            # Apply domains
            field = fieldsToAdd[0]
            domainName = feature[7:-5] + "_Subtypes"
            try:
                arcpy.AssignDomainToField_management(feature, field, domainName)
            except arcpy.ExecuteError:
                arcpy.AddMessage(domainName + " not updated. Use caution "
                                 "when populating attribute field")
            # Copy current subtype to Subtype as Modified field
            arcpy.CalculateField_management(feature, field, "!Subtype!",
                                            "PYTHON_9.3")

    # Add each feature to map for editing
    for feature in featureList:
        ccslib.AddAnthroToMap(workspace, feature)

    # Clean up
    arcpy.Delete_management("in_memory")

    # Save map document
    if arcpy.ListInstallations()[0] == 'arcgispro':
        p = arcpy.mp.ArcGISProject("CURRENT")
        p.save()
    else:
        mxd = arcpy.mapping.MapDocument("CURRENT")
        mxd.save()
示例#3
0
def main():
    # GET PARAMETER VALUES
    workspace = arcpy.GetParameterAsText(0)
    Provided_Disturbance = arcpy.GetParameterAsText(1)
    includes_anthro_mod = arcpy.GetParameterAsText(2)  # optional
    Proposed_Modified_Features_Provided = arcpy.GetParameterAsText(
        3)  # optional

    # Update boolean parameters
    includes_anthro_mod = ccslib.Str2Bool(includes_anthro_mod)

    # DEFINE DIRECTORIES
    # Get the pathname to this script
    scriptPath = sys.path[0]
    arcpy.AddMessage("Script folder: " + scriptPath)
    arcpy.AddMessage("Python version: " + sys.version)

    # Instantiate a ccsStandard object
    ccsStandard = ccslib.ccsStandard(workspace, scriptPath)

    # ENVIRONMENT SETTINGS
    # Set workspaces
    arcpy.env.workspace = workspace
    arcpy.env.scratchWorkspace = workspace
    # Overwrite outputs
    arcpy.env.overwriteOutput = True

    # DEFINE GLOBAL VARIABLES
    AnthroAttributeTable = ccsStandard.AnthroAttributeTable
    coordinate_system = ccsStandard.CoorSystem
    # Filenames for feature classes and rasters created by this script
    PROPOSED_SURFACE_DISTURBANCE_DEBITS = "Proposed_Surface_Disturbance_Debits"
    PROPOSED_MODIFIED_FEATURES = "Proposed_Modified_Features"

    # ------------------------------------------------------------------------

    # FUNCTION CALLS
    # Check tool version
    ccslib.CheckToolVersion()

    # Update includes_anthro_mod if Proposed_Modified_Features is
    # provided
    if Proposed_Modified_Features_Provided and not includes_anthro_mod:
        includes_anthro_mod = True

    # Check input features for existence of features and feature type;
    # create template if Proposed_Surface_Disturbance is not provided
    if Provided_Disturbance:
        # Check provided input
        ccslib.CheckPolygonInput(Provided_Disturbance)

        # Check provided input for 'Feature' field, error and exit if so
        existing_fields = [
            field.name.lower()
            for field in arcpy.ListFields(Provided_Disturbance)
        ]
        if 'feature' in existing_fields:
            arcpy.AddError("ERROR:: The provided proposed surface "
                           "disturbance layer includes a field named "
                           "'Feature' in the attribute table. Please "
                           "rename this field and re-run this tool. ")
            sys.exit(0)

        # Create a local copy of the provided disturbance in case it is
        # the output of the projected input from re-running Debit Tool 1
        PSD_copy = arcpy.CopyFeatures_management(Provided_Disturbance,
                                                 "in_memory/PSD_provided")

        # Update message
        arcpy.AddMessage("Projecting provided feature(s) to " +
                         coordinate_system.name)

        # Project input to standard coordinate system
        inputFeature = PSD_copy
        out_name = PROPOSED_SURFACE_DISTURBANCE_DEBITS
        Proposed_Surface_Disturbance = ccslib.ProjectInput(
            inputFeature, out_name, coordinate_system)
        zoom_to = True

    else:
        # Update message
        arcpy.AddMessage("Creating template for digitizing proposed "
                         "surface disturbance \nDigitize features in "
                         "feature class named "
                         "Proposed_Surface_Disturbance_Debits created within "
                         "the project's unique geodatabase")

        # Create a template
        out_name = PROPOSED_SURFACE_DISTURBANCE_DEBITS
        Proposed_Surface_Disturbance = ccslib.CreateTemplate(
            workspace, out_name, coordinate_system)
        zoom_to = False

    if includes_anthro_mod:
        # Create a template for digitizing anthropogenic features proposed for
        # modification
        out_name = "Proposed_Modified_Features_tmp"
        Template_Features = ccslib.CreateTemplate(workspace, out_name,
                                                  coordinate_system)

        if Proposed_Modified_Features_Provided:
            # Do not zoom to proposed surface disturbance
            zoom_to = False

            # Merge with the provided layer, if provided
            fileList = [Proposed_Modified_Features_Provided, Template_Features]
            out_name = "in_memory/tmp_Modified"
            merged_features = ccslib.MergeFeatures(fileList, out_name)

            # Rename the provided as merged (cannot merge two files with
            # equivalent filenames) as Proposed_Modified_Features
            in_data = merged_features
            out_data = PROPOSED_MODIFIED_FEATURES
            Proposed_Modified_Features = arcpy.CopyFeatures_management(
                in_data, out_data)

        else:
            # Save the template as Proposed_Modified_Features
            in_data = Template_Features
            out_data = PROPOSED_MODIFIED_FEATURES
            Proposed_Modified_Features = ccslib.RenameFeatureClass(
                in_data, out_data)

        # Update message
        arcpy.AddMessage("Adding fields Type and Subtype to "
                         "the Proposed_Modified_Features layer")

        # Add fields Type and Subtype
        inputFeature = Proposed_Modified_Features
        fieldsToAdd = ["Type", "Subtype"]
        fieldTypes = ["TEXT", "TEXT"]
        ccslib.AddFields(inputFeature,
                         fieldsToAdd,
                         fieldTypes,
                         copy_existing=True)

        # Clean up
        arcpy.Delete_management(Template_Features)

        # Create Domain for Subtype attributes and assign to Subtype field
        featureList = [Proposed_Modified_Features]
        ccslib.AddSubtypeDomains(featureList, workspace, AnthroAttributeTable)

        # Add layer to map for editing
        layerFile = ccsStandard.getLayerFile("SurfaceDisturbance.lyr")
        ccslib.AddToMap(Proposed_Modified_Features, layerFile)

    # Add layer to map document
    layerFile = ccsStandard.getLayerFile("SurfaceDisturbance.lyr")
    ccslib.AddToMap(Proposed_Surface_Disturbance, layerFile, zoom_to)

    # Update message
    arcpy.AddMessage("Adding fields to Proposed_Surface_Disturbance")

    # Add fields for Type, Subtype, Surface Disturbance, and Reclassifed Subtype
    input_feature = Proposed_Surface_Disturbance
    fields = ["Type", "Subtype", "Surface_Disturbance", "Reclassified_Subtype"]
    fieldTypes = ["TEXT", "TEXT", "TEXT", "TEXT"]
    ccslib.AddFields(input_feature, fields, fieldTypes, copy_existing=True)

    # Add Domains to Proposed_Surface_Disturbance_Debits layer
    featureList = [Proposed_Surface_Disturbance]
    domain_name = "Type"
    code_list = [
        row[0] for row in arcpy.da.SearchCursor(AnthroAttributeTable, "Type")
    ]

    # Create Domain for Subtype attributes and assign to Subtype field
    ccslib.AddSubtypeDomains(featureList, workspace, AnthroAttributeTable)

    # Create Domain for Type attributes and assign to Type field
    ccslib.AddCodedTextDomain(featureList, workspace, domain_name, code_list)

    # Create Domain for Type attributes and assign to Surface Disturbance field
    domain_name = "Surface_Disturbance"
    code_list = [
        "Term_Reclaimed", "Term_Retired", "Term_Reclassified", "Permanent"
    ]
    ccslib.AddCodedTextDomain(featureList, workspace, domain_name, code_list)

    # Create Domain for Type attributes and assign to Reclassified Subtype
    # field
    domain_name = "Reclassified_Subtype"
    code_list = [
        row[0]
        for row in arcpy.da.SearchCursor(AnthroAttributeTable, "Subtype")
    ]
    ccslib.AddCodedTextDomain(featureList, workspace, domain_name, code_list)

    if includes_anthro_mod:
        # Extend type domain to Proposed_Modified_Features
        try:
            arcpy.AssignDomainToField_management(Proposed_Modified_Features,
                                                 "Type", "Type")
        except arcpy.ExecuteError:
            arcpy.AddMessage("Type domain not updated for "
                             "Proposed_Modified_Features")

    # Save map document and exit
    if arcpy.ListInstallations()[0] == 'arcgispro':
        p = arcpy.mp.ArcGISProject("CURRENT")
        p.save()
    else:
        mxd = arcpy.mapping.MapDocument("CURRENT")
        mxd.save()
示例#4
0
def main():
    # GET PARAMETER VALUES
    workspace = arcpy.GetParameterAsText(0)
    Credit_Project_Boundary = arcpy.GetParameterAsText(1)
    includes_anthro_mod = arcpy.GetParameterAsText(2)  # optional
    Proposed_Modified_Features_Provided = arcpy.GetParameterAsText(3)  # optional

    # Update boolean parameters
    includes_anthro_mod = ccslib.Str2Bool(includes_anthro_mod)

    # DEFINE DIRECTORIES
    # Get the pathname to this script
    scriptPath = sys.path[0]
    arcpy.AddMessage("Script folder: " + scriptPath)
    arcpy.AddMessage("Python version: " + sys.version)
    # Instantiate a ccsStandard object
    ccsStandard = ccslib.ccsStandard(workspace, scriptPath)

    # ENVIRONMENT SETTINGS
    # Set workspaces
    arcpy.env.workspace = workspace
    arcpy.env.scratchWorkspace = workspace
    # Overwrite outputs
    arcpy.env.overwriteOutput = True

    # DEFINE GLOBAL VARIABLES
    AnthroAttributeTable = ccsStandard.AnthroAttributeTable
    coordinate_system = ccsStandard.CoorSystem
    habitat_bounds = ccsStandard.HabitatBounds
    # Filenames for feature classes and rasters created by this script
    CREDIT_PROJECT_AREA = "Credit_Project_Area"
    PROPOSED_MODIFIED_FEATURES = "Proposed_Modified_Features"
    MAP_UNITS = "Map_Units"
    
    # ------------------------------------------------------------------------

    # FUNCTION CALLS
    # Update includes_anthro_mod if Proposed_Modified_Features is
    # provided
    if Proposed_Modified_Features_Provided and not includes_anthro_mod:
        includes_anthro_mod = True

    # Exit with warning if no Credit Project Boundary is provided and project
    # is does not propose to remove or modify anthropogenic disturbance
    if not Credit_Project_Boundary and not includes_anthro_mod:
        arcpy.AddError("ERROR:: A credit project boundary must be provided "
                       "unless the project proposes to remove or modify "
                       "anthropogenic features. Ensure 'Credit Project will "
                       "remove or modify existing anthropogenic features' is "
                       "checked if true. Please see the User's Guide for "
                       "additional instruction.")
        sys.exit(0)

    # Check input features
    if Credit_Project_Boundary:
        # Check provided input for polygon shape type
        ccslib.CheckPolygonInput(Credit_Project_Boundary)

    if Proposed_Modified_Features_Provided:
        # Check provided feature for polygon shape type
        ccslib.CheckPolygonInput(Proposed_Modified_Features_Provided)

    # Set up zoom to for map units variable
    zoom_to_mu = False

    # Check input features for existence of features and feature type;
    # create template if Credit_Project_Boundary is not provided
    if Credit_Project_Boundary:
        # Create a local copy of the credit project boundary in case it is
        # the output of the projected input from re-running Credit Tool 1
        CPB_copy = arcpy.CopyFeatures_management(Credit_Project_Boundary,
                                                 "in_memory/CPB_provided")

        # Update message
        arcpy.AddMessage("Projecting provided feature(s) to "
                         + coordinate_system.name)
        
        # Project input to standard projection
        in_dataset = CPB_copy
        out_dataset = "Credit_Project_Boundary_Projected"
        projectedFeature = ccslib.ProjectInput(in_dataset, out_dataset,
                                               coordinate_system)

        # Update message
        arcpy.AddMessage("Determining project area - eliminating areas of non-"
                         "habitat from the Project Area")

        # Eliminate areas of non-habitat from project boundary
        Project_Area = projectedFeature
        outName = "in_memory/Credit_Project_Boundary_Clipped"
        clippedFeature = ccslib.EliminateNonHabitat(Project_Area, outName,
                                                    habitat_bounds)

        # Create Credit Project Area
        in_features = clippedFeature
        out_feature_class = CREDIT_PROJECT_AREA
        arcpy.Dissolve_management(in_features, out_feature_class)

        # Update message
        arcpy.AddMessage("Creating Map Units layer")

        # Create Map_Units layer
        in_data = clippedFeature
        out_data = MAP_UNITS
        Map_Units = ccslib.CreateMapUnits(in_data, out_data)

        zoom_to_mu = True

    if includes_anthro_mod:
        # Create a template for digitizing anthropogenic features proposed for
        # modification
        out_name = "Proposed_Modified_Features_tmp"
        Template_Features = ccslib.CreateTemplate(
            workspace, out_name, coordinate_system
            )

        # Update message
        arcpy.AddMessage("Adding fields Type and Subtype to "
                         "the Proposed_Modified_Features layer")

        # Add fields Type and Subtype
        inputFeature = Template_Features
        fieldsToAdd = ["Type", "Subtype"]
        fieldTypes = ["TEXT", "TEXT"]
        ccslib.AddFields(inputFeature, fieldsToAdd, fieldTypes,
                         copy_existing=True)

        # Set up zoom to for proposed surface disturbance variable
        zoom_to_psd = False

        if Proposed_Modified_Features_Provided:
            # Merge the template created with the provided layer, if provided
            fileList = [Proposed_Modified_Features_Provided,
                        Template_Features]
            out_name = "in_memory/tmp_Modified"
            merged_features = ccslib.MergeFeatures(fileList, out_name)

            # Rename the provided as merged (cannot merge two files with
            # equivalent filenames) as Proposed_Modified_Features
            in_data = merged_features
            out_data = PROPOSED_MODIFIED_FEATURES
            Proposed_Modified_Features = arcpy.CopyFeatures_management(
                in_data, out_data
                )

            zoom_to_psd = True

        else:
            # Save the template as Proposed_Modified_Features
            in_data = Template_Features
            out_data = PROPOSED_MODIFIED_FEATURES
            Proposed_Modified_Features = ccslib.RenameFeatureClass(
                in_data, out_data
                )

        # Clean up
        arcpy.Delete_management("Proposed_Modified_Features_tmp")

        # Add Domains to Proposed_Modified_Features layer
        featureList = [Proposed_Modified_Features]
        # Create Domain for Subtype attributes and assign to Subtype field
        ccslib.AddSubtypeDomains(featureList, workspace, AnthroAttributeTable)
        
        # Create Domain for Type attributes and assign to Type field
        typeList = [row[0] for row in arcpy.da.SearchCursor(
                    AnthroAttributeTable, "Type")]
        ccslib.AddCodedTextDomain(featureList, workspace, "Type", typeList)

        # Add layer to map for editing
        layerFile = ccsStandard.getLayerFile("SurfaceDisturbance.lyr")
        ccslib.AddToMap(Proposed_Modified_Features, layerFile, zoom_to_psd)

        if not Credit_Project_Boundary:
            # Create dummy Map Units layer if no Credit Project Boundary provided
            out_name = MAP_UNITS
            Map_Units = ccslib.CreateTemplate(workspace, out_name,
                                              coordinate_system)

            if Proposed_Modified_Features_Provided:
                # Zoom to the Modified Anthro Feature layer
                if arcpy.ListInstallations()[0] == 'arcgispro':
                    p = arcpy.mp.ArcGISProject("CURRENT")
                    m = p.activeMap
                    layer=m.Layer(PROPOSED_MODIFIED_FEATURES)
                    pass
                    # df.extent = layer.getSelectedExtent()
                else:
                    mxd = arcpy.mapping.MapDocument("CURRENT")
                    df = mxd.activeDataFrame
                    layer = arcpy.mapping.Layer(PROPOSED_MODIFIED_FEATURES)
                    df.extent = layer.getSelectedExtent()

    # Update message
    arcpy.AddMessage("Creating pre-defined map units of Wet Meadows")

    # Intersect the Map_Units layer with the NV Wet Meadows layer
    in_feature = ccsStandard.Wet_Meadows
    field_name = "Meadow"
    na_value = "No Meadow"
    ccslib.CreatePreDefinedMapUnits(Map_Units, in_feature, field_name, 
                                    na_value)
    
    # Add fields Map_Unit_ID, Map_Unit_Name, and Meadow to Map_Units
    fields = ["Map_Unit_ID", "Map_Unit_Name", "Notes"]
    fieldTypes = ["SHORT", "TEXT", "TEXT"]
    ccslib.AddFields(Map_Units, fields, fieldTypes, copy_existing=True)

    # Add Domains to Map_Units layer
    # Create Domain for Map_Unit_ID attributes
    domainName = "Map_Unit_ID"
    range_low = 0
    range_high = 10000
    ccslib.AddRangeDomain(Map_Units, workspace,
                          domainName, range_low, range_high)

    # Create Domain for Meadow attributes
    featureList = [Map_Units]
    domainName = "Meadow"
    codeList = ["No Meadow", "Altered", "Unaltered"]
    ccslib.AddCodedTextDomain(featureList, workspace, domainName, codeList,
                              assign_default=True)

    if Credit_Project_Boundary:
        # Create pre-defined map units for PJ
        # Update message
        arcpy.AddMessage("Creating pre-defined map units of PJ")

        # Intersect the Map_Units layer with the Phase III PJ layer
        in_feature = ccsStandard.PJ_Phases
        field_name = "Conifer_Phase"
        ccslib.CreatePreDefinedMapUnits(Map_Units, in_feature, field_name)

        # Remove unwanted fields from Map Units feature class
        allowable_fields = fields + ["Conifer_Phase"]
        ccslib.SimplifyFields(Map_Units, allowable_fields)

        # Add Map_Units to map
        layerFile = ccsStandard.getLayerFile("Map_Units.lyr")
        ccslib.AddToMap(Map_Units, layerFile, zoom_to_mu)

    # Clean up
    arcpy.Delete_management("in_memory")

    # Save map document
    if arcpy.ListInstallations()[0] == 'arcgispro':
        p = arcpy.mp.ArcGISProject("CURRENT")
        p.save()
    else:
        mxd = arcpy.mapping.MapDocument("CURRENT")
        mxd.save()
示例#5
0
def main():
    # GET PARAMETER VALUES
    Proposed_Surface_Disturbance_Provided = arcpy.GetParameterAsText(0)
    Proposed_Modified_Features_Provided = arcpy.GetParameterAsText(
        1)  # optional
    Project_Folder = arcpy.GetParameterAsText(2)

    # DEFINE DIRECTORIES
    # Get the pathname to this script
    scriptPath = sys.path[0]
    arcpy.AddMessage("Script folder: " + scriptPath)
    arcpy.AddMessage("Python version: " + sys.version)
    # Construct pathname to workspace
    workspace = arcpy.Describe(Proposed_Surface_Disturbance_Provided).path
    arcpy.AddMessage("Project geodatabase: " + workspace)

    # Instantiate a ccsStandard object
    ccsStandard = ccslib.ccsStandard(workspace, scriptPath)

    # ENVIRONMENT SETTINGS
    # Set workspaces
    arcpy.env.workspace = workspace
    scratch_folder = os.path.join(arcpy.Describe(workspace).path, 'scratch')
    if arcpy.Exists(scratch_folder):
        pass
    else:
        arcpy.CreateFolder_management(
            arcpy.Describe(workspace).path, 'scratch')
    arcpy.env.scratchWorkspace = scratch_folder
    # Overwrite outputs
    arcpy.env.overwriteOutput = True

    # DEFINE VARIABLES FOR INPUT DATA
    AnthroAttributeTable = ccsStandard.AnthroAttributeTable
    habitat_bounds = ccsStandard.HabitatBounds
    public_land = ccsStandard.Public

    # Filenames for feature classes or rasters used by this script
    PROPOSED_SURFACE_DISTURBANCE_DEBITS = "Proposed_Surface_Disturbance_Debits"
    # Filenames for feature classes or rasters created by this script
    ELIGIBLE_PROPOSED_FEATURES = "Proposed_Surface_Disturbance_Eligible"
    ANALYSIS_AREA = "Analysis_Area"
    DEBIT_PROJECT_AREA = "Debit_Project_Area"
    INDIRECT_IMPACT_AREA = "Indirect_Impact_Area"
    INDIRECT_BENEFIT_AREA = "Indirect_Benefit_Area"
    PROPOSED_MODIFIED_FEATURES = "Proposed_Modified_Features"

    # ------------------------------------------------------------------------

    # FUNCTION CALLS
    # Check tool version
    ccslib.CheckToolVersion()

    # Check for proposed modified features
    if not Proposed_Modified_Features_Provided:
        # Ensure Proposed_Modified_Features does not exist
        if arcpy.Exists("Proposed_Modified_Features"):
            arcpy.AddError("ERROR:: A 'Proposed_Modified_Features' layer "
                           "was detected in the project's geodatabase. "
                           "Provide the 'Proposed_Modified_Features' layer "
                           "and re-run Debit Tool 2.")
            sys.exit(0)

    # Clear selection, if present
    ccslib.ClearSelectedFeatures(Proposed_Surface_Disturbance_Provided)

    # Check Proposed_Surface_Disturbance
    feature = Proposed_Surface_Disturbance_Provided
    required_fields = ["Type", "Subtype", "Surface_Disturbance"]
    no_null_fields = required_fields
    expected_fcs = None
    ccslib.CheckPolygonInput(feature, required_fields, expected_fcs,
                             no_null_fields)

    # Update Proposed_Surface_Disturbance layer with provided layer
    provided_input = Proposed_Surface_Disturbance_Provided
    parameter_name = PROPOSED_SURFACE_DISTURBANCE_DEBITS
    Proposed_Surface_Disturbance_Debits = ccslib.AdoptParameter(
        provided_input, parameter_name, preserve_existing=False)

    # Replace Proposed_Surface_Disturbance_Debits layer on map
    layerFile = ccsStandard.getLayerFile("SurfaceDisturbance.lyr")
    ccslib.AddToMap(Proposed_Surface_Disturbance_Debits, layerFile)

    # Clip the Proposed Surface Disturbance to Public Lands
    input_features = PROPOSED_SURFACE_DISTURBANCE_DEBITS
    clip_features = public_land
    out_name = ELIGIBLE_PROPOSED_FEATURES
    Proposed_Surface_Disturbance = arcpy.Clip_analysis(input_features,
                                                       clip_features, out_name)

    # Exit if no features on public land exist
    test = arcpy.GetCount_management(Proposed_Surface_Disturbance)
    count = int(test.getOutput(0))

    if count < 1:
        arcpy.AddWarning("""
            There are no proposed features located on public lands.\n
            Therefore, this project does not require mitigation.\n
            Please confirm with the SETT.            
            """)
        sys.exit(0)

    # Add Surface_Disturbance_Eligible layer on map
    layerFile = ccsStandard.getLayerFile("SurfaceDisturbance.lyr")
    ccslib.AddToMap(Proposed_Surface_Disturbance, layerFile)

    # Add field for Disturbance_Type and populate. Values will be used in
    # Map_Units_Dissolve to identify map units of direct disturbance
    feature = Proposed_Surface_Disturbance
    fields = ["Disturbance_Type"]
    fieldTypes = ["TEXT"]
    ccslib.AddFields(feature, fields, fieldTypes)

    with arcpy.da.UpdateCursor(feature,
                               ["Surface_Disturbance"] + fields) as cursor:
        for row in cursor:
            row[1] = "Direct_" + row[0]
            cursor.updateRow(row)

    # Update message
    arcpy.AddMessage("Creating the area of indirect impact")

    # Buffer proposed surface disturbance to create Indirect_Impact_Area
    in_data = Proposed_Surface_Disturbance
    out_name = INDIRECT_IMPACT_AREA
    Indirect_Impact_Area = ccslib.CreateIndirectImpactArea(
        in_data, AnthroAttributeTable, out_name)

    if Proposed_Modified_Features_Provided:
        # Clear selection, if present
        ccslib.ClearSelectedFeatures(Proposed_Modified_Features_Provided)

        # Check provided layer
        required_fields = ["Type", "Subtype"]
        no_null_fields = required_fields
        expected_fcs = None
        ccslib.CheckPolygonInput(Proposed_Modified_Features_Provided,
                                 required_fields, expected_fcs, no_null_fields)

        # Update Proposed_Modified_Features with provided layer and add to map
        provided_input = Proposed_Modified_Features_Provided
        parameterName = PROPOSED_MODIFIED_FEATURES
        preserve_existing = False
        Proposed_Modified_Features = ccslib.AdoptParameter(
            provided_input, parameterName, preserve_existing)

        # Add Proposed Modified Features layer to map
        layerFile = ccsStandard.getLayerFile("SurfaceDisturbance.lyr")
        ccslib.AddToMap(Proposed_Modified_Features, layerFile)

        # Update message
        arcpy.AddMessage("Creating the area of indirect benefit")

        # Create the Indirect_Impact_Area
        in_data = Proposed_Modified_Features
        out_name = INDIRECT_BENEFIT_AREA
        Indirect_Benefit_Area = ccslib.CreateIndirectImpactArea(
            in_data, AnthroAttributeTable, out_name)

        # Union the indirect benefit area and the indirect impact area
        in_features = [Indirect_Impact_Area, Indirect_Benefit_Area]
        out_name = "in_memory/Impact_Union"
        Impact_Union = arcpy.Union_analysis(in_features, out_name)

        # Dissolve the unioned indirect impact and benefit areas as
        # Indirect Impact Area
        in_features = Impact_Union
        out_feature_class = INDIRECT_IMPACT_AREA
        Indirect_Impact_Area = arcpy.Dissolve_management(
            in_features, out_feature_class)

    # Update message
    arcpy.AddMessage("Determining project area - eliminating areas of non-"
                     "habitat from the Project Area")

    # Eliminate non-habitat
    project_area = Indirect_Impact_Area
    out_name = DEBIT_PROJECT_AREA
    Debit_Project_Area = ccslib.EliminateNonHabitat(project_area, out_name,
                                                    habitat_bounds)

    # Update message
    arcpy.AddMessage("Copying Debit_Project_Area as shapefile into project "
                     "folder")

    # Export feature class to shapefile in project folder so it can be sent to
    # NDOW for Dist_Lek layer
    arcpy.FeatureClassToShapefile_conversion(Debit_Project_Area,
                                             Project_Folder)

    # Update message
    arcpy.AddMessage("Creating Analysis Area")

    # Create Analysis_Area
    out_name = ANALYSIS_AREA
    Analysis_Area = ccslib.CreateAnalysisArea(Debit_Project_Area,
                                              AnthroAttributeTable, out_name)

    # Add Analysis_Area to map
    layerFile = ccsStandard.getLayerFile("Analysis_Area.lyr")
    ccslib.AddToMap(Analysis_Area, layerFile, zoom_to=True)

    # Save map document and exit
    if arcpy.ListInstallations()[0] == 'arcgispro':
        p = arcpy.mp.ArcGISProject("CURRENT")
        p.save()
    else:
        mxd = arcpy.mapping.MapDocument("CURRENT")
        mxd.save()
示例#6
0
def main():
    # GET PARAMETER VALUES
    Analysis_Area = arcpy.GetParameterAsText(0)
    Dist_Lek = arcpy.GetParameterAsText(1)
    Current_Anthro_Features_Provided = arcpy.GetParameterAsText(2)  # optional
    Project_Folder = arcpy.GetParameterAsText(3)
    Project_Name = arcpy.GetParameterAsText(4)  # optional

    # DEFINE DIRECTORIES & PATH NAMES FOR FOLDERS & GBDs
    # Get the pathname to this script
    scriptPath = sys.path[0]
    arcpy.AddMessage("Script folder: " + scriptPath)
    # Construct pathname to workspace
    workspace = arcpy.Describe(Analysis_Area).path
    arcpy.AddMessage("Project geodatabase: " + workspace)
    # Instantiate a ccsStandard object
    ccsStandard = ccslib.ccsStandard(workspace, scriptPath)

    # ENVIRONMENT SETTINGS
    # Set workspaces
    arcpy.env.workspace = workspace
    scratch_folder = os.path.join(arcpy.Describe(workspace).path, 'scratch')
    if arcpy.Exists(scratch_folder):
        pass
    else:
        arcpy.CreateFolder_management(
            arcpy.Describe(workspace).path, 'scratch')
    arcpy.env.scratchWorkspace = scratch_folder
    # Overwrite outputs
    arcpy.env.overwriteOutput = True

    # DEFINE GLOBAL VARIABLES
    AnthroAttributeTable = ccsStandard.AnthroAttributeTable
    emptyRaster = ccsStandard.EmptyRaster
    inputDataPath = ccsStandard.InputDataPath
    # Filenames for feature classes or rasters used by this script
    MAP_UNITS = "Map_Units"
    ANALYSIS_AREA = "Analysis_Area"  # provided
    CURRENT_ANTHRO_FEATURES = "Current_Anthro_Features"
    CREDIT_PROJECT_AREA = "Credit_Project_Area"
    PROPOSED_MODIFIED_FEATURES = "Proposed_Modified_Features"
    # Filenames for feature classes or rasters created by this script
    CURRENT_ANTHRO_DISTURBANCE = "Current_Anthro_Disturbance"
    PROJECTED_ANTHRO_DISTURBANCE = "Projected_Anthro_Disturbance"
    MAP_UNITS_DISSOLVE = "Map_Units_Dissolve"
    CURRENT_MGMT_CAT = "Current_Mgmt_Cat"
    CURRENT_WMZ = "Current_WMZ"
    CURRENT_PMU = "Current_PMU"
    CURRENT_PRECIP = "Current_Precip"

    # ------------------------------------------------------------------------

    # FUNCTION CALLS
    # Check out Spatial Analyst extension
    ccslib.CheckOutSpatialAnalyst()

    # Check Analysis_Area
    feature = Analysis_Area
    expected_fcs = [MAP_UNITS, ANALYSIS_AREA, CREDIT_PROJECT_AREA]
    ccslib.CheckPolygonInput(feature, expected_fcs=expected_fcs)

    # Set up flag for projects that propose to modify anthro features
    includes_anthro_mod = False

    # Check for existence of 'Proposed_Modified_Features'
    if arcpy.Exists(PROPOSED_MODIFIED_FEATURES):
        # Update flag
        includes_anthro_mod = True

    # Copy Dist_Lek to geodatabase

    # Create Current_Anthro_Features layer, or copy provided into geodatabase
    if Current_Anthro_Features_Provided:
        # Clear selection, if present
        ccslib.ClearSelectedFeatures(Current_Anthro_Features_Provided)

        # Check Current_Anthro_Features
        feature = Current_Anthro_Features_Provided
        required_fields = ["Type", "Subtype"]
        no_null_fields = None
        expected_fcs = None
        ccslib.CheckPolygonInput(feature, required_fields, expected_fcs,
                                 no_null_fields)

        # Update message
        arcpy.AddMessage("Copying Current_Anthro_Features to project "
                         "geodatabase")

        # Copy Current_Anthro_Features to geodatabase
        provided_input = Current_Anthro_Features_Provided
        parameter_name = CURRENT_ANTHRO_FEATURES
        preserve_existing = True
        Current_Anthro_Features = ccslib.AdoptParameter(
            provided_input, parameter_name, preserve_existing)

    else:
        # Update message
        arcpy.AddMessage("Merging all clipped anthropogenic features to "
                         "create the Current_Anthro_Features layer")

        # Merge features (selecting only polygon features)
        fileList = arcpy.ListFeatureClasses("Anthro*Clip",
                                            feature_type="Polygon")
        out_name = CURRENT_ANTHRO_FEATURES
        Current_Anthro_Features = ccslib.MergeFeatures(fileList, out_name)

    # Simplify fields
    allowable_fields = ["Type", "Subtype", "SubtypeID", "Subtype_As_Modified"]
    ccslib.SimplifyFields(Current_Anthro_Features, allowable_fields)

    # Remove subtypes from Current_Anthro_Features
    feature = Current_Anthro_Features
    try:
        subtypes = arcpy.da.ListSubtypes(feature)
        for subtype in subtypes:
            arcpy.RemoveSubtype_management(feature, subtype)
            arcpy.AddMessage("Subtype removed")
    except arcpy.ExecuteError:
        arcpy.AddMessage("Could not remove subtypes from "
                         "Current_Anthro_Features")

    # Add Domains for Type and Subtype
    arcpy.RemoveDomainFromField_management(feature, "Type")
    try:
        domainName = "Type"
        arcpy.CreateDomain_management(workspace, domainName,
                                      "Valid " + domainName + "s", "TEXT",
                                      "CODED")
        typeList = [
            row[0]
            for row in arcpy.da.SearchCursor(AnthroAttributeTable, "Type")
        ]
        for code in typeList:
            arcpy.AddCodedValueToDomain_management(workspace, domainName, code,
                                                   code)
    except arcpy.ExecuteError:
        arcpy.AddMessage("Could not add domains for "
                         "Current_Anthro_Features")

    arcpy.AssignDomainToField_management(feature, "Type", "Type")

    arcpy.RemoveDomainFromField_management(feature, "Subtype")
    arcpy.TableToDomain_management(AnthroAttributeTable, "Subtype", "Subtype",
                                   workspace, "Subtype",
                                   "Valid anthropogenic subtypes", "REPLACE")
    arcpy.AssignDomainToField_management(feature, "Subtype", "Subtype")

    # Update Message
    arcpy.AddMessage("Calculating Current Anthropogenic Disturbance")

    # Calculate Current_Anthro_Disturbance
    extent_fc = Analysis_Area
    anthro_features = Current_Anthro_Features
    term = ccsStandard.CreditTerms[0]
    Current_Anthro_Disturbance = ccslib.CalcAnthroDist(extent_fc,
                                                       anthro_features,
                                                       emptyRaster,
                                                       AnthroAttributeTable,
                                                       term)
    Current_Anthro_Disturbance.save(CURRENT_ANTHRO_DISTURBANCE)

    # Update message
    arcpy.AddMessage("Current_Anthro_Disturbance Calculated")

    # If the project proposes to modify existing anthropogenic features,
    # calculate post-project anthropogenic disturbance (uplift)
    if includes_anthro_mod:
        # Calculate uplift
        extent_fc = Analysis_Area
        anthro_features = Current_Anthro_Features
        term = ccsStandard.CreditTerms[1]
        field = "Subtype_As_Modified"
        Projected_Anthro_Disturbance = ccslib.CalcAnthroDist(
            extent_fc, anthro_features, emptyRaster, AnthroAttributeTable,
            term, field)
        Projected_Anthro_Disturbance.save(PROJECTED_ANTHRO_DISTURBANCE)

        # Update message
        arcpy.AddMessage("Projected_Anthro_Disturbance Calculated")
        arcpy.AddMessage("Creating pre-defined map units of PJ")

        Map_Units = MAP_UNITS

        if len(arcpy.ListFields(Map_Units, "Conifer_Phase")) == 0:
            # Create pre-defined map units for PJ
            # Intersect the Map_Units layer with the PJ layer
            in_feature = ccsStandard.PJ_Phases
            field_name = "Conifer_Phase"
            ccslib.CreatePreDefinedMapUnits(Map_Units, in_feature, field_name)

            # Remove unwanted fields from Map Units feature class
            allowable_fields = [
                "Conifer_Phase", "Map_Unit_ID", "Map_Unit_Name", "Meadow",
                "Notes", "Indirect"
            ]
            ccslib.SimplifyFields(Map_Units, allowable_fields)

        # Update message
        arcpy.AddMessage("Merging indirect benefits area and map units layer")

        # Combine the Map Units layer and Indirect Impact Layer
        indirect_benefit_area = CREDIT_PROJECT_AREA
        mgmt_map_units = Map_Units
        Map_Units = ccslib.AddIndirectBenefitArea(indirect_benefit_area,
                                                  mgmt_map_units)

        # Add Map Units layer to map document
        layerFile = ccsStandard.getLayerFile("Map_Units.lyr")
        ccslib.AddToMap(Map_Units, layerFile)

    else:
        # Add Indirect field to Map Units layer and populate with False
        # Add field "Indirect"
        feature = MAP_UNITS
        fieldsToAdd = ["Indirect"]
        fieldTypes = ["TEXT"]
        ccslib.AddFields(feature, fieldsToAdd, fieldTypes)

        # Update field to equal "False"
        with arcpy.da.UpdateCursor(feature, fieldsToAdd) as cursor:
            for row in cursor:
                row[0] = "False"
                cursor.updateRow(row)

    # Calculate local scale modifiers for Current condition
    extent_fc = Analysis_Area
    anthro_disturbance = CURRENT_ANTHRO_DISTURBANCE
    term = ccsStandard.CreditTerms[0]
    ccslib.CalcModifiers(extent_fc, inputDataPath, Dist_Lek,
                         anthro_disturbance, term)

    # Calculate local scale modifiers for Projected condition
    # Determine which anthropogenic disturbance raster to use
    extent_fc = Analysis_Area
    if arcpy.Exists(PROJECTED_ANTHRO_DISTURBANCE):
        anthro_disturbance = PROJECTED_ANTHRO_DISTURBANCE
    else:
        anthro_disturbance = CURRENT_ANTHRO_DISTURBANCE
    term = ccsStandard.CreditTerms[1]
    ccslib.CalcModifiers(extent_fc,
                         inputDataPath,
                         Dist_Lek,
                         anthro_disturbance,
                         term,
                         PJ_removal=True)

    # Update message
    arcpy.AddMessage("Dissolving all multi-part map units to create "
                     "Map_Units_Dissolve")

    # Dissolve Map Units
    allowable_fields = [
        "Map_Unit_ID", "Map_Unit_Name", "Meadow", "Conifer_Phase", "BROTEC",
        "Indirect"
    ]
    out_name = MAP_UNITS_DISSOLVE
    anthro_features = Current_Anthro_Features
    Map_Units_Dissolve = ccslib.DissolveMapUnits(MAP_UNITS, allowable_fields,
                                                 out_name, anthro_features)

    # Update message
    arcpy.AddMessage("Adding Map_Units_Dissolve to map")

    # Add layer to map document
    feature = Map_Units_Dissolve
    layerFile = ccsStandard.getLayerFile("Map_Units.lyr")
    ccslib.AddToMap(feature, layerFile, zoom_to=True)

    # Update message
    arcpy.AddMessage("Calculating area in acres for each map unit")

    # Calculate Area
    ccslib.CalcAcres(Map_Units_Dissolve)

    # Initialize a list to track proportion feature classes
    prop_fcs = []

    # Update message
    arcpy.AddMessage("Calculating Proportion within each precipitation zone")

    # Calculate Proportion of each map unit in each Precip Zone
    in_feature = os.path.join(inputDataPath, "Precip")
    out_feature_class = CURRENT_PRECIP
    field_name = "Precip_Proportion"
    ccslib.CalcProportion(Map_Units_Dissolve, in_feature, out_feature_class,
                          field_name)
    prop_fcs.append(out_feature_class)

    # Update message
    arcpy.AddMessage("Calculating Management Importance Factor")

    # Calculate Proportion of each map unit in each Management Category
    in_feature = os.path.join(inputDataPath, "Mgmt_Cat")
    out_feature_class = CURRENT_MGMT_CAT
    field_name = "Mgmt_Proportion"
    ccslib.CalcProportion(Map_Units_Dissolve, in_feature, out_feature_class,
                          field_name)
    prop_fcs.append(out_feature_class)

    # Update message
    arcpy.AddMessage("Evaluating WAFWA Management Zone")

    # Calculate Proportion in each map unit in each WAFWA Zone
    in_feature = os.path.join(inputDataPath, "NV_WAFWA")
    out_feature_class = CURRENT_WMZ
    field_name = "WMZ_Proportion"
    ccslib.CalcProportion(Map_Units_Dissolve, in_feature, out_feature_class,
                          field_name)
    prop_fcs.append(out_feature_class)

    # Update message
    arcpy.AddMessage("Evaluating Priority Management Unit")

    # Calculate Proportion in each map unit in each PMU
    in_feature = os.path.join(inputDataPath, "NV_PMU")
    out_feature_class = CURRENT_PMU
    field_name = "PMU_Proportion"
    ccslib.CalcProportion(Map_Units_Dissolve, in_feature, out_feature_class,
                          field_name)
    prop_fcs.append(out_feature_class)

    # Delete unnecessary fields in proportion feature classes
    allowable_fields = [
        "Map_Unit_ID", "Management", "Mgmt_zone", "PMU_NAME", "Precip",
        "Mgmt_Proportion", "WMZ_Proportion", "PMU_Proportion",
        "Precip_Proportion"
    ]
    for feature in prop_fcs:
        ccslib.SimplifyFields(feature, allowable_fields)

    # Set processing extent to Map_Units layer
    arcpy.env.extent = arcpy.Describe(Map_Units_Dissolve).extent

    # Calculate the average HSI values per map unit for each map unit
    HSIseasons = ccsStandard.HSISeasons
    for season in HSIseasons:
        # Update message
        arcpy.AddMessage("Summarizing " + season + " HSI")

        # Calculate zonal statistics for each map unit
        inZoneData = Map_Units_Dissolve
        inValueRaster = os.path.join(inputDataPath, season + "_HSI")
        zoneField = "Map_Unit_ID"
        outTable = "ZonalStats_" + season + "_HSI"
        ccslib.CalcZonalStats(inZoneData, zoneField, inValueRaster, outTable)

        # Join the zonal statistic to the Map Units Dissolve table
        fieldName = season + "_HSI"
        ccslib.JoinMeanToTable(inZoneData, outTable, zoneField, fieldName)

    # Update message
    arcpy.AddMessage("Calculating PJ cover per map unit")

    # Calculate the average pinon-juniper cover per map unit
    inZoneData = Map_Units_Dissolve
    inValueRaster = os.path.join(inputDataPath, "PJ_Cover")
    zoneField = "Map_Unit_ID"
    outTable = "ZonalStats_PJCover"
    ccslib.CalcZonalStats(inZoneData, zoneField, inValueRaster, outTable)

    # Join the zonal statistic to the Map Units Dissolve table
    fieldName = "PJ_Cover"
    ccslib.JoinMeanToTable(inZoneData, outTable, zoneField, fieldName)

    # Calculate the average seasonal modifier values per map unit and
    # join to Map_Unit_Dissolve table
    terms = ccsStandard.CreditTerms
    seasons = ccsStandard.Seasons
    for term in terms:
        for season in seasons:
            # Update message
            arcpy.AddMessage("Summarizing " + term + "_Local_" + season)

            # Calculate zonal statistics for each map unit
            inZoneData = Map_Units_Dissolve
            inValueRaster = term + "_Local_" + season
            zoneField = "Map_Unit_ID"
            outTable = "ZonalStats_" + term + season
            ccslib.CalcZonalStats(inZoneData, zoneField, inValueRaster,
                                  outTable)

            # Join the zonal statistic to the Map Units Dissolve table
            fieldName = term + "_" + season
            ccslib.JoinMeanToTable(inZoneData, outTable, zoneField, fieldName)

    # Calculate impact intensity for credit project
    try:
        ccslib.calcCreditBenefit(inputDataPath, includes_anthro_mod)

        # Add credit project quality to map
        layerFile = ccsStandard.getLayerFile("Credit_Project_Benefit.lyr")
        ccslib.AddToMap("Credit_Quality", layerFile, zoom_to=True)
    except:
        pass

    # Remove uplift modifier for map units that do not qualify
    # Select map units of Indirect if project involves anthro
    # feature modification
    if includes_anthro_mod:
        feature = MAP_UNITS_DISSOLVE
        arcpy.MakeFeatureLayer_management(feature, "lyr")
        where_clause = """({} = '{}') AND ({} <> {} OR {} <> {} OR {} <> {})""".format(
            arcpy.AddFieldDelimiters(feature, "Indirect"), "True",
            arcpy.AddFieldDelimiters(feature, "Projected_Breed"),
            arcpy.AddFieldDelimiters(feature, "Current_Breed"),
            arcpy.AddFieldDelimiters(feature, "Projected_LBR"),
            arcpy.AddFieldDelimiters(feature, "Current_LBR"),
            arcpy.AddFieldDelimiters(feature, "Projected_Winter"),
            arcpy.AddFieldDelimiters(feature, "Current_Winter"))
        arcpy.SelectLayerByAttribute_management(feature, "NEW_SELECTION",
                                                where_clause)
        test = arcpy.GetCount_management(feature)
        count = int(test.getOutput(0))
        if count > 0:
            # Update message
            arcpy.AddMessage("Confirming removal of PJ cover credits meet "
                             "eligibility criteria (if applicable)")

            # Substitute Projected_Anthro_Disturbance if it exists
            extent_fc = Analysis_Area
            if arcpy.Exists(PROJECTED_ANTHRO_DISTURBANCE):
                anthroDisturbance = PROJECTED_ANTHRO_DISTURBANCE
            else:
                anthroDisturbance = CURRENT_ANTHRO_DISTURBANCE

            # Repeat calculation of modifiers w/o PJ_uplift
            term = ccsStandard.CreditTerms[1]
            ccslib.CalcModifiers(extent_fc,
                                 inputDataPath,
                                 Dist_Lek,
                                 anthroDisturbance,
                                 term,
                                 PJ_removal=False,
                                 suffix="noPJ")

            # Repeat joins to table
            for season in seasons:
                # Calculate zonal statistics for each map unit
                inZoneData = Map_Units_Dissolve
                inValueRaster = term + "_Local_" + season + "_noPJ"
                zoneField = "Map_Unit_ID"
                outTable = "ZonalStats_" + term + season
                ccslib.CalcZonalStats(inZoneData, zoneField, inValueRaster,
                                      outTable)

                # Join the zonal statistic to the Map Units Dissolve table
                fieldName = term + "_" + season + "_noPJ"
                ccslib.JoinMeanToTable(inZoneData, outTable, zoneField,
                                       fieldName)

                # Overwrite Projected seasonal local scale scores
                overwrite_field = ccsStandard.CreditTerms[1] + "_" + season
                with arcpy.da.UpdateCursor(
                        feature, [fieldName, overwrite_field]) as cursor:
                    for row in cursor:
                        row[1] = row[0]
                        cursor.updateRow(row)

                # Clean up
                arcpy.DeleteField_management(feature, fieldName)

        # Clean up
        arcpy.SelectLayerByAttribute_management(feature, "CLEAR_SELECTION")
        arcpy.Delete_management("lyr")

    # Add transect field to Map_Units_Dissolve
    fields = ["Transects"]
    fieldTypes = ["SHORT"]
    ccslib.AddFields(Map_Units_Dissolve, fields, fieldTypes)

    # Export data to Excel
    input_Tables = [
        MAP_UNITS_DISSOLVE, CURRENT_MGMT_CAT, CURRENT_WMZ, CURRENT_PMU,
        CURRENT_PRECIP
    ]
    for table in input_Tables:
        ccslib.ExportToExcel(table, Project_Folder, Project_Name)

    # Clean up
    arcpy.Delete_management("in_memory")

    # Save map document
    if arcpy.ListInstallations()[0] == 'arcgispro':
        p = arcpy.mp.ArcGISProject("CURRENT")
        p.save()
    else:
        mxd = arcpy.mapping.MapDocument("CURRENT")
        mxd.save()
示例#7
0
def main():
    # GET PARAMETER VALUES
    Proposed_Surface_Disturbance_Eligible = arcpy.GetParameterAsText(0)

    # DEFINE DIRECTORIES
    # Get the pathname to this script
    scriptPath = sys.path[0]
    arcpy.AddMessage("Script folder: " + scriptPath)
    # Construct pathname to workspace
    workspace = arcpy.Describe(Proposed_Surface_Disturbance_Eligible).path
    arcpy.AddMessage("Project geodatabase: " + workspace)

    # Instantiate a ccsStandard object
    ccsStandard = ccslib.ccsStandard(workspace, scriptPath)

    # ENVIRONMENT SETTINGS
    # Set workspaces
    arcpy.env.workspace = workspace
    scratch_folder = os.path.join(arcpy.Describe(workspace).path, 'scratch')
    if arcpy.Exists(scratch_folder):
        pass
    else:
        arcpy.CreateFolder_management(
            arcpy.Describe(workspace).path, 'scratch')
    arcpy.env.scratchWorkspace = scratch_folder
    # Overwrite outputs
    arcpy.env.overwriteOutput = True

    # DEFINE VARIABLES FOR INPUT DATA

    # Filenames for feature classes or rasters used by this script
    ELIGIBLE_PROPOSED_FEATURES = "Proposed_Surface_Disturbance_Eligible"

    # Filenames for feature classes or rasters created by this script
    ANALYSIS_AREA = "Analysis_Area"

    # ------------------------------------------------------------------------

    # FUNCTION CALLS
    # Check tool version
    ccslib.CheckToolVersion()

    # Clear selection, if present
    ccslib.ClearSelectedFeatures(Proposed_Surface_Disturbance_Eligible)

    # Check Proposed_Surface_Disturbance_Eligible
    feature = Proposed_Surface_Disturbance_Eligible
    required_fields = ["Type", "Subtype", "Surface_Disturbance"]
    no_null_fields = required_fields
    expected_fcs = None
    ccslib.CheckPolygonInput(feature, required_fields, expected_fcs,
                             no_null_fields)

    # Update Proposed_Surface_Disturbance_Elligible layer with provided layer
    provided_input = Proposed_Surface_Disturbance_Eligible
    parameter_name = ELIGIBLE_PROPOSED_FEATURES
    Proposed_Surface_Disturbance_Eligible = ccslib.AdoptParameter(
        provided_input, parameter_name, preserve_existing=False)

    # Replace Proposed_Surface_Disturbance_Elibible layer on map
    layerFile = ccsStandard.getLayerFile("SurfaceDisturbance.lyr")
    ccslib.AddToMap(Proposed_Surface_Disturbance_Eligible, layerFile)

    # Update message
    arcpy.AddMessage("Clipping all anthropogenic features to Analysis Area "
                     "and adding templates for digitizing new anthropogenic "
                     "features")

    # Clip all provided anthropogenic feature layers and add to map
    clip_features = ANALYSIS_AREA
    anthroFeaturePath = ccsStandard.AnthroFeaturePath
    proposed_anthro = Proposed_Surface_Disturbance_Eligible
    fieldsToAdd = ["Overlap_Status", "Returned", "Subtype_As_Modified"]
    fieldTypes = ["TEXT", "TEXT", "TEXT"]
    mod_field = fieldsToAdd[0]
    removed_code = "Removed"
    retained_code = "Retained"
    ccslib.ClipAnthroFeaturesDebit(clip_features, anthroFeaturePath,
                                   proposed_anthro, fieldsToAdd, fieldTypes,
                                   mod_field, removed_code, retained_code)

    # Apply domains for Overlap_Status field and populate default
    featureList = arcpy.ListFeatureClasses("Anthro_*_Clip")
    domain_name = fieldsToAdd[0]
    code_list = ["Retained", "Removed"]
    ccslib.AddCodedTextDomain(featureList,
                              workspace,
                              domain_name,
                              code_list,
                              assign_default=True,
                              populate_default=True)

    # Apply domains for Returned field
    domain_name = fieldsToAdd[1]
    code_list = ["True", "False"]
    ccslib.AddCodedTextDomain(featureList,
                              workspace,
                              domain_name,
                              code_list,
                              assign_default=True,
                              populate_default=True)

    # Add all Subtype anthro domains because ArcGIS doesn't transfer them
    # consistently
    desc_c = arcpy.Describe(workspace)
    current_domains = desc_c.domains
    desc_w = arcpy.Describe(ccsStandard.AnthroFeaturePath)
    anthro_domains = desc_w.domains
    for domain_name in anthro_domains:
        if domain_name not in current_domains and "Subtype" in domain_name:
            source_workspace = ccsStandard.AnthroFeaturePath
            code_field = 'code'
            description_field = 'description'
            domain_table = arcpy.DomainToTable_management(
                source_workspace, domain_name, domain_name, code_field,
                description_field)
            arcpy.TableToDomain_management(domain_table, code_field,
                                           description_field, workspace,
                                           domain_name)
            arcpy.Delete_management(domain_table)

    # Apply domains for each anthro feature
    for feature in featureList:
        # Apply for each Subtype field
        field = "Subtype"
        domainName = feature[7:-5] + "_Subtypes"
        arcpy.AssignDomainToField_management(feature, field, domainName)
        subtypes = arcpy.da.ListSubtypes(feature)
        if len(subtypes) == 1 and subtypes[0]['SubtypeField'] == '':
            pass
        else:
            st_codes = [
                str(stcode) for stcode, stdict in list(subtypes.items())
            ]
            arcpy.AssignDomainToField_management(feature, field, domainName,
                                                 st_codes)

        # Apply for each Subtype As Modified Field
        field = fieldsToAdd[-1]
        domainName = feature[7:-5] + "_Subtypes"
        arcpy.AssignDomainToField_management(feature, field, domainName)
        subtypes = arcpy.da.ListSubtypes(feature)
        if len(subtypes) == 1 and subtypes[0]['SubtypeField'] == '':
            pass
        else:
            st_codes = [
                str(stcode) for stcode, stdict in list(subtypes.items())
            ]
            arcpy.AssignDomainToField_management(feature, field, domainName,
                                                 st_codes)

        # Copy current subtype to Subtype as Modified field
        arcpy.CalculateField_management(feature, field, "!Subtype!",
                                        "PYTHON_9.3")

    # Add each feature to map for editing
    for feature in featureList:
        ccslib.AddAnthroToMap(workspace, feature)

    # Save map document and exit
    if arcpy.ListInstallations()[0] == 'arcgispro':
        p = arcpy.mp.ArcGISProject("CURRENT")
        p.save()
    else:
        mxd = arcpy.mapping.MapDocument("CURRENT")
        mxd.save()
示例#8
0
def main():
    # GET PARAMETER VALUES
    Map_Units_Provided = arcpy.GetParameterAsText(0)
    Project_Folder = arcpy.GetParameterAsText(1)
    Project_Name = arcpy.GetParameterAsText(2)  # optional

    # DEFINE DIRECTORIES
    # Get the pathname to this script
    scriptPath = sys.path[0]
    arcpy.AddMessage("Script folder: " + scriptPath)
    arcpy.AddMessage("Python version: " + sys.version)
    # Construct pathname to workspace
    workspace = arcpy.Describe(Map_Units_Provided).path
    arcpy.AddMessage("Project geodatabase: " + workspace)

    # Instantiate a ccsStandard object
    ccsStandard = ccslib.ccsStandard(workspace, scriptPath)

    # ENVIRONMENT SETTINGS
    # Set workspaces
    arcpy.env.workspace = workspace
    scratch_folder = os.path.join(arcpy.Describe(workspace).path, 'scratch')
    if arcpy.Exists(scratch_folder):
        pass
    else:
        arcpy.CreateFolder_management(scratch_folder)
    arcpy.env.scratchWorkspace = scratch_folder
    # Overwrite outputs
    arcpy.env.overwriteOutput = True

    # DEFINE VARIABLES FOR INPUT DATA
    inputDataPath = ccsStandard.InputDataPath
    # Filenames of feature classes and rasters used by this script
    MAP_UNITS = "Map_Units"
    CURRENT_ANTHRO_FEATURES = "Current_Anthro_Features"
    # Filenames of feature classes and rasters created by this script
    MAP_UNITS_DISSOLVE = "Map_Units_Dissolve"
    CURRENT_MGMT_CAT = "Current_Mgmt_Cat"
    CURRENT_WMZ = "Current_WMZ"
    CURRENT_PMU = "Current_PMU"
    CURRENT_PRECIP = "Current_Precip"

    # ------------------------------------------------------------------------

    # FUNCTION CALLS
    # Check tool version
    ccslib.CheckToolVersion()

    # Check out Spatial Analyst extension
    ccslib.CheckOutSpatialAnalyst()

    # Clear selection, if present
    ccslib.ClearSelectedFeatures(Map_Units_Provided)

    # Check Map_Units layer
    feature = Map_Units_Provided
    required_fields = ["Map_Unit_ID", "Map_Unit_Name", "Meadow"]
    no_null_fields = ["Map_Unit_ID"]
    expected_fcs = [CURRENT_ANTHRO_FEATURES]
    ccslib.CheckPolygonInput(feature, required_fields, expected_fcs,
                             no_null_fields)

    # Update Map Units layer with provided layer and add to map
    Map_Units = ccslib.AdoptParameter(Map_Units_Provided,
                                      MAP_UNITS,
                                      preserve_existing=False)
    layerFile = ccsStandard.getLayerFile("Map_Units.lyr")
    ccslib.AddToMap(Map_Units, layerFile)

    # Update message
    arcpy.AddMessage("Dissolving all multi-part map units to create "
                     "Map_Units_Dissolve")

    # Dissolve Map Units
    allowable_fields = [
        "Map_Unit_ID", "Map_Unit_Name", "Meadow", "Disturbance_Type", "PJ",
        "BROTEC", "Conifer_Phase"
    ]
    out_name = MAP_UNITS_DISSOLVE
    anthro_features = CURRENT_ANTHRO_FEATURES
    Map_Units_Dissolve = ccslib.DissolveMapUnits(Map_Units, allowable_fields,
                                                 out_name, anthro_features)

    # Update message
    arcpy.AddMessage("Adding Map_Units_Dissolve to map")

    # Add layer to map document
    feature = Map_Units_Dissolve
    layerFile = ccsStandard.getLayerFile("Map_Units.lyr")
    ccslib.AddToMap(feature, layerFile)

    # Update message
    arcpy.AddMessage("Calculating area in acres for each map unit")

    # Calculate Area
    ccslib.CalcAcres(Map_Units_Dissolve)

    # Initialize a list to track proportion feature classes
    prop_fcs = []

    # Update message
    arcpy.AddMessage("Calculating Proportion within each precipitation zone")

    # Calculate Proportion of each map unit in each Precip Zone
    in_feature = os.path.join(inputDataPath, "Precip")
    out_feature_class = CURRENT_PRECIP
    field_name = "Precip_Proportion"
    ccslib.CalcProportion(Map_Units_Dissolve, in_feature, out_feature_class,
                          field_name)
    prop_fcs.append(out_feature_class)

    # Update message
    arcpy.AddMessage("Calculating Management Importance Factor")

    # Calculate Proportion of each map unit in each Management Category
    in_feature = os.path.join(inputDataPath, "Mgmt_Cat")
    out_feature_class = CURRENT_MGMT_CAT
    field_name = "Mgmt_Proportion"
    ccslib.CalcProportion(Map_Units_Dissolve, in_feature, out_feature_class,
                          field_name)
    prop_fcs.append(out_feature_class)

    # Update message
    arcpy.AddMessage("Calculating Proportion within each WAFWA Management "
                     "Zone")

    # Calculate Proportion in each map unit in each WAFWA Zone
    in_feature = os.path.join(inputDataPath, "NV_WAFWA")
    out_feature_class = CURRENT_WMZ
    field_name = "WMZ_Proportion"
    ccslib.CalcProportion(Map_Units_Dissolve, in_feature, out_feature_class,
                          field_name)
    prop_fcs.append(out_feature_class)

    # Update message
    arcpy.AddMessage("Calculating Proportion within each Priority Management "
                     "Unit")

    # Calculate Proportion in each map unit in each PMU
    in_feature = os.path.join(inputDataPath, "NV_PMU")
    out_feature_class = CURRENT_PMU
    field_name = "PMU_Proportion"
    ccslib.CalcProportion(Map_Units_Dissolve, in_feature, out_feature_class,
                          field_name)
    prop_fcs.append(out_feature_class)

    # Delete unnecessary fields in proportion feature classes
    allowable_fields = [
        "Map_Unit_ID", "Management", "Mgmt_zone", "PMU_NAME", "Precip",
        "Mgmt_Proportion", "WMZ_Proportion", "PMU_Proportion",
        "Precip_Proportion"
    ]
    for feature in prop_fcs:
        ccslib.SimplifyFields(feature, allowable_fields)

    # Set processing extent to Map_Units layer
    arcpy.env.extent = arcpy.Describe(Map_Units_Dissolve).extent

    # Calculate the average HSI values per map unit for each map unit
    HSIseasons = ccsStandard.HSISeasons
    for season in HSIseasons:
        # Update message
        arcpy.AddMessage("Summarizing " + season + " HSI")

        # Calculate zonal statistics for each map unit
        inZoneData = Map_Units_Dissolve
        inValueRaster = os.path.join(inputDataPath, season + "_HSI")
        zoneField = "Map_Unit_ID"
        outTable = "ZonalStats_" + season + "_HSI"
        ccslib.CalcZonalStats(inZoneData, zoneField, inValueRaster, outTable)

        # Join the zonal statistic to the Map Units Dissolve table
        fieldName = season + "_HSI"
        ccslib.JoinMeanToTable(inZoneData, outTable, zoneField, fieldName)

    # Calculate the average seasonal modifier values per map unit and join to
    # Map_Units_Dissolve layer
    terms = ccsStandard.DebitTerms
    seasons = ccsStandard.Seasons
    for term in terms:
        for season in seasons:
            # Update message
            arcpy.AddMessage("Summarizing " + term + "_Local_" + season)

            # Calculate zonal statistics for each map unit
            inZoneData = Map_Units_Dissolve
            inValueRaster = term + "_Local_" + season
            zoneField = "Map_Unit_ID"
            outTable = "ZonalStats_" + term + season
            ccslib.CalcZonalStats(inZoneData, zoneField, inValueRaster,
                                  outTable)

            # Join the zonal statistic to the Map Units Dissolve table
            fieldName = term + "_" + season
            ccslib.JoinMeanToTable(inZoneData, outTable, zoneField, fieldName)

    # Add transect field to Map_Units_Dissolve
    input_feature = Map_Units_Dissolve
    fields = ["Transects"]
    fieldTypes = ["SHORT"]
    ccslib.AddFields(input_feature, fields, fieldTypes)

    # Export data to Excel
    input_Tables = [
        MAP_UNITS_DISSOLVE, CURRENT_MGMT_CAT, CURRENT_WMZ, CURRENT_PMU,
        CURRENT_PRECIP
    ]
    for table in input_Tables:
        ccslib.ExportToExcel(table, Project_Folder, Project_Name)

    # Save map document
    if arcpy.ListInstallations()[0] == 'arcgispro':
        p = arcpy.mp.ArcGISProject("CURRENT")
        p.save()
    else:
        mxd = arcpy.mapping.MapDocument("CURRENT")
        mxd.save()