Mam skrypt w języku Python, który dodaje pole atrybutu do pliku Shapefile, jeśli nie istnieje. Jest to łatwe do zrobienia w ArcGIS (graficznie lub przez Python), ale szukam czegoś, co nie zależy od ArcGIS.
Próbowałem tego bez powodzenia z OGR, ponieważ mój plik Shapefile zawiera funkcje .
Patrzyłem na pyshp , ale podobnie nie ma sposobu, aby zmodyfikować schemat po jego utworzeniu. Nie próbowałem z shapefile (dla Pythona) , ale nie widzę tej funkcji reklamowanej. Nie widzę też, jak można to zrobić, majstrując przy pliku DBF przez dbfpy .
Czy ktoś ma jakieś pomysły?
Odpowiedzi:
powinieneś rzucić okiem na te pytania, ponieważ już na nie odpowiedziano: Jak dodać niestandardowe atrybuty Feature do Shapefile przy użyciu Pythona?
/programming/4215658/adding-custom-feature-attributes-to-esri-shapefile-with-python
Jeśli chcesz w rezultacie tylko jeden plik kształtu, po prostu usuń pliki wejściowe na końcu skryptu.
źródło
Oto rozwiązanie. Lepiej późno niż wcale:
http://geospatialpython.com/2013/04/add-field-to-existing-shapefile.html?m=1
źródło
Dzięki dość nieprzytomnemu formatowi zwanemu DBF, dodawanie pól do plików kształtów z istniejącymi danymi atrybutów nie jest możliwe bez przepisywania lub dodawania dopełniania do DBF. Nie znam gotowego rozwiązania, ale chciałbym napisać skrypt, aby utworzyć nowy plik shapefile w oparciu o istniejący i dodać dodatkowe pola do nowego pliku shapefile. Następnie skopiuj dane geometrii / atrybutu ze starego do nowego pliku kształtu. Na koniec usuń stary plik kształtu i zmień nazwę nowego. Wszystko to można dość łatwo osiągnąć za pomocą powiązań pytona OGR.
Alternatywnie możesz użyć dbfpy, aby wykonać powyższe czynności tylko za pomocą pliku DBF. Kolejność kroków pozostaje taka sama:
Nie musisz wprowadzać żadnych zmian w samym pliku shapefile (.shp) ani w żadnym innym pliku, ponieważ nie odwołują się one do informacji o atrybutach zawartych w DBF. Musisz jednak zachować dokładnie taką samą kolejność rekordów w starym i nowym DBF.
źródło
DBFpy powinien na to działać. Czy widziałeś wtedy przykład na tej stronie:
http://dbfpy.sourceforge.net/
Upewnij się, że plik kształtu nie jest edytowany przez żadną inną aplikację, w tym ArcGIS, ponieważ może to powodować problemy z blokowaniem.
źródło
from dbfpy import dbf; db = dbf.Dbf('my.dbf'); db.addField(("FOO", "C", 15))
Znalazłem rozwiązanie przy użyciu OGR i dzięki pomocy z poprzedniego pytania . Oto kompletny przykład:
Mój problem polegał na tym, że
layer_defn.AddFieldDefn(new_field)
raczej go użyłemlayer.CreateField(new_field)
. Wielkie dzięki za pomoc i przepraszam, że nie sprawdziłem dokładnie tego samego innego pytania.źródło