Python nie może odczytać pliku kształtu

11

Próbuję otworzyć plik kształtu za pomocą notatnika Jupyter, ale nie mogę go otworzyć. Plik shapefile znajduje się w tym samym folderze co mój skoroszyt, a Python nie może go zidentyfikować, nawet jeśli użyję pełnej ścieżki.

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.

Otwieranie go za pomocą Fiona i geopandów też nie działa.

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

i

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

oba kończą się na

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'

Wiem, że może to być trywialny problem, ale jestem nowy w używaniu plików kształtów i przestrzennych bibliotek Pythona, więc tak naprawdę nie wiem, jak obejść ten problem.

Leonard Shaw
źródło
wymienić minus znaku podkreślenia i spróbuj ponownie .. Nazwy Shapefile mają zawierać litery, cyfry i znaki podkreślenia tylko . Dobrym pomysłem byłoby również zacząć nazwę od litery. Jeśli problem będzie się powtarzał, plik shapef prawdopodobnie jest uszkodzony lub brakuje pliku .SHX. Czy masz tylko plik .SHP lub pełny zestaw plików (.SHP, .SHX, .DBF, .PRJ itp.) )?
Michael Stimson,
Prawdopodobnie twój plik kształtu jest uszkodzony. Zapisuję jeden arbitralny plik kształtu jako 1-11-99n.shp i nie miałem problemu z żadnym z twoich mini skryptów z foremną, fiona lub geopandą.
xunilk,
3
Tak, problem polegał na tym, że nie dołączałem innych potrzebnych plików shx, dbf itp. Nigdy wcześniej nie korzystałem z plików shp, więc nie wiedziałem, że wymaga to uzupełnienia plików. Nazwa pliku działała dobrze bez konieczności zmiany. Dzięki!
Leonard Shaw
1
@ LeonardShaw Rozważ podanie odpowiedzi na swoje pytanie, abyśmy mogli uznać to pytanie za rozwiązane.
Aaron
Powtórzmy, że naruszeniem specyfikacji pliku shapefile jest posiadanie wiodącej liczby lub myślnika w nazwie pliku. Najlepszą praktyką jest unikanie nazewnictwa, które spowoduje awarie w niektórych implementacjach czytników plików kształtów.
Vince

Odpowiedzi:

20

Istnieje pułapka dla użytkowników plików kształtu po raz pierwszy. Rzeczywisty plik kształtów (.shp) jest bezużyteczny bez plików towarzyszących: .dbf, .shx, .prj itp.

Jest to opisane w specyfikacji technicznej pliku kształtu, ale jest to nieco zaawansowane, artykuł Esri może być bardziej odpowiedni do szybkiego wyjaśnienia.

Bardzo ważne jest, aby wszystkie pliki należące do pliku kształtu były traktowane jako pojedyncza jednostka. Jeśli plik shapefile jest edytowany na dowolnym etapie, nawet po prostu zmiany atrybutów, zmieniają się identyfikatory FID (identyfikatory funkcji), co oznacza zmianę kolejności w pliku .DBF. Jeśli edytujesz atrybuty pliku shapefile i kopiujesz tylko plik .DBF, nadpisując istniejący plik .DBF, kształty będą wskazywać niewłaściwe wiersze. Zawsze kopiuj WSZYSTKIE pliki razem .

Wysyłając plik kształtu przez e-mail, Dropbox, Dysk Google itp. Uważam za celowe skompresowanie wszystkich plików do jednego archiwum, aby po rozpakowaniu wszystkie powiązane pliki pojawiały się razem.

Michael Stimson
źródło
1
Mówiąc dokładniej: .shp, .dbf i .shx są absolutnym minimum (zgodnie ze standardem). QGIS / OGR pozwoli ci otwierać pliki z brakującym plikiem .dbf, ale nie będziesz w stanie usunąć ani edytować tych funkcji. Możesz jednak użyć ogr2ogr, aby utworzyć brakujący plik dbf (z pustą tabelą atrybutów)
LuWi
2
@LuWi nawet plik .SHX można odbudować, jest to indeks przestrzenny, istnieje kilka narzędzi i opcji, które mogą odbudować indeks przestrzenny z istniejących kształtów. Dokładna liczba powiązanych plików jest różna, ale zawsze najlepiej jest trzymać wszystko razem.
Michael Stimson,
0

Jeśli jedynym elementem, który masz, jest plik .shp i możesz obejść się bez innych części, rozważ to rozwiązanie, otwieranie i zapisywanie z OpenJump. https://gis.stackexchange.com/a/306228 Nadal możesz potrzebować pliku .proj, w zależności od celu, ale możesz być w stanie uciec od „standardowego” pliku skopiowanego z innego projektu i przemianowanego tak, aby pasował do twojego pliku kształtu , jeśli korzysta z tej samej projekcji.

Mark Neal
źródło