Moduł Python do usuwania funkcji SHP (bez zainstalowanego Desktop GIS)

16

Mam oprogramowanie (nie Arc), które działa co noc na nieprodukcyjnej maszynie, która aktualizuje funkcje pliku kształtu z zewnętrznej bazy danych. Okresowo chciałbym usunąć wszystkie funkcje z pliku shapefile (nie sam plik, który musi pozostać) i pozwolić programowi „odbudować” plik shapefile od zera. Chciałbym zautomatyzować ten proces.

Nie mam obecnie zainstalowanego oprogramowania GIS na tym komputerze. Miałem nadzieję, że uda mi się napisać skrypt w Pythonie, który automatycznie usunie funkcje, podobnie jak narzędzie geoprzetwarzania Arc's Delete Features .

Czy są jakieś moduły Pythona, które pozwolą mi to zrobić? Preferujesz oprogramowanie typu open source? Spojrzałem na zgrabną i PyShp ale nie widziałem niczego, co pozwoliłoby mi usunąć funkcje w masie albo że dopasowany do klauzuli WHERE. Mogą pisać funkcje i analizować je, ale nigdzie nie widziały funkcji USUŃ FUNKCJE.

Z pewnością brakuje mi czegoś prostego ...

EDYCJA: Mam 35 folderów (różne zakresy geograficzne, wszystkie we własnej projekcji), z 35-65 plikami kształtów, co daje około 1000 plików kształtów do załatwienia.

RyanKDalton
źródło

Odpowiedzi:

16

Możesz użyć API Pythona GDAL / OGR , kod będzie wyglądał następująco:

from osgeo import ogr

shapefile = ogr.Open( "shapfile.shp",1 )
layer=shapefile.GetLayerByIndex(0)
count=layer.GetFeatureCount()
for feature in range(count):
    layer.DeleteFeature(feature)
Pablo
źródło
DostajęERROR 1: The DeleteFeature() operation is not permitted on a read-only shapefile
Matt Wilkie
4
musisz to otworzyć do pisania. Zrób to za pomocą: ogr.Open ('shapefile.shp', 1)
capooti
12

Linia komendowa ogr2ogr z klauzulą ​​where gwarantującą tworzenie pustych wyników jest jedną szybką i łatwą metodą:

ogr2ogr output.shp input.shp -where "FID < 0"

Strona przeglądu Pythona i OGR (i GDAL) to http://trac.osgeo.org/gdal/wiki/GdalOgrInPython

matowe wilkie
źródło
Podoba mi się ten pomysł. Musiałbym wykonać kilka skryptów w celu usunięcia pliku wejściowego i zmiany nazwy pliku wyjściowego z powrotem na nazwę wejściową, ale mógłbym go uruchomić, jeśli nie zostaną przedstawione żadne inne rozwiązania.
RyanKDalton
1
oto plik wsadowy jedna linia na to: for %%a in (sample.shp) do (ogr2ogr %temp%\xxx.shp %%a -where "FID < 0" && copy %temp%\xxx.* %%~na.*). Odpowiedź Pabla jest jednak bardziej elastyczna.
matt wilkie
11

Możesz to zrobić w pyshp. Jest to proste, ale nie oczywiste, ponieważ nigdy nie przewidziałem tego przypadku użycia. Ale ma to sens w przypadku aplikacji do automatycznych aktualizacji. Przetestowałem następujące 6 wierszy kodu i działało świetnie:

import shapefile
r = shapefile.Reader("myshape")
w = shapefile.Writer(r.shapeType)
# This line will give us the same dbf schema
w.fields = r.fields
# Use the original bounding box as a place holder in the header
w.bbox = lambda: r.bbox
w.save("myshape")

Masz teraz plik kształtu zapisany na oryginale, który ma poprawne nagłówki i oryginalne pola dbf. Otworzy się bezpiecznie w oprogramowaniu GIS i bibliotekach plików kształtów, ale nie ma żadnych funkcji ani rekordów dbf.

Funkcja lambda przenosi oryginalną ramkę ograniczającą jako symbol zastępczy. Możesz umieścić dowolne wartości zmiennoprzecinkowe w tablicy [xmin, ymin, xmax, ymax]. Przykład:

w.bbox = lambda: [0.0, 0.0, 0.0, 0.0]

Zmiana pól dbf jest również prosta i udokumentowana w dokumentach pyshp.

Mam nadzieję, że to pomaga.

GeospatialPython.com
źródło
8

Dlaczego nie zapisać kopii pustego pliku Shapefile i nadpisać interesujący go plik Shapefile.

Klewis
źródło
Jak na ironię, IMHO byłoby to najbardziej wydajne rozwiązanie, o ile schemat niewiele się zmieni ...
Ragi Yaser Burhum
1
Gdyby dotyczyło 1 lub 2 plików, zgodziłbym się. Głównym powodem, dla którego nie byłoby to tak skuteczne, jest to, że mam 35 folderów (różne zakresy geograficzne, wszystkie we własnej projekcji), z 35-65 plikami kształtów. Matematyka mówi, że zarządzanie nimi to ponad 1000 pustych plików kształtów, co również nie jest praktyczne. Ostatecznie mam nadzieję, że skryptuję proces wykrywania plików kształtów i usuwania funkcji.
RyanKDalton
@RyanDalton w Q powiedziałeś „shapefile”, co skłoniło nas, no i mnie, do wymyślenia i opracowania pojedynczego rozwiązania. Nie narzekam, po prostu wskazuję, że więcej informacji na temat przypadku użycia z góry mogło doprowadzić do szybszego udzielenia odpowiedzi.
Matt Wilkie,