Eu tenho um punhado de aproximadamente 1000 shapefiles que estão corrompidos (consulte a mensagem de erro em anexo). Os shapefiles foram gerados a partir do eCognition Developer 8. Existe uma ferramenta de script que parece reparar o shapefile depois que ele é identificado como corrompido.
Editar:
Quero criar um script rápido para percorrer todos os meus shapefiles e verificar se o número de formas corresponde aos registros da tabela. Posso contar os registros da tabela usando o seguinte:
# 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
Em última análise, gostaria de criar algum tipo de verificação lógica, como:
if result_dbf = result_shp:
pass
else:
print "There is a problem with" + str(Sample)
Como posso contar formas diretamente sem acessar o arquivo .dbf? Ou, em outras palavras, qual é a melhor maneira de verificar programaticamente se o número de formas corresponde ao número de registros da tabela?
Respostas:
Que tal usar o pyshp ? Eu o instalei com o pip e o que tentei abaixo é basicamente direto do README :
Infelizmente (ou talvez felizmente?) Não tenho shapefiles levantados para testar, para ver se não. de formas pode! = não. de registros.
Espere um minuto, agora eu tenho um arquivo shapefile levantado, graças à idéia de Kirk nos comentários abaixo. Fiz backup do dbf, fiz uma cópia de todo o shapefile, excluí alguns recursos e renomeei o dbf de backup para o original e eis que o número de formas <número de registros:
fonte
Pelo som da sua pergunta, parece que tudo o que você realmente deseja fazer é determinar se um arquivo shapefile tem ou não problemas (nesse caso, registros incompatíveis). Se você apenas precisar identificar aqueles com problemas, não precisará contar os registros no DBF e no Shapefile para determinar se está com erro. Aqui está o porquê:
Se você tentar executar a função GetCount em um shapefile com diferentes contagens de registros, ela falhará com o erro:
Como a função GetCount falha nesse cenário, e tudo o que você quer fazer é identificar os arquivos shapefiles com erro, você pode capturar isso com uma cláusula try / except no seu código, em vez do if / else que você estava tentando usar anteriormente.
Tomei a liberdade de adicionar o código e o loop "List FeatureClasses" para que você pudesse testar todos os FCs no seu espaço de trabalho sem precisar testar manualmente cada um.
fonte
O formato shapefile está documentado. Eu acho que o número de registros no arquivo shp não corresponde ao número de registros no arquivo dbf.
O formato do arquivo shp está documentado aqui . Então você pode escrever um programa para contar o número de formas. O formato dbf está documentado em muitos lugares e você deve encontrar amostras para contar linhas, por exemplo, aqui .
fonte
O script anexado percorre um diretório e verifica se o número de formas corresponde ao número de registros para cada shapefile.
fonte
O uso da geometria de verificação deve levar você ao primeiro passo.
A Onus
Repair Geometry permitirá que você selecione a ordem e a prioridade do problema que deseja reparar.
Aqui estão alguns outros links de versões mais antigas . Quando você executa o verificador shapefile, termina com reconstruir o dbf?
Essa é a etapa que cria os registros correspondentes. Ocorreu uma de duas coisas para causar o erro.
Várias coisas podem causar isso.
O shx é na verdade o índice entre os dois.
Contar formas sem contar registros dbf é apenas metade da solução.
fonte
Analisando o artigo da wikipedia sobre shapefiles , o arquivo .shx deve conter um índice no arquivo .shp, não no arquivo .dbf. Portanto, pode ser necessário verificar se .shx e .shp se encaixam.
É possível abrir um arquivo shapefile sem .dbf (o que significa que você não possui tabela de atributos), mas um índice quebrado gera uma mensagem de erro.
fonte