Tengo un puñado de aproximadamente 1000 shapefiles que están dañados (vea el mensaje de error adjunto). Los archivos de forma se generaron a partir de eCognition Developer 8. Existe una herramienta de script que parece reparar el archivo de forma una vez que se identifica como dañado.
Editar:
Quiero crear una secuencia de comandos rápida para recorrer todos mis archivos de formas y verificar si el número de formas coincide con los registros de la tabla. Puedo contar registros de tabla usando lo siguiente:
# Name: fcCount.py
# Purpose: calculate the number of features in a featureclass
# Import system modules
import arcpy
from arcpy import env
env.workspace = "C:/data"
Sample = "MyShp.shp"
result_dbf = int(arcpy.GetCount_management(Sample).getOutput(0))
print result_dbf
En última instancia, me gustaría crear algún tipo de verificación lógica como:
if result_dbf = result_shp:
pass
else:
print "There is a problem with" + str(Sample)
¿Cómo puedo contar formas directamente sin acceder al archivo .dbf? O, en otras palabras, ¿cuál es la mejor manera de verificar mediante programación si el número de formas coincide con el número de registros de la tabla?
Respuestas:
¿Qué pasa con el uso de pyshp ? Lo instalé con pip y lo que probé a continuación es casi directo de README :
Desafortunadamente (¿o quizás afortunadamente?) No tengo ningún archivo de forma para probar para ver si no. de formas puede! = no. de registros.
Espere un minuto, ahora tengo un archivo de forma levantado gracias a la idea de Kirk en los comentarios a continuación. Realicé una copia de seguridad del dbf, hice una copia de todo el archivo de forma, eliminé algunas características, luego cambié el nombre del dbf respaldado por el original, y he aquí, el número de formas <número de registros:
fuente
Por el sonido de su pregunta, parece que todo lo que realmente quiere hacer es determinar si un archivo shape tiene o no problemas (en este caso, registros no coincidentes). Si solo necesita identificar a aquellos con problemas, en realidad no necesita contar los registros en el DBF y Shapefile para determinar si se trata de un error. Este es el por qué:
Si intenta ejecutar la función GetCount en un archivo de forma que tiene diferentes recuentos de registros, fallará con el error:
Dado que la función GetCount falla en este escenario, y todo lo que desea hacer es identificar los archivos de forma por error, puede detectar esto con una cláusula try / except en su código, en lugar del if / else que intentaba usar anteriormente.
Me tomé la libertad de agregar el código y el bucle "List FeatureClasses" para que pueda probar todos los FC en su espacio de trabajo sin tener que probarlos manualmente.
fuente
El formato del archivo de forma está documentado. Supongo que el número de registros en el archivo shp no corresponde al número de registros en el archivo dbf.
El formato de archivo shp se documenta aquí . Entonces podrías escribir un programa para contar el número de formas. El formato dbf está documentado en muchos lugares y debería poder encontrar muestras para contar filas, por ejemplo, aquí .
fuente
El script adjunto recorre un directorio y comprueba si el número de formas coincide con el número de registros para cada archivo de formas.
fuente
El uso de la geometría de verificación debería ayudarlo a pasar el primer paso.
Onus
Repair Geometry le permitirá seleccionar el orden y la prioridad del problema para el que desea reparar.
Aquí hay otros enlaces de versiones anteriores . Cuando ejecutas el verificador de shapefile, ¿terminas con reconstruir dbf?
Ese es el paso que crea los registros para que coincidan. Se ha producido una de dos cosas para causar el error.
Varias cosas pueden causar esto.
El shx es en realidad el índice entre los dos.
Contar formas sin contar registros dbf es solo la mitad de la solución.
fuente
Mirando el artículo de wikipedia sobre archivos de forma , el archivo .shx debe contener un índice en el archivo .shp, no en el archivo .dbf. Por lo tanto, podría ser necesario verificar si .shx y .shp encajan entre sí.
Es posible abrir un archivo de forma sin .dbf (lo que significa que no tiene una tabla de atributos), pero un índice roto generará un mensaje de error.
fuente