1 votos

Analista de redes Arcpy - Realizar el coste de la matriz OD en bucle

Quiero realizar el OD Matrix Cost en bucle para cada grupo de ubicaciones dentro de una clase de característica.

Como salida, quiero una clase de característica de líneas por grupo.

import arcpy

arcpy.env.overwriteOutput = True

def execute():
    network_dataset = arcpy.GetParameter(0)
    impedenace_attribute = arcpy.GetParameter(1)
    locations_fc = arcpy.GetParameter(2)
    sort_field = arcpy.GetParameter(3)
    group_by_field = arcpy.GetParameter(4)
    output_workspace = arcpy.GetParameter(5)
    arcpy.env.workspace = output_workspace
    calculate_OD(network_dataset, impedenace_attribute, locations_fc, group_by_field, sort_field, output_workspace)

def calculate_OD(network_dataset, impedenace_attribute, locations_fc, group_by_field, sort_field, output_workspace):
    group_by_list = sorted(set((row[0] for row in arcpy.da.SearchCursor(locations_fc, group_by_field))))

    OD_Layer = arcpy.MakeODCostMatrixLayer_na(network_dataset, "OD_Matrix_Layer", impedenace_attribute)
    OD_Layer = OD_Layer.getOutput(0)

    for group in group_by_list:
        expression = u"{} = '{}'".format(group_by_field, group)
        group_layer = arcpy.MakeFeatureLayer_management(locations_fc, "locations_{}".format(group), where_clause=expression)
        group_fc = arcpy.CopyFeatures_management(group_layer, "OD_locations_{}".format(group))

        subLayerNames = arcpy.na.GetNAClassNames(OD_Layer)

        originsLayerName = subLayerNames["Origins"]
        arcpy.na.AddLocations(OD_Layer, originsLayerName, group_fc, sort_field=sort_field, append="CLEAR")

        destinationLayerName = subLayerNames["Destinations"]
        arcpy.na.AddLocations(OD_Layer, destinationLayerName, group_fc, sort_field=sort_field, append="CLEAR")

        arcpy.na.Solve(OD_Layer,"HALT")

        #save output in feature class (this generate the error below)
        arcpy.CopyFeatures_management(OD_Layer, "OD_output_{}".format(group))

execute()

Sin embargo, tengo un problema al copiar la subcapa ODLines a una nueva clase de característica.

ExecuteError: Fallo en la ejecución. Los parámetros no son válidos. ERROR 000840: El valor no es una capa de características. ERROR 000840: El valor no es no es una Capa de Catálogo Raster.

2voto

Spyros Puntos 56

No se puede copiar la capa de matriz OD a una clase de característica de líneas directamente. Esta capa de matriz OD es una capa de grupo, necesita recuperar la capa de líneas dentro del grupo. Pruebe esto:

arcpy.na.Solve(OD_Layer, "HALT")
lines = arcpy.mapping.ListLayers(OD_Layer, subLayerNames["ODLines"])[0]
arcpy.CopyFeatures_management(lines, "OD_Layer_{}".format(group))

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X