Python c.d. pętla for
W poprzednim poście dotyczącym przetwarzania danych w języku Python (Python c.d.n.) pisaliśmy o możliwości wycięcia danych w obrębie granic danego poligonu. Kompletny skrypt wyglądał następująco:
import arcpy from arcpy import env # Zdefiniowanie przestrzeni roboczej env.workspace = "E:/geoprofesja/Python/dane" # Zdefiniowanie zmiennych #Dane wejsciowe dane_wejsciowe1 = "miejscowosci.shp" dane_wejsciowe2 = "obiekty_fizjograficzne.shp" # Warstwa ograniczajaca warstwa_wycinajaca = "gminy" #Dane wynikowe wynik1 = "E:/geoprofesja/Python/miejscowosciCLIP.shp" wynik2 = "E:/geoprofesja/Python/obiekty_fizjograficzneCLIP.shp" # Wykonanie wyciecia arcpy.Clip_analysis(dane_wejsciowe1, warstwa_wycinajaca, wynik1, None) arcpy.Clip_analysis(dane_wejsciowe2, warstwa_wycinajaca, wynik2, None)
Do wycięcia mieliśmy 2 warstwy (miejscowosci.shp oraz obiekty_fizjograficzne.shp), warstwę wycinającą definiują gminy.shp.
Teraz spróbujemy zoptymalizować kod w taki sposób, aby dla każdej warstwy znajdującej się w danej przestrzeni roboczej (czyli w danym folderze na dysku) klip wykonał się automatycznie bez potrzeby każdorazowego definiowania danych wejściowych (tak jak robiliśmy to w skrypcie powyżej dane_wejsciowe1, dane wejsciowe2 oraz danych wynikowych wynik1, wynik2).
import arcpy from arcpy import env import os # Zdefiniowanie przestrzeni roboczej oraz danych na wejscie i wyjscie env.workspace = "E:/geoprofesja/Python/dane" wynik_przestrzenRobocza = "E:/geoprofesja/Python/dane/wynik" warstwa_wycinajaca = "E:/geoprofesja/Python/dane/warstwawycinajaca/gminy.shp" # Petla przez klase obiektow w przestrzeni roboczej for fc in arcpy.ListFeatureClasses(): # Ustawienie nazwy dla plików wynikowych taki samych jak pliki wsadowe output = os.path.join(wynik_przestrzenRobocza, fc) # Wykonanie wyciecia dla kazdej warstwy z wczesniej zdefiniowanej przestrzeni roboczej arcpy.Clip_analysis(fc, warstwa_wycinajaca, output, None)
Przeanalizujmy teraz krok po kroku kod dla nowego skryptu. Już na pierwszy rzut oka widać, że skrypt ten jest nieco krótszy od poprzedniego.
Na początek musimy zaimportować pakiet arcpy oraz env odpowiadający za definiowanie zmiennych środowiskowych. Następnie dla lokalizacji danych na dysku potrzebny jest pakiet os, dzięki któremy python odnajdzie pliki na dysku, do których podamy mu mu szczegółowo ścieżkę.
import arcpy from arcpy import env import os
W kolejnych krokach definiujemy przestrzeń roboczą.
# Zdefiniowanie przestrzeni roboczej oraz danych na wejscie i wyjscie env.workspace = "E:/geoprofesja/Python/dane" wynik_przestrzenRobocza = "E:/geoprofesja/Python/dane/wynik" warstwa_wycinajaca = "E:/geoprofesja/Python/dane/warstwawycinajaca/gminy.shp"
Następnie piszemy pętle for, która przygotuje listę klas obiektów ze zdefiniowanej lokalizacji w danym folderze.
# Petla przez klase obiektow w przestrzeni roboczej for fc in arcpy.ListFeatureClasses(): # Ustawienie nazwy dla plików wynikowych taki samych jak pliki wsadowe output = os.path.join(wynik_przestrzenRobocza, fc)
I na koniec uruchamiamy narzędzie CLIP, które zostanie wykonane dla listy obiektów z danego folderu.
# Wykonanie wyciecia dla kazdej warstwy z wczesniej zdefiniowanej przestrzeni roboczej arcpy.Clip_analysis(fc, warstwa_wycinajaca, output, None)
Spróbujcie przećwiczyć tworzenie listy obiektów w danej lokalizacji oraz uruchomić dla nich inne narzędzie np: buffor.