Select to view content in your preferred language

field_mappings["AdditionalTime"].mappedFieldName = turnoutTimeField not applying

576
1
05-22-2022 07:45 PM
HarrySmiles
Occasional Contributor

I am trying to generate a number of service profiles using the arcpy nax network analyst library. The idea is to create a profile for each  of the models (impedance  values) we use, and also some standard cut off times that we use.

The script appears to work but does not apply either the Additional Time mapped field name, or the default value. In the output facilities layer the value for all locations is 0.

I've made sure that the value in the turnout field is a double.

Any ideas what the issue could be.

Thanks

import arcpy
arcpy.CheckOutExtension("network")

roadNetwork = r"C:\aaa\rnm\2022_04.gdb\Core_VG2020\RoutingApplication_ND"
nd_layer_name = "Routing_ND"
#inFacilities = r"J:\projects\netmodels\04 Data\Turnout Times\FY2122_Q3\data.gdb\FY2022_Q3_Brigades_w_TOT"
inFacilities = r"C:\aaa\rnm\Statewide_Profiles\Resp_Profiles_2022_04.gdb\inside"

turnoutTimeField = "turnout"
additional_fields = ['turnout_id', 'short_name', 'brig_name', 'brig_no', 'distrct_no', 'turnout_mins',
                     turnoutTimeField]

toolOutput = r"C:\aaa\rnm\Statewide_Profiles\Resp_Profiles_2022_04.gdb"
outputName = "Resp_Profiles_2022_041"

models = ['ARRB_Min', 'ARRB_Mean', 'ARRB_Max', 'EmergencyServicesTime', 'GLM_Pumper_Off_Peak', 'GLM_Pumper_Peak',
          'GLM_Tanker_Off_Peak', 'GLM_Tanker_Peak']
breakValues = [8, 10, 20]
travel_mode_name = "CFA"

# Create a network dataset layer and get the desired travel mode for analysis
arcpy.nax.MakeNetworkDatasetLayer(roadNetwork, nd_layer_name)
nd_travel_modes = arcpy.nax.GetTravelModes(nd_layer_name)
travel_mode = nd_travel_modes["CFA"]

service_area = arcpy.nax.ServiceArea(nd_layer_name)
# Set properties
service_area.outputType = arcpy.nax.ServiceAreaOutputType.Polygons
service_area.geometryAtOverlap = arcpy.nax.ServiceAreaOverlapGeometry.Overlap
service_area.polygonDetail = arcpy.nax.ServiceAreaPolygonDetail.Standard


additional_fields_objects = [f for f in arcpy.ListFields(inFacilities) if f.name in additional_fields]

field_mappings = service_area.fieldMappings(arcpy.nax.ServiceAreaInputDataType.Facilities,
                                            list_candidate_fields=additional_fields_objects)

field_mappings["AdditionalTime"].mappedFieldName = turnoutTimeField
field_mappings["AdditionalTime"] = 6.0

service_area.load(arcpy.nax.ServiceAreaInputDataType.Facilities, inFacilities, field_mappings)

for model in models:
    travel_mode.impedance = model
    travel_mode.timeAttributeName = model
    service_area.travelMode = travel_mode
    for cutoff in breakValues:
        service_area.defaultImpedanceCutoffs = cutoff
        result = service_area.solve()
        if result.solveSucceeded:
            output_fc = f"{toolOutput}\\{outputName}_{model}_{cutoff}"
            result.export(arcpy.nax.ServiceAreaOutputDataType.Polygons, output_fc)
            result.export(arcpy.nax.ServiceAreaOutputDataType.Facilities, output_fc + "_fac")
        else:
            print("Solve failed")
            print(result.solverMessages(arcpy.nax.MessageSeverity.All))

 

Tags (2)
0 Kudos
1 Reply
by Anonymous User
Not applicable

Just guessing here for now, but I don’t think it likes the .notation. There’s no error, but no change either. I’ve found that field mappings work better if the whole fieldmap object is pulled out, modified, then reassigned.

field_mappings["AdditionalTime"].mappedFieldName = turnoutTimeField

Assign the field_mappings[‘AdditionalTime’] to a variable, change the ‘mappedFieldName’ property there, and reassign it back to field_mappings[‘AdditionalTime’]

tmp = field_mappings[‘AdditionalTime’]
tmp[‘MappedFld…’] = turnoutTimeField
field_mappings[‘AddititonalTime’] = tmp

0 Kudos