Konwersja danych z CSV do geometrii przestrzennej

Autor 1 grudnia, 202012 stycznia, 2021Jak to działa w FME, Zrób to sam
fme dane geometryczne

W tym artykule pokażemy, jak przekonwertować dane z pliku CSV na obiekty punktowe, używając wbudowanych parametrów Readera CSV oraz transformatora VertexCreator

Konwersja z CSV do obiektów punktowych, liniowych lub powierzchniowych jest łatwa, o ile w CSV znajdują się dane przestrzenne, takie jak informacje o szerokości i długości geograficznej. Jeśli zamiast współrzędnych w pliku CSV znajdują się adresy, można użyć geokodowania, które opisaliśmy tutaj. Przekonwertujemy również CSV na obiekty liniowe i poligony za pomocą transformatora VertexCreator oraz LineBuilder.

Część 1: obiekty punktowe

Z pliku CSV zawierającego współrzędne stworzymy obiekty punktowe z użyciem dwóch wspomnianych wcześniej sposobów:

  • przez użycie parametrów czytnika,
  • przez użycie VertexCreator.

Aby stworzyć obiekty punktowe, skorzystamy z dwóch wyżej wymienionych metod. Możesz używać zamiennie zarówno metody 1, jak i metody 2. Metoda pierwsza będzie lepsza, jeśli masz już gotowe dane do tworzenia punktów, a metoda druga sprawdzi się, jeśli musisz najpierw wykonać transformację lub weryfikacje danych.

Metoda 1: użycie parametrów Readera

Po otworzeniu FME Desktop i stworzeniu pustego skryptu dodajmy Reader CSV i wybierzmy plik rapid_transit_stations.csv. Ustawmy odpowiedni układ współrzędnych, czyli UTM83-10 oraz wejdźmy w parametry Readera. W obszarze definicja atrybutu (ang. Attribute Dafinition) wybierzmy opcję manualną (ang. Manual). Następnie ustawmy pola x i y (długość i szerokość) na typ danych x/y_coordinate. Zaakceptujmy parametry i ustawienia Readera, żeby dodać wejście danych.

Metoda 2: użycie transformera VertexCreator

Po otworzeniu FME Desktop i stworzeniu pustego skryptu dodajmy Reader CSV i wybierzmy plik rapid_transit_stations.csv. Ustawmy odpowiedni układ współrzędnych, czyli UTM83-10 i zaakceptujmy. Po dodaniu Readera dodajmy transformer VertexCreator, który tworzy punktową reprezentację każdego rekordu przy użyciu wartości X/Y/Z lub długość/szerokość/wysokość geograficzna zapisanych w atrybutach. Każdy element punktowy zachowuje wszystkie atrybuty oryginalnego elementu niegeometrycznego.

Wejdźmy w parametry funkcji i upewnijmy się, że tryb (ang. mode) jest ustawiony na dodawanie nowych punktów (ang. add point) oraz uzupełnijmy parametry X Value i Y Value wskazując atrybuty x i y.

Część 2: obiekty liniowe

Uzyskanie cech linii to proces dwuetapowy. W obszarze roboczym dodajmy Reader CSV i plik rapid_transit_lines.csv. Następnie ustawmy odpowiedni układ współrzędnych, czyli UTM83-10. Później należy stworzyć punkty, postępując zgodnie z metodą 1 lub 2 opisaną w części 1: obiekty punktowe.

Kiedy mamy już obiekty punktowe, dodajmy transformer LineBuilder oraz połączmy go z Readerem CSV lub transformerem VertexCreator, w zależności od wybranej metody uzyskania punktów. Wejdźmy w parametry funkcji LineBuilder i ustawmy atrybut Group By na LINE. Informuje to funkcję, aby przestała łączyć punkty, gdy zmieni się atrybut LINE. W tym przykładzie pojawią się trzy różne linie.

Jeśli nie powstają wiersze zgodne z oczekiwaniami, konieczne będzie posortowanie punktów według określonego atrybutu z użyciem transformera Tester. Dzieje się tak, ponieważ FME łączy punkty w linie w dokładnie takiej kolejności jak obiekty punktowe wchodzą do funkcji LineBuilder.

Tak wygląda skrypt, w którym użyliśmy metody 2 do stworzenia punktów (w funkcji VertexCreator) a następnie połączyliśmy je w linie (funkcją LineBuilder):

Oto wynikowe linie:

Część 3: obiekty powierzchniowe (poligony)

Aby uzyskać elementy wielokątne, dodamy kolejny krok do metody tworzenia linii, czyli połączenia linii. Do pustego skryptu dodajmy Reader CSV dla pliku NeighborhoodNames.csv oraz ustawmy układ współrzędnych LL84. Następnie postępujmy zgodnie z metodą 1 lub 2 opisaną w części 1, aby uzyskać obiekty punktowe. W kolejnym kroku – tak jak w części 2 – dodajmy transformer LineBuilder, aby zbudować linie z posiadanych punktów. Wejdźmy w parametry LineBuilder, a następnie ustawmy parametr Group By na atrybut NeighbourhoodName. W naszym zbiorze ostatni punkt jest taki sam jak pierwszy – funkcja automatycznie tworzy wtedy wielokąt.

Tak wygląda skrypt, w którym użyliśmy metody 2 do stworzenia punktów (w funkcji VertexCreator), a następnie połączyliśmy je w poligony (funkcją LineBuilder):

Oto, jak wyglądają powstałe poligony: