Stawiamy sobie za cel obliczenie liczby platów poligonowych klasy geologia_litostratygrafia, przypadajacych na kazde oczko klasy siatka (Fig. 3).
UWAGA!
Dlaczego mowa o płatach, a nie prościej o poligonach? Już tłumaczę:
Aby dokonać niezbędnych obliczeń będziemy musieli skorzystać z narzędzia: Aggregation, a także wykorzystać odpowiednio zbudowany atrybut funkcyjny. Aby skorzystac z agregacji, musimy wcześniej dokonac przypisania poligonów do odpowiednich oczek siatki. Dokonamy tego wykorzystując narzędzie Spartial Intersection. Narzędzie to wyznaczy nam intersekcje (efekt nałożenia dwóch poligonowych klas na siebie). Klasa wydzieleń geologicznych zostanie podzielona na n kwadratów, identycznych z poligonami klasy siatka. Każdy poligon klasy geologia_litostratygrafia otrzyma dodatkowy atrybut określający, do którego z oczek siatki został przypisany (w którym oczku siatki jest położony).
No dobrze, ale co się stanie z dużymi poligonami, które zostały rozdzielone, i w obrebie jednego oczka siatki występuja w dwóch bądź większej liczbie fragmentów np: jedno wydzielenie rozdzielone w obrębie jednego oczka osadami dolinnymi (Fig. 4)?
Przed dokonaniem intersekcji, stanowiły one jedna całość, w związku z czym posiadały jeden identyfikator ID. Po dokonaniu intersekcji, zostały rozdzielone granicami klasy siatka. Doszło więc do ich podzielenia na mniejsze fragmenty, które dalej nazywam płatami. Płaty, pomimo tego, że nie stykają się ze sobą, ciągle posiadają ten sam ID odziedziczony po swoim rodzicu, z którego zostały wydzielone.
Gdybyśmy prowadzili dalsze obliczenia, bez dodatkowych poprawek i utworzyli w module Aggregation atrybut funkcyjny w postaci
COUNT(Detail.IntersectionGeometry)
otrzymamy liczby poligonów oparte na geometrii czyli ID. W ten sposób ich liczba będzie równa bądź niższa od rzeczywistej liczby platów (w naszym przypadku powyższy atrybut funkcyjny zwróciłby liczbę: 4 bo płaty 1 i 4 są częściami jednego obiektu). Ten problem należy rozwiązać.
ROZWIĄZANIE:
W oknie dialogowym Feature Class, otwieramy kolejno klasę punktów (np: geologia_litostratygrafia) i klasę siatki (np: siatka) i zmieniamy mazwy ich kluczy podstawowych na intuicyjne, kolejno: ID_geologia_litostratygrafia oraz ID_siatka. Krok ten nie jest konieczny ale ułatwi nam późniejsze prace.
Obliczamy iloczyn przestrzenny Spartial intersection klasy wydzielen geologicznych (geologia_litostratygrafia) i klasy siatki (siatka) (zapytanie wynikowe: geol_lito_siatka). Każdy z wydzielen geologicznych otrzymuje w ten sposób dodatkowy atrybut opisujący jego położenie względem oczek siatki (ID_siatka).
W oknie dialogowym Tools->Generate Base Geometry, tworzymy zapytanie, które uprości geometrię zapytania geol_lito_siatka do pojedynczych obiektów. Należy wybrać typ topologii dla generowanego zapytania - w tym przypadku "Face" (Fig. 5).
Jeżeli w wyniku operacji Generate Base Geometry, zwrócone zostały poligony oraz punkty przecięcia będące efektem wcześniejszej operacji Spartial Intersection. Musimy teraz pozbyć się punktów i utworzyć zapytanie dające w efekcie wyłącznie obiekty o geometrii powierzchniowej
Otwiieramy okno: Analysis->Functional Atributes i przy pomocy utworzonego atrybutu:
FILTERAREAL(Input.IntersectionGeometry)
tworzymy zapytanie o poligony (geol_lito_siatka_BaseGeometry). W wyniku jego działania otrzymujemy zapytanie złożone wyłącznie z obiektów poligonowych (Fig. 6)
Fig. 6. Dwa osobne poligony utworzone z rozłączenia płatów poligonu pierwotnego
Za pomoca polecenia Aggregation, dla każdego okna siatki, dokonujemy obliczeń liczby wszystkich płatów (poligonów). Aggregate to summary features in: siatka; From detail features in: geol_lito_siatka_BaseGeometry; Spartial Aggregation: touch; Attribute Aggregation Id_siatka/Id_siatka; Output: NEW.
Tworzymy atrybut funkcyjny dla każdego okna siatki obliczający liczbę wszystich płatów (nazwa: L_platow):
COUNT(Detail.IntersectionGeometry)
W wyniku uruchomienia utworzonego zapytania otrzymujemy siatkę, w którego atrybutach odnajdziemy L_platow (Fig. 7).
Fig. 7. Liczba płatów obliczona dla wybranego oczka siatki