Obliczanie procentowego udziału wód powierzchniowych w wybranym obszarze całkowitym

By Listopad 12, 2020 Jak to działa w FME, Zrób to sam
Obliczanie obszaru wód w FME
W kolejnym ćwiczeniu z serii „Jak to zrobić w FME” pokażemy, jak obliczyć procent udziału wód powierzchniowych w wybranym obszarze całkowitym. Jako obszar analizy wybraliśmy powiat piski w województwie warmińsko-mazurskim.

Skąd pobrać dane?

W ćwiczeniu skorzystaliśmy z darmowych danych BDOT 10k, udostępnionych na Geoportalu. Dane pobraliśmy, korzystając z naszego case study. Aby jednak polepszyć przejrzystość skryptu, wykorzystywanego w tym ćwiczeniu, dane pobrane z BDOT 10k zostały zapisane lokalnie w formacie GML, a następnie wczytane do nowego workspace.

Instrukcje do ćwiczenia

1. Uruchomienie FME Workbench i stworzenie nowego obszaru roboczego

Otwórzmy FME Workbench, a następnie w sekcji Create Workspace wybierzmy opcję New.

1_CreateWorkspace

2. Dodanie danych wejściowych

Dodajmy dwa adaptery czytające – readery, który umożliwią wczytanie pobranych danych. Na początek wczytajmy warstwę z wodami powierzchniowymi, czyli plik PTWP_A. Jako format wybierzmy GML (Geography Markup Language) i wejdźmy w parametry. W podgrupie GML SRS/Geometry Parametrs ustawmy parametr GML SRS Axis Order jako 1,2. Opisuje on kolejność osi. Dzięki takiemu ustawieniu dane zostaną odczytane w odpowiedni sposób. Bez ustawienia parametru uzyskalibyśmy dane z zamienioną osią x i y. Błędne przypisanie osi łatwo zauważyć, wyświetlając dane w FME Data Inspector – byłyby one przekręcone o 90 stopni.

2_AddReader

Następnie zaakceptujmy okno parametrów i okno readera. Pojawi nam się okno wyboru feature type, czyli warstwy. Wynika to ze sposobu zapisu danych w formacie GML. Wybierzmy tę samą warstwę co wczytywany przez nas plik, czyli w tym wypadku PTWP_A.

Do zadania potrzebny będzie również drugi plik z granicami administracyjnymi, czyli warstwa ADJA. Aby dodać tę warstwę, należy postępować analogicznie jak w przypadku danych opisanych powyżej. Różnica jest tylko jedna: teraz należy wczytać warstwę ADJA.

3. Przefiltrowanie danych z granicami administracyjnymi

Na warstwie z danymi administracyjnymi znajduje się kilka rodzajów granic. Nas interesuje jedynie granica powiatu, należy zatem przefiltrować dane. Po analizie danych wejściowych i ich specyfikacji w bazie BDOT 10k możemy stwierdzić, że granice powiatów w atrybucie x_kod mają wartość ADJA_01.

3_Tester

Do przefiltrowania danych użyjmy funkcji Tester. Dodajmy transformer, podłączmy go do danych granic administracyjnych i wejdźmy w jego ustawienia. Zdefiniujmy, że wartość atrybutu x_kod (lewa wartość) musi się równać (operator =) wartości „ADJA01” (prawa wartość).

4. Obliczenie powierzchni

Nasze ćwiczenie polega na wyznaczeniu procentowego udziału wód powierzchniowych w całkowitej powierzchni powiatu. Potrzebujemy więc zarówno informacji o powierzchni powiatu, jak i powierzchni wód. Możemy je wyznaczyć przy użyciu transformera AreaCalculator. Dodajmy do skryptu dwie takie funkcje. Pierwszą podepnijmy do testera filtrującego granice administracyjne i wejdźmy w ustawienia funkcji. W ustawieniach zmieńmy nazwę (parametr Area Attribute) tworzonego atrybutu, np. na pow_powiat oraz jednostkę, w jakiej powierzchnia będzie liczona na km2. FME automatycznie liczy powierzchnię w jednostce, w jakiej są dane (co można sprawdzić w prawym dolnym rogu w FME Data Inspector). Nasze dane są zapisane w metrach, dlatego jeśli chcemy obliczyć powierzchnię w km2, musimy pomnożyć wartość przez 0.00001 (wartość atrybutu Multiplier).

4_AreaCalculator

Drugą funkcję AreaCalculator należy:

  • połączyć z warstwą wód powierzchniowych, czyli PTWP
  • wejść w ustawienia funkcji
  • zmienić nazwę tworzonego atrybutu na pow_woda
  • ustawić wartość atrybutu Multiplier tak jak w przypadku granic administracyjnych – na 0.00001

5. Sumowanie danych o wodach powierzchniowych

Ze względu na charakter powiatu w zbiorze danych o wodach powierzchniowych znajduje się duża liczba obiektów z atrybutem opisujących ich powierzchnię. Aby uzyskać założony cel ćwiczenia, potrzebujemy sumy wszystkich wód powierzchniowych w powiecie. Użyjemy do tego funkcji Aggregator, która służy do łączenia obiektów. Dodajmy do skryptu funkcję i połączmy ją z funkcją AreaCalculator, która dotyczy wód powierzchniowych. Następnie wejdźmy w ustawienia, aby sprecyzować, który z atrybutów ma być sumowany. Definiujemy to w parametrze Attributes to Sum i wybieramy atrybut pow_woda. Dzięki temu uzyskamy wody powierzchniowe zagregowane w jeden obiekt, połączony ze zsumowaną całkowitą powierzchnią.

5_Aggregator

Ze względu na charakter powiatu w zbiorze danych o wodach powierzchniowych znajduje się duża liczba obiektów z atrybutem opisujących ich powierzchnię. Aby uzyskać założony cel ćwiczenia, potrzebna będzie suma wszystkich wód powierzchniowych w powiecie. Użyjemy do tego funkcji Aggregator, która służy do łączenia obiektów. Dodajmy do skryptu funkcję i połączmy ją z funkcją AreaCalculator, która dotyczy wód powierzchniowych. Następnie wejdźmy w ustawienia, aby sprecyzować, który z atrybutów ma być sumowany. Definiujemy to w parametrze Attributes to Sum i wybieramy atrybut pow_woda. Dzięki temu uzyskamy wody powierzchniowe zagregowane w jeden obiekt, połączony ze zsumowaną całkowitą powierzchnią.

6. Połączenie obiektów

Na tym etapie powinniśmy już mieć jeden obiekt reprezentujący granice powiatu i drugi reprezentujący wszystkie wody powierzchniowe. W dalszym etapie ćwiczenia połączymy te dane. Można to zrobić na kilka sposobów, ale w tym ćwiczeniu użyjemy transformera SpatialFilter, który łączy dane na podstawie ich położenia. Dodajmy tę funkcję i połączmy ją z ostatnimi portami output z transformerów Aggregator i AreaCalculator. Dane z granicami administracyjnymi podepnijmy do portu candidate, a dane o wodach powierzchniowych do filter. Dzięki temu uzyskamy obiekt reprezentujący powiat z dodaną informacją o powierzchni wód. Możemy wejść do szczegółów funkcji, aby zobaczyć, jakie daje nam możliwości – ale zostawiamy domyślne ustawienia.

6_SpatialFilter

7. Policzenie procentowego udziału wód powierzchniowych

Dane zostały już połączone. W kolejnych krokach obliczmy zatem interesujący nas współczynnik. W tym celu dodajmy funkcję AttributeCreator, podłączmy do portu wyjściowego Passed funkcji SpatialFilter i wejdźmy w ustawienia. Wpiszmy nazwę nowego atrybutu i wejdźmy w edytor tekstowy, aby wpisać formułę, na podstawie której będzie liczona wartość współczynnika. Wartości i funkcje możemy wpisywać ręcznie w edytorze lub wybierać je z listy znajdującej się po prawej stronie. Jeśli nie jesteśmy pewni, do czego możemy użyć danej funkcji i jakie działania wykonuje, skorzystajmy z opcji Help, gdzie szczegółowo opisane są wszystkie funkcje dostępne w edytorze.

W pierwszej kolejności musimy podzielić powierzchnię wód przez powierzchnię powiatu. W tym celu użyjemy funkcji dzielenia – div(). Następnie, aby uzyskać wynik procentowy, całość przemnożymy przez 100 – mult(). Cała formuła powinna wyglądać następująco:
@mult(@div(@Value(pow_woda),@Value(pow_powiat)),100)

7_AttributeCreator

Aby obejrzeć wynik transformacji, dodajmy Inspector i uruchommy proces. Całość skryptu powinna wyglądać następująco:

8_Proces

Na samym końcu możemy dane zapisać do wybranego formatu wyjściowego, np. shapefile. Dane wyjściowe wraz z atrybutami wyglądają tak jak poniżej:

9_Wynik

Aby ułatwić wykonywanie pracy zdalnej oraz wspierać walkę z koronawirusem, Safe Software udostępnia licencję FME całkowicie za darmo.

darmowa licencja FME