En mi última Correo electrónico: Tenía un problema en el que quería crear múltiples shapefiles basados en un solo campo de atributos (años). La forma de hacerlo fue respondida en ese post. Quiero hacer esa herramienta más dinámica para que el usuario pueda seleccionar cualquier campo y cualquier valor y hacer un shapefile para él. Alguna sugerencia de cómo hacer dinámica la herramienta para que los campos y el operador(<,<=,=,>,>=) también puedan ser definidos por el propio usuario.
He probado lo siguiente:
import arcpy
fc = arcpy.GetParameterAsText(0)
yrs = arcpy.GetParameterAsText(1)
yrs = yrs.split(';')
subtract = ''
for yr in yrs:
where = '"arcpy.GetParameterAsText(3)" arcpy.GetParameterAsText(2) ' + str(yr) + subtract
subtract = ' AND "arcpy.GetParameterAsText(3)" > ' + str(yr)
filename = str(arcpy.GetParameterAsText(3)) + '.shp'
arcpy.FeatureClassToFeatureClass_conversion(fc, "arcpy.GetParameterAsText(4)", filename, where)
del yr
Me aparece el siguiente mensaje de error: : ERROR 999999: Error al ejecutar la función. Se ha utilizado una sentencia SQL no válida. Se ha utilizado una sentencia SQL no válida. Fallo en la ejecución (FeatureClassToFeatureClass).
También adjunto la captura de pantalla de las propiedades al añadir el script.
1 votos
Hay demasiados problemas aquí y no entiendo cuál es la lógica que se pretende. Por favor, explique lo que está tratando de lograr en términos exactos (añadir comentarios a su código puede ayudar). También repasa alguno de los enlaces de formato de cadena que puse al final de mi respuesta. No puedes esperar usar una expresión entre comillas y que se evalúe a cualquier cosa que no sea un literal de cadena... necesitas usar el formato de cadena.
0 votos
También en tu lista de valores del operador parece que has puesto un espacio entre los caracteres de los operadores menor que y mayor que. Es necesario que no haya un espacio allí.
0 votos
También puedes ayudarte a ti mismo aprendiendo a depurar . Utiliza un IDE de Python decente como PyScripter o Eclipse con PyDev .
0 votos
Otro consejo, asigne el resultado de cada una de las llamadas a GetParameterAsText() a una variable cerca de la parte superior de su script en lugar de llamarlo en línea en la parte principal.
0 votos
Para quien tenga curiosidad por hacer esto con OGR, como muestra Matt Wilkie En este caso, basta con una simple instrucción ogr2ogr para crear un nuevo shapefile basado en un shapefile existente (es decir, con los mismos campos):
ogr2ogr NewFile.shp Template.shp -where "FID < 0"
0 votos
Lo que quiero conseguir es crear un nuevo shapefile basado en los atributos de un shapefile existente. Y además debe ser una herramienta genérica. Por ejemplo: Si digo shapefiles para Año <= 1990;1995 Entonces debería darme 2 shapefiles 1990.shp y 1995.shp. Del mismo modo, si digo que el consumo es alto, me debería dar sólo los archivos shape que tienen ese valor particular en el campo de atributos.
0 votos
Year <= 1990;1995
no tiene mucho sentido. Tal vez se podría añadir elIN
y construir una cláusula WHERE comoYEAR IN(1990, 1995)
, que básicamente se amplía aYEAR = 1990 OR YEAR = 1995
hasta el número de elementos dentro de laIN
declaración. Tengo un ejemplo de cómo hacerlo aquí: gis.stackexchange.com/questions/21760/0 votos
¿Has visto el parámetro Sql Expression? Es un control que permite al usuario definir una cláusula Where a partir de una clase de característica o tabla existente. Puede utilizar esta expresión como cláusula where en FC_to_FC.