Mam garść około 1000 plików kształtu, które są uszkodzone (patrz załączony komunikat o błędzie). Pliki kształtów zostały wygenerowane z eCognition Developer 8. Istnieje narzędzie skryptowe, które wydaje się naprawiać plik kształtowy po zidentyfikowaniu go jako uszkodzony.
Edytować:
Chcę utworzyć szybki skrypt do przeglądania wszystkich moich plików kształtów i sprawdzania, czy liczba kształtów pasuje do rekordów tabeli. Mogę zliczyć rekordy tabeli, korzystając z następujących czynności:
# 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
W końcu chciałbym stworzyć pewnego rodzaju kontrolę logiczną, taką jak:
if result_dbf = result_shp:
pass
else:
print "There is a problem with" + str(Sample)
Jak mogę liczyć kształty bezpośrednio bez dostępu do pliku .dbf? Lub innymi słowy, jaki jest najlepszy sposób programowo sprawdzić, czy liczba kształtów odpowiada liczbie rekordów tabeli?
Odpowiedzi:
Co z używaniem pyshp ? Zainstalowałem go z pipem, a to, co próbowałem poniżej, jest prawie całkowicie z README :
Niestety (a może na szczęście?) Nie mam żadnych podpartych plików shapefile do sprawdzenia, czy nie. kształtów może! = nie. zapisów.
Poczekaj chwilkę, dzięki pomysłowi Kirka w poniższych komentarzach mam teraz powiększony plik kształtów. Utworzyłem kopię zapasową pliku dbf, utworzyłem kopię całego pliku shapefile, usunąłem niektóre funkcje, a następnie zmieniłem nazwę kopii zapasowej pliku dbf z powrotem na oryginał i oto liczba kształtów <liczba rekordów:
źródło
Z brzmienia twojego pytania wydaje się, że wszystko, co naprawdę chcesz zrobić, to ustalić, czy plik kształtu ma z nim problemy (w tym przypadku niezgodne rekordy). Jeśli potrzebujesz tylko zidentyfikować osoby z problemami, tak naprawdę nie musisz zliczać rekordów w pliku DBF i Shapefile, aby ustalić, czy jest to błąd. Dlatego:
Jeśli spróbujesz uruchomić funkcję GetCount na pliku shapefile, który ma różne liczby rekordów, błąd zakończy się niepowodzeniem:
Ponieważ funkcja GetCount kończy się niepowodzeniem w tym scenariuszu, a wszystko, co chcesz zrobić, to zidentyfikować pliki kształtu w wyniku błędu, możesz to złapać za pomocą klauzuli try / wyjątek w kodzie, zamiast tego, czy wcześniej próbowałeś użyć.
Pozwoliłem sobie na dodanie kodu i pętli „List FeatureClasses”, abyś mógł przetestować wszystkie FC w swoim obszarze roboczym bez konieczności ręcznego testowania każdego z nich.
źródło
Format pliku shapefile jest udokumentowany. Zgaduję, że liczba rekordów w pliku shp nie odpowiada liczbie rekordów w pliku dbf.
Format pliku shp jest tutaj udokumentowany . Możesz napisać program zliczający liczbę kształtów. Format dbf jest udokumentowany w wielu miejscach i powinieneś być w stanie znaleźć próbki do zliczania wierszy, np . Tutaj .
źródło
Załączony skrypt przechodzi przez katalog i sprawdza, czy liczba kształtów odpowiada liczbie rekordów dla każdego pliku kształtu.
źródło
Korzystanie z geometrii czeku powinno przejść przez pierwszy krok. Geometria naprawy
Onus pozwoli ci wybrać kolejność i priorytet problemu, który chcesz naprawić. oto kilka innych starszych wersji linków . Po uruchomieniu programu do sprawdzania plików shapefile zakończysz przebudowywanie dbf? To jest krok, który tworzy rekordy, które pasują. Wystąpiła jedna z dwóch rzeczy, które spowodowały błąd.
Może to powodować kilka rzeczy.
Shx to tak naprawdę indeks między nimi.
Liczenie kształtów bez liczenia rekordów dbf to tylko połowa rozwiązania.
źródło
Patrząc na artykuł w Wikipedii na temat plików kształtów , plik .shx powinien zawierać indeks pliku .shp, a nie pliku .dbf. Może więc być konieczne sprawdzenie, czy .shx i .shp pasują do siebie.
Możliwe jest otwarcie pliku shapefile bez pliku .dbf (co oznacza, że nie masz tabeli atrybutów), ale uszkodzony indeks wygeneruje komunikat o błędzie.
źródło