Ciekawym, ale wymagającym obliczeniowo zadaniem jest tworzenie i praca z referencją liniową. Przykładami takich referencji są np. pikietaż dróg, kilometraż linii kolejowych, czy rzek. Na przykład informacje o lokalizacji przejazdów na sieci kolejowej podawane są w formie tabeli z numerem linii kolejowej i kilometrem osi przejazdu. Możemy się również spotkać z postacią zapisu: od, do. Wtedy z pomocą przychodzą nam narzędzia referencji liniowej. Dziś spróbuję pokazać dwa takie rozwiązania, najprostsze i takie które pozwoli na dalszą rozbudowę.

LRS

Najprostszym, nie wymagającym ani bazy danych, ani szczególnej znajomości języka wyrażeń QGIS jest skorzystanie z wtyczki LRS autorstwa Radima Blazka. Pod adresem można znaleźć https://github.com/blazek/lrs repozytorium z kodem źródłowym wtyczki. Oczywiście można ją również zainstalować bezpośrednio z poziomu managera wtyczek QGIS.

Manager wtyczek QGIS – LRS

Kalibracja

Pierwszym krokiem jest kalibracja zestawu danych liniowych. W tym celu musimy posiadać warstwę liniową z polem atrybutowym trasy, oraz warstwę punktową, w której będą istniały dwa atrybuty opisowe: trasa, oraz wartość kilometrażu.

Przykład atrybutów dla warstwy liniowej

Przykład atrybutów warstwy kalibracyjnej

 

 

 

 

 

Przykład ustawień kalibracji dla warstw liniowej i punktowej pokazanych powyżej możemy zobaczyć na kolejnej ilustracji.

Panel kalibracji

Jeśli wszystkie ustawienia zostaną wprowadzone, możemy klawiszem OK wykonać kalibrację i przechodząc do zakładki Błędy sprawdzić czy wszystkie odcinki zostały poprawnie przypisane, oraz wygenerować warstwę przeglądową z opisem jakości kalibracji. Warto również zwrócić uwagę na ustawienia Max lines snap, oraz Max point distance które pozwalają na wskazanie poziomu tolerancji dopasowania. Kolejne ustawienie Linie równoległe, pozwala wskazać sposób traktowania równolegle przebiegających tras (co przydatne może być np. przy autostradach, etc.) Ostatnie istotne ustawienie kalibracji to Ekstrapolacja – czy referencja liniowa ma być przypisana odcinkom tras pomiędzy punktami kalibracyjnymi, czy również końcowe odcinki, poza położeniem punktu kalibracyjnego również powinny być brane pod uwagę. Pamiętajmy aby po poprawnej kalibracji wskazać nazwę warstwy wynikowej, oraz utworzyć ją przyciskiem Create.

Panel kalibracji – błędy

Kolejnym krokiem jest wykorzystanie pozostałych narzędzi z wtyczki: Zlokalizuj, Zdarzenia i Pomiary.

Zlokalizuj

To podstawowe narzędzie pozwala na wybór obiektu liniowego poprzez jego identyfikator trasy, oraz wartość kilometrażu. Zdarzenia

Kolejne narzędzie pozwala na stworzenie nowej liniowej lub punktowej warstwy wektorowej na podstawie tabeli (np. z arkusza kalkulacyjnego) z wartościami atrybutów trasy i kilometrażu. To narzędzie pozwala na wybór czy nasza tabela zdarzeń ma tylko kilometraż początkowy ( wtedy wynikiem jest punkt), czy również końcowy (linia).

Tabela z opisem zdarzeń

Tabela zdarzeń musi zawierać wartości atrybutów typu integer lub real. Przy otwieraniu arkuszy kalkulacyjnych czasami konwersja dokonana przez QGIS może być nie właściwa i należy wtedy posłużyć się kalkulatorem pól QGIS, wykonując np. wyrażenie to_real(atrybut).

Zdarzenia

Pomiary

Zakładka Pomiary pozwala na skorzystanie z narzędzia odwrotnego do opisanego powyżej. Posiadamy warstwę wektorową, a chcemy pozyskać informację o kilometrażu. Przykładem takiego zadania może być np. zamiana współrzędnych geograficznych na liniowe w przypadku wypadków drogowych. Ustawienia w tym wypadku są jeszcze prostsze, wtyczka wymaga od nas jedynie wskazania warstwy referencyjnej, warstwy punktowej oraz wskazania nazwy tworzonej warstwy z pomiarami. Na ilustracji poniżej zobaczyć można wynik pomiarów, gdzie część obiektów nie posiada informacji, ponieważ przekroczyły próg odległości.

Pomiary

PostGIS

Drugie z rozwiązań to skorzystanie z bazy danych PostgreSQL z nakładką PostGIS. W jej zasobach znajdziemy kilkanaście funkcji które mogą się przydać do wykonania referencji liniowej.

Aby wykonać zadanie zbliżone do tego zaprezentowanego w zakładce Zdarzenia LRS, posiadając tabele liniową lrs.linie, oraz tabelę zdarzeń lrs.profil, wykonujemy następujące zapytanie:

SELECT row_number () OVER () AS _qgisid,
ST_LineSubstring(geom, pocz, kon) AS geom, r, opis
FROM(SELECT l.geometry AS geom,
p.km_p_0/(st_length(l.geometry)/1000) AS pocz,
p.kmk_k_0/(st_length(l.geometry)/1000) AS kon,
p.r as r, p.opis as opis
FROM lrs.linie l, lrs.profil p) foo

Jak widać powyżej, wykorzystujemy tu również podzapytanie, którym dokonujemy niezbędnych konwersji jednostek miary, oraz nadajemy tzw. aliasy dla naszych atrybutów. Co istotne, funkcje przestrzenne PostGIS pracują w oparciu o ułamek długości obiektu, nie zaś o miary absolutne. Dlatego znajdziemy tam dzielenie pola p.km_p_0 przez długość geometrii.

W zapytaniu głównym korzystamy z funkcji ST_LINESUBSTRING( geom::geometry, start::float, end::float).

Drugie z zapytań realizuje zadanie dla geometrii punktowych.

SELECT row_number () OVER () AS _qgisid,
ST_LineInterpolatePoint(geom, point) AS geom, opis
FROM (SELECT l.geometry AS geom,
p.km_punkt/(st_length(l.geometry)/1000) AS pocz,
p.opis as opis FROM lrs.linie l, lrs.punkty p) foo

Zapytanie trzecie rozwiąże nam problem opisany w zakładce Pomiary LRS. Używamy tu jednak funkcji ST_AddMeasure która dodaje typ geometryczny LINESTRINGM. Używa ona trzech argumentów, geometrii, miary punktu początkowego i końcowego.

SELECT row_number () OVER () AS _qgisid,
ST_InterpolatePoint(geom_l, geom_p) AS kilometraz
FROM (SELECT ST_AddMeasure(l.geometry,0,1) AS geom_l,
p.geometry AS geom_pFROM lrs.linie l, lrs.punkty p) foo

Podsumowanie

To nie koniec możliwości. W QGIS przy pomocy Geometry Generatora i wyrażeń takich jak line_locate_point czy line_interpolate_point możemy osiągnąć podobne rezultaty. Ich składnia jest bardzo podobna do tej znanej z PostGIS.

Jeśli szukasz rozwiązania jakiegoś problemu GIS, napisz, pod tym artykułem, lub na Facebook. Być może znajdziemy wygodne rozwiązanie.


tomasznycz

Geograf, kartograf, góral z wyboru