Skip to main content

Przycinanie nieregularnej siatki trójkątów (TIN)

By 14 grudnia, 20202 marca, 2022Jak to działa w FME? / Tips & Tricks FME
przycinanie siatki trójkątów

Przycinanie nieregularnej siatki trójkątów – dowiedz się, jak to zrobić w FME 🙂 Nieregularna siatka trójkątów (TIN) służy do przechowywania informacji o powierzchni terenu. Jest to siatka (ang. mesh) zbudowana z trójkątów, które nie nachodzą na siebie. Ich wierzchołki przechowują informację o współrzędnych punktu (szerokość i długość geometryczna oraz wysokość).

W poniższym przykładzie stworzymy siatkę trójkątów z rastra NMT, czyli rastra z numerycznym modelem terenu (raster o godle M-34-101-A-c-1-1 został pobrany z geoportalu). Celem działania jest uproszczenie modelu, zmniejszenie rozmiaru danych oraz przygotowanie do wizualizacji. Po wygenerowaniu TIN przytniemy go, używając poligonu (dane niezbędne do wykonania zadania można pobrać tutaj).

1. Wczytanie NMT

W pustym obszarze roboczym dodajmy Readera, jako format danych wybierz Esri ASCII GRID, podajmy układ współrzędnych – EPSG:2180 i wczytajmy pobrany raster. Możemy też wcześniej otworzyć go w przeglądarce FME Data Inspector, aby zobaczyć jego specyfikację i wygląd.

wczytaj NMT

2. Utworzenie TIN z rastra za pomocą TINGenerator

Aby utworzyć TIN z rastra, musimy użyć transformatora TINGenerator. Dodajmy go do skryptu i do portu wejściowego Punkty i Linie z funkcji TINGenerator. Podłączmy Reader rastra DEM. Wejdźmy w ustawienia i ustawmy parametr Tolerancja Powierzchni na 5. Parametr ten określa liczbę punktów używanych jako wierzchołki modelu powierzchni. Im mniejsza wartość, tym mniej punktów zostanie odrzuconych. Przy wartości 0 użyte zostaną wszystkie wejściowe punkty. Im wyższa wartość, tym więcej punktów wejściowych odfiltrujemy.

TINgenerator

3. Wczytanie obszaru przycinającego

Użyjmy poligonu jako naszej granicy tnącej. Dodajmy Reader, zdefiniujmy format Shapefile, układ współrzędnych EPSG:2180 i wskażmy plik clip.shp. Ten poligon to tylko losowo wygenerowany wielokąt, aby zademonstrować przykład.

obszar przycinający

4. Naciągnięcie poligonu do powierzchni TIN

Funkcji SurfaceDraper użyjemy do naciągnięcia wielokąta na nasz Numeryczny Model Pokrycia Terenu. Zrobimy to przy pomocy triangulacji Delaunay. Każdy wierzchołek poligonu dostanie wyinterpolowaną wartość wysokości, czyli współrzędną Z. Dodajmy transformer SurfaceDraper do skryptu i podłączmy wczytany wcześniej poligon do portu wejściowego DrapeFeatures. Do portu wejściowego Points/Lines podłączmy wygenerowany TIN, czyli dane z portu wyjściowego TINSurface funkcji TINGenerator. W parametrach transformera SurfaceDraper ustawmy wartość Surface Tolerance na 5, ponieważ dobrze jest mieć taką samą wartość Surface Tolerance jak w funkcji TINGenerator.

5. Przycięcie nieregularnej siatki trójkątów

Dodajmy funkcję Clipper do skryptu. Podłączmy port wyjściowy Triangles transformera TINGenerator do portu wejściowego Clippee w funkcji Clipper. Następnym krokiem będzie podłączenie portu wyjściowego DrapedFeatures funkcji SurfaceDraper do portu wejściowego Clipper w funkcji Clipper. Efektem będzie przycięcie trójkątów utworzonych w transformerze TINGenerator z udrapowaną granicą wielokąta.

Nie musisz dodatkowo zmieniać ustawień funkcji Clipper – wszystkie jej parametry zostawiamy jako domyślne. Opisaną dotychczas część skryptu umieszczono na zrzucie ekranu poniżej.

Jeśli w widoku 3D podejrzymy dane wynikowe z portu Inside funkcji Clipper, powinny wyglądać tak:

6. Zgrupowanie przyciętych trójkątów TIN – powstanie obiektu Multi-Surface

Teraz użyjemy zestawu transformerów, aby połączyć wiele trójkątów w jeden obiekt wielopowierzchniowy. Stwórzmy zatem geometrię pojedynczej siatki trójkątów TIN. Dodajmy funkcję FaceReplacer do skryptu i podłączmy ją do portu wyjściowego Inside w funkcji Clipper. Funkcja ta zmieni pojedynczy trójkąt na powierzchnię. Następnie podłączmy transformer Aggregator do portu wyjściowego funkcji FaceReplacer. Ta funkcja połączy wiele powierzchni w jeden obiekt wielopowierzchniowy, czyli Multi-Surface. W obu transformerach możemy użyć ustawień domyślnych.

7. Przekształcenie obiektu Multi-Surface w siatkę

Siatka jest wydajniejszą reprezentacją od obiektu wielopowierzchniowego. Użyjmy więc funkcji Triangulator, aby przekształcić obiekt wielopowierzchniowy w siatkę przez ponowną triangulację. Dodajmy transformer Triangulator do skryptu i podłączmy go do portu wyjściowego funkcji Aggregator. Następnie dodajmy transformer MeshMerger i podłączmy go do portu wyjściowego TINSurface w transformerze Triangulator. Dzięki temu zgrupujemy obiekty w jedną siatkę.

8. Uruchomienie skryptu

Po funkcji MeshMerger dodajmy Inspector i uruchommy skrypt. Jeśli użyjemy opcji Orbit z menu górnego FME Data Inspectora, będziemy mogli obejrzeć wyniki.

Dodatkowe informacje

W FME Hub możesz pobrać transformator SurfaceClipper, którego używamy do przycięcia powierzchni lub siatki za pomocą granicy wielokąta 2D. Przycięcie jest wykonywane z dwuwymiarowej perspektywy przez wyciągnięcie wielokąta w górę i w dół, a zatem najlepsze rezultaty uzyskamy na powierzchniach poziomych. Wszelkie tekstury na powierzchni zostaną zachowane.