Python não pode ler shapefile

11

Estou tentando abrir um shapefile com o notebook Jupyter, mas não consigo abri-lo. O shapefile está localizado na mesma pasta da minha pasta de trabalho e o Python não pode identificá-lo, mesmo que eu use o caminho completo.

import shapefile as shp
import matplotlib.pyplot as plt

sf = shp.Reader(r'C:\Users\Public\Documents\1-11-99n.shp')

ShapefileException: Unable to open C:\Users\Public\Documents\1-11-99n.dbf or C:\Users\Public\Documents\1-11-99n.shp.

Abri-lo com fiona e geopandas também não funciona.

import fiona
shape = fiona.open("1-11-99n.shp")

e

import geopandas as gp
shp = gp.GeoDataFrame.from_file('1-11-99n.shp')
print (shp)

ambos acabam com

CPLE_OpenFailedError: b'Unable to open 1-11-99n.shx or 1-11-99n.SHX.Try --config SHAPE_RESTORE_SHX true to restore or create it'

Sei que esse pode ser um problema trivial, mas sou novo no uso de shapefiles e bibliotecas espaciais de Python, por isso realmente não sei como solucionar esse problema.

Leonard Shaw
fonte
substituir a menos com um sublinhado e tente novamente .. nomes shapefile devem conter letras, números e sublinhados apenas . Também seria uma boa idéia começar o nome com uma letra. Se o problema persistir, o shapefile provavelmente está corrompido ou o .SHX está ausente .. você possui apenas o arquivo .SHP ou possui um conjunto completo de arquivos (.SHP, .SHX, .DBF, .PRJ etc. )?
Michael Stimson
Provavelmente o seu shapefile está corrompido. Salvei um shapefile arbitrário como 1-11-99n.shp e não tive nenhum problema com nenhum dos seus mini scripts com shapely, fiona ou geopandas.
xunilk
3
Sim, o problema era que eu não incluí os outros arquivos shx, dbf etc. que eu precisava. Eu nunca usei arquivos shp antes, então não sabia que era necessário o complemento de arquivos. O nome do arquivo funcionou bem sem precisar ser alterado. Obrigado!
amigos estão dizendo sobre leonard
1
@LeonardShaw Por favor, considere fornecer uma resposta para sua pergunta para que possamos considerá-la resolvida.
Aaron
Para reiterar, é uma violação da especificação shapefile ter um numérico ou hífen à esquerda no nome do arquivo. É uma prática recomendada evitar nomes, o que causará falhas em algumas implementações de leitores de shapefile.
Vince

Respostas:

20

Existe uma armadilha para os usuários iniciantes de shapefiles. O arquivo shapefile real (.shp) é inútil sem os arquivos complementares: .dbf, .shx, .prj etc.

Isso está descrito na especificação técnica shapefile, mas um pouco avançado, o artigo da Esri pode ser mais adequado para uma explicação rápida.

É fundamental que todos os arquivos pertencentes a um shapefile sejam tratados como uma única unidade. Se o shapefile for editado em qualquer estágio, mesmo que apenas as alterações de atributo, os FIDs (identificadores de recurso) são alterados, o que significa que a ordem no arquivo .DBF é alterada. Você deve editar os atributos de um shapefiles e copiar apenas o arquivo .DBF, sobrescrever um arquivo DBF existente as formas irá apontar para as linhas erradas. Sempre copie TODOS os arquivos juntos .

Ao enviar um shapefile por email, Dropbox, Google Drive etc., acho conveniente compactar todos os arquivos em um único arquivo, para que, quando descompactado, todos os arquivos associados apareçam juntos.

Michael Stimson
fonte
1
Para ser mais preciso: .shp, .dbf e .shx são o mínimo absoluto (de acordo com o padrão). O QGIS / OGR permitirá abrir arquivos com um .dbf ausente, mas você não poderá excluir ou editar esses recursos. Você pode, no entanto, usar ogr2ogr para criar o arquivo dbf ausente (com uma tabela de atributos vazia)
LuWi
2
@LuWi até o arquivo .SHX pode ser reconstruído, é o índice espacial, existem algumas ferramentas e opções que podem reconstruir o índice espacial a partir das formas existentes. O número exato de arquivos relacionados varia, mas é sempre melhor manter tudo junto.
Michael Stimson
0

Se o único item que você possui é o arquivo .shp, e você pode ficar sem as outras partes, considere esta solução, abrindo e salvando no OpenJump. /gis//a/306228 Você ainda pode precisar de um arquivo .proj, dependendo da sua finalidade, mas pode conseguir um "padrão" copiado de outro projeto e renomeado para corresponder ao seu shapefile , se isso usar a mesma projeção.

Mark Neal
fonte