I wrote a python script in order to get all features near a point and its distances. To reach that, I'm using LocateFeaturesAlongRoutes_lr, then performing a join with a feature layer and finally using a field mappings object to rename and remove attributes. This last step is done using FeatureClassToFeatureClass_conversion, which accepts field mappings as parameter.
My problem is that FeatureClassToFeatureClass_conversion is taking about 1'20'' to complete, what is too much considering that only a few features remain after the join.
The issue becomes even more weird when I realized that TableToTable_conversion consumes just a few milliseconds.
Can I speed up FeatureClassToFeatureClass_conversion? Or use another method to rename and remove attributes (field info parameters from MakeFeatureLayer_management could just remove fields)?
def renameAttribute(fms, old_name, new_name): index = fms.findFieldMapIndex(old_name) fieldMap = fms.getFieldMap(index) output_field = fieldMap.outputField output_field.name = new_name output_field.aliasName = new_name fieldMap.outputField = output_field fms.replaceFieldMap(index, fieldMap)points_fc = arcpy.GetParameterAsText(0)radius = arcpy.GetParameterAsText(1)lines_grf_fl = arcpy.GetParameterAsText(2)view_lines = arcpy.GetParameterAsText(3)distance_table = arcpy.LocateFeaturesAlongRoutes_lr(points_fc, lines_grf_fl, 'ID_LOGRADOURO', radius, 'in_memory\\distance_table', 'ID_LOGRADOURO POINT MEASURE', route_locations='ALL').getOutput(0)distance_table_view = arcpy.MakeTableView_management(distance_table, 'distance_table_view').getOutput(0)arcpy.AddJoin_management(view_lines, 'ID_LOGRADOURO_24', distance_table_view, 'ID_LOGRADOURO', 'KEEP_COMMON')distance_fl = arcpy.MakeFeatureLayer_management(view_lines, 'distance_fl') .getOutput(0)fms = arcpy.FieldMappings()fms.addTable(distance_fl)fieldMapsToRemove = \ ['CODIGO_MUNICIPIO', \ 'NOME_MUNICIPIO', \ 'ABREV_PREFIXO', \ 'DESC_PREFIXO', \ 'ABREV_TIPO', \ 'DESC_TIPO', \ 'DESC_PREPOSICAO', \ 'ABREV_TITULO', \ 'DESC_TITULO', \ 'NOME', \ 'ID_LOGRADOURO_INICIO', \ 'ID_LOGRADOURO_FIM', \ 'HISTORIA', \ 'STATUS_CANCELAMENTO', \ 'FAIXA_VISIVEL', \ 'BAIRROS', \ 'tabela_distancias_ID_LOGRADOURO', \ 'tabela_distancias_ObjectId']for name in fieldMapsToRemove: index = fms.findFieldMapIndex(name) fms.removeFieldMap(index)renameAttribute(fms, 'ID_LOGRADOURO_24', 'ID_LOGRADOURO_GEO')renameAttribute(fms, 'ID_LOGRADOURO', 'ID_LOGRADOURO_ALFA')renameAttribute(fms, 'tabela_distancias_Distance', 'DISTANCIA')renameAttribute(fms, 'tabela_distancias_MEASURE', 'MEASURE')renameAttribute(fms, 'CODIGO', 'CODIGO_LOGRADOURO')renameAttribute(fms, 'NOME_COMPLETO', 'NOME_COMPLETO_LOGRADOURO')renameAttribute(fms, 'SHAPE_LEN', 'COMPRIMENTO_LOGRADOURO')results = arcpy.FeatureClassToFeatureClass_conversion(distance_fl, 'in_memory', 'results', field_mapping=fms).getOutput(0)arcpy.SetParameter(4, results)[EDIT 1]
I modified the script to use CopyFeatures_management instead of FeatureClassToFeatureClass_conversion but the it is taking a long time to finish yet.
أكثر...
My problem is that FeatureClassToFeatureClass_conversion is taking about 1'20'' to complete, what is too much considering that only a few features remain after the join.
The issue becomes even more weird when I realized that TableToTable_conversion consumes just a few milliseconds.
Can I speed up FeatureClassToFeatureClass_conversion? Or use another method to rename and remove attributes (field info parameters from MakeFeatureLayer_management could just remove fields)?
def renameAttribute(fms, old_name, new_name): index = fms.findFieldMapIndex(old_name) fieldMap = fms.getFieldMap(index) output_field = fieldMap.outputField output_field.name = new_name output_field.aliasName = new_name fieldMap.outputField = output_field fms.replaceFieldMap(index, fieldMap)points_fc = arcpy.GetParameterAsText(0)radius = arcpy.GetParameterAsText(1)lines_grf_fl = arcpy.GetParameterAsText(2)view_lines = arcpy.GetParameterAsText(3)distance_table = arcpy.LocateFeaturesAlongRoutes_lr(points_fc, lines_grf_fl, 'ID_LOGRADOURO', radius, 'in_memory\\distance_table', 'ID_LOGRADOURO POINT MEASURE', route_locations='ALL').getOutput(0)distance_table_view = arcpy.MakeTableView_management(distance_table, 'distance_table_view').getOutput(0)arcpy.AddJoin_management(view_lines, 'ID_LOGRADOURO_24', distance_table_view, 'ID_LOGRADOURO', 'KEEP_COMMON')distance_fl = arcpy.MakeFeatureLayer_management(view_lines, 'distance_fl') .getOutput(0)fms = arcpy.FieldMappings()fms.addTable(distance_fl)fieldMapsToRemove = \ ['CODIGO_MUNICIPIO', \ 'NOME_MUNICIPIO', \ 'ABREV_PREFIXO', \ 'DESC_PREFIXO', \ 'ABREV_TIPO', \ 'DESC_TIPO', \ 'DESC_PREPOSICAO', \ 'ABREV_TITULO', \ 'DESC_TITULO', \ 'NOME', \ 'ID_LOGRADOURO_INICIO', \ 'ID_LOGRADOURO_FIM', \ 'HISTORIA', \ 'STATUS_CANCELAMENTO', \ 'FAIXA_VISIVEL', \ 'BAIRROS', \ 'tabela_distancias_ID_LOGRADOURO', \ 'tabela_distancias_ObjectId']for name in fieldMapsToRemove: index = fms.findFieldMapIndex(name) fms.removeFieldMap(index)renameAttribute(fms, 'ID_LOGRADOURO_24', 'ID_LOGRADOURO_GEO')renameAttribute(fms, 'ID_LOGRADOURO', 'ID_LOGRADOURO_ALFA')renameAttribute(fms, 'tabela_distancias_Distance', 'DISTANCIA')renameAttribute(fms, 'tabela_distancias_MEASURE', 'MEASURE')renameAttribute(fms, 'CODIGO', 'CODIGO_LOGRADOURO')renameAttribute(fms, 'NOME_COMPLETO', 'NOME_COMPLETO_LOGRADOURO')renameAttribute(fms, 'SHAPE_LEN', 'COMPRIMENTO_LOGRADOURO')results = arcpy.FeatureClassToFeatureClass_conversion(distance_fl, 'in_memory', 'results', field_mapping=fms).getOutput(0)arcpy.SetParameter(4, results)[EDIT 1]
I modified the script to use CopyFeatures_management instead of FeatureClassToFeatureClass_conversion but the it is taking a long time to finish yet.
أكثر...