Trabajar con geodatabases en Python
Validar nombres de tabla
Las geodatabases utilizan diversos sistemas de administración de bases de datos relacionales (RDBMS) para mantener las muchas tablas que componen una geodatabase. Todas las tablas de una geodatabase deben tener un nombre único, de modo que es esencial un mecanismo para comprobar si un nombre de tabla es único al crear datos en una geodatabase. Asegurarse de que un nuevo nombre de tabla es único es clave para eliminar la posibilidad de sobrescribir datos accidentalmente si la secuencia de comandos no se asegura de que el nuevo nombre de salida es único.
La función Exists() puede comprobar si el nombre de tabla es único para un espacio de trabajo determinado.
Con la función ValidateTableName (), una secuencia de comandos puede determinar si un nombre específico es válido y único para un espacio de trabajo concreto. La función ValidateTableName() no determina que el nombre especificado sea único para el espacio de trabajo especificado. Solo devuelve un nombre de tabla válido para ese espacio de trabajo.
Función |
Explicación |
---|---|
ValidateTableName(nombre, {espacio_de_trabajo}) |
Toma un nombre de tabla y una ruta de acceso de espacio de trabajo y devuelve un nombre de tabla válido para el espacio de trabajo |
Especificar el espacio de trabajo como un parámetro permite a ArcPy comprobar todos los nombres de tabla existentes y determinar si hay restricciones de denominación impuestos por el espacio de trabajo de salida. Si el espacio de trabajo de salida es un RDBMS, puede tener palabras reservadas que no se puedan utilizar en un nombre de tabla. También puede tener caracteres no válidos que no se pueden utilizar en una tabla o nombre de campo. Todos los caracteres no válidos se reemplazan por un subrayado (_). ValidateTableName() devuelve una cadena de caracteres que representa un nombre de tabla válido, que puede ser igual que el nombre de entrada si el nombre de entrada es válido. El ejemplo siguiente garantiza que la nueva clase de entidad de salida creada por la herramienta Copiar entidades tenga un nombre único válido en cualquier geodatabase:
# Move all shapefiles from a folder into a geodatabase # import arcpy from arcpy import env # Set the workspace. List all of the shapefiles # env.workspace = "D:/St_Johns" fcs = arcpy.ListFeatureClasses("*") # Set the workspace to SDE for ValidateTableName # env.workspace = "Database Connections/Bluestar.sde" # For each feature class name # for fc in fcs: # Validate the output name so it is valid # outfc = arcpy.ValidateTableName(fc) # Copy the features from the workspace to a geodatabase # arcpy.CopyFeatures_management(fc, outfc)
Validar nombres de campo
Cada base de datos puede tener restricciones de denominación para los nombres de campo de una tabla. Los objetos tales como las clases de entidad o las clases de relación se almacenan como tablas en un RDBMS, de modo que estas restricciones afectan a algo más que a tablas independientes. Estas restricciones pueden o no ser comunes entre varios sistemas de bases de datos, de modo que las secuencias de comandos deben comprobar todos los nuevos nombres de campo para asegurarse de que no se produzca un error en una herramienta durante la ejecución.
Función |
Explicación |
---|---|
ValidateFieldName(nombre, {espacio_de_trabajo}) |
Acepta una cadena de caracteres (nombre de campo) y una ruta de acceso de espacio de trabajo, y devuelve un nombre de campo válido basado en las restricciones de denominación de la geodatabase de salida |
El ejemplo siguiente garantiza que se agregue un campo, independientemente del nombre de entrada, utilizando la función ValidateFieldName:
# Create a new numeric field containing the ratio of polygon area to # polygon perimeter. Two arguments, a feature class and field name, # are expected. # Define a pair of simple exceptions for error handling # class ShapeError(Exception): pass class FieldError(Exception): pass import arcpy import os try: # Get the input feature class and make sure it contains polygons # input = arcpy.GetParameterAsText(0) desc = arcpy.Describe(input) if desc.shapeType.lower() != "polygon": raise ShapeError # Get the new field name and validate it # fieldname = arcpy.GetParameterAsText(1) fieldname = arcpy.ValidateFieldName(fieldname, os.path.dirname(input)) # Make sure shape_length and shape_area fields exist # if len(arcpy.ListFields(input,"Shape_area")) > 0 and \ len(arcpy.ListFields(input,"Shape_length")) > 0: # Add the new field and calculate the value # arcpy.AddField_management(input, fieldname, "double") arcpy.CalculateField_management(input,fieldname, "[Shape_area] / [Shape_length]") else: raise FieldError except ShapeError: print "Input does not contain polygons" except FieldError: print "Input does not contain shape area and length fields" except: print arcpy.GetMessages(2)
Siempre que una secuencia de comandos actualice un dataset, tal como una clase de entidad o una tabla, tenga cuidado para evitar situaciones en las que el dataset se bloquee. Si se ha abierto una geodatabase personal o de archivos en ArcCatalog, una secuencia de comandos no podrá actualizar ningún contenido de la geodatabase hasta que se anule la selección y se actualice la carpeta, o se cierre ArcCatalog. Esto incluye las herramientas de secuencia de comandos.
Analizar nombres de tabla y de campo
Las secuencias de comandos deben utilizar las funciones ParseTableName() y ParseFieldName() para dividir los nombres completos para un dataset o una columna de una tabla en sus componentes (base de datos, propietario, tabla y columna). Las secuencias de comandos que necesiten ser independientes del RDBMS no deben asumir que sea el punto (.) el delimitador utilizado para separar los componentes de un nombre completo de dataset. Las aplicaciones ArcGIS siempre utilizan nombres completos, de modo que si la secuencia de comandos se está utilizando como origen de una herramienta de secuencia de comandos, se debe analizar cualquier nombre de clase de entidad, por ejemplo, si la secuencia de comandos necesita determinar el nombre de la clase de entidad sin los nombres de base de datos y de usuario. En el ejemplo siguiente, la secuencia de comandos comprueba la clase de entidad de entrada para ver si hay nombres de usuario concretos. La secuencia de comandos podría utilizar las funciones de análisis de Python para dividir el nombre completo pero, entonces, estaría asumiendo que se utiliza una sintaxis concreta, que puede cambiar si se utiliza otro tipo de base de datos. ParseTableName() devuelve una cadena de caracteres única con el nombre de la base de datos, el nombre del propietario y el nombre de la tabla separados por comas. ParseFieldName() devuelve el nombre de la tabla y el nombre de campo, también separados por comas. Una secuencia de comandos puede analizar entonces de manera confiable la cadena de caracteres devuelta, dado que estas funciones siempre devuelven la misma cadena de caracteres con formato. Una cadena de caracteres en Python tiene varios métodos nativos para su manipulación. En este ejemplo, se utiliza el método split para crear una lista de Python , utilizando la coma como delimitador.
Función |
Explicación |
---|---|
ParseFieldName(nombre, {espacio_de_trabajo}) |
Analiza un nombre de campo en sus componentes (base de datos, nombre del propietario, nombre de la tabla, nombre del campo) en función del espacio de trabajo |
ParseTableName(nombre, {espacio_de_trabajo}) |
Analiza un nombre de tabla en sus componentes (base de datos, propietario, tabla) en función del espacio de trabajo |
# Append input feature class to another feature class and update field # import arcpy from arcpy import env import sys # Get the name of the input feature class and parse it. # env.workspace = os.path.dirname(arcpy.GetParameterAsText(0)) # Split ParseTableName's returned value to determine database, owner, and # featureclass # fullname = arcpy.ParseTableName(os.path.basename(arcpy.GetParameterAsText(0))) database, owner, featureclass = fullname.split(",") # Validate the name of the feature class that will be appended to and set # the workspace using the administrator's connection # env.workspace = "Database Connections/Trans_admin.sde" appendFC = arcpy.ValidateTableName("common", "roads") try: if owner == "TJohnson": arcpy.CalculateField_management(fullname, "AppendedBy", owner) arcpy.Append_management(fullname, appendFC) elif owner == "RSmith": arcpy.CalculateField_management(fullname, "AppendedBy", owner) arcpy.Append_management(fullname, appendFC) else: arcpy.AddError("Unknown user of input feature class") except: arcpy.AddError(arcpy.GetMessages(2))
Una lista de Python es una colección ordenada de cualquier tipo de objeto, tales como cadenas de caracteres o números. Las listas se basan en cero y se pueden utilizar para gestionar eficazmente matrices de valores cuando se conoce el orden de los contenidos de la lista.
Las secuencias de comandos que se utilizan como origen de las herramientas de secuencias de comandos pueden hacer algunas suposiciones sobre los valores de sus argumentos de entrada. El marco de geoprocesamiento completa siempre las rutas de acceso a los datos. Las secuencias de comandos que se pueden ejecutar fuera de una aplicación ArcGIS no deben hacer la misma suposición.