Przestrzenne bazy danych Analizy przestrzenne
Przykładowe analizy przestrzenne Analiza bliskości obiektów Etykietowanie danych Rzutowanie punktów do najbliższych linii Rozdzielanie linii i łączenie obiektów w linie Rozdzielanie i łączenie poligonów Zmienianie, skalowanie i obracanie obiektów geometrycznych Analizy sieciowe Analizy w oparciu o zewnętrzne języki skryptowe np. Python, R Analizy rastra
Analiza bliskości: najbliższe sąsiedztwo Relację najbliższego sąsiedztwa realizuje funkcja ST_DWithin Funkcja ST_DWithin zastępuje funkcję ST_Intersects wtedy gdy obiekty są blisko siebie ale nie przecinają się SELECT ST_DWithin( ST_GeomFromText('LINESTRING(1 2, 3 4)'), ST_Point(3.00001,4.000001), 0.0001 );
Wyszukiwanie najbliższych obiektów w podanym zasięgu select pois.name, ST_Distance(budynki.geom,pois.geom)::numeric(6,2) as dist from budynki inner join pois on ST_DWithin(budynki.geom, pois.geom,500) where budynki.name='poznań Główny' and pois.fclass='bicycle_rental' order by dist asc
Metoda KNN (K Nearest Neigbor) <#> operator odległości obwiedni KNN A <#> B zawraca minimalną odległość między obwiedniami obiektów <-> operator odległości centroidy obwiedni KNN A <-> B zwraca odległość między centroidami obwiedni obiektów
Wyszukiwanie N najbliższych obiektów przy użyciu KNN select pois.name, ST_Distance(budynki.geom,pois.geom)::numeric(10,2) as dist from budynki cross join pois where budynki.name='poznań Główny' and pois.fclass='bicycle_rental' order by budynki.geom <-> pois.geom asc limit 6
Generowanie losowych danych Utworzenie tabeli do przechowywania losowych danych:
Generowanie losowych danych Wstawienie zbioru losowych danych
Usuwanie zbędnych danych
Etykietowanie danych W efekcie każdy punkt otrzymuje dodatkowe etykiety województwa
Przyciąganie punktów do najbliższych linii Wyznaczanie najbliższych punktów na linii przy pomocy funkcji ST_LineInterpolatePoint(lina, ST_LocatePoint(linia,punkt))
Przyciąganie punktów do najbliższych linii Obliczanie szerokości plaży na podstawie dwóch linii (wody i podstawy wydmy) i punktu kilometrażu przy pomocy funkcji ST_ClosestPoint (linia, punkt)
Tworzenie linii z punktów gps: ST_MakeLine
Rozdzielanie wielolinii na mniejsze segmenty
Analiza poligonów Tworzenie multipoligonu z wielu multipoligonów Funkcje ST_Multi i ST_Union
Analiza poligonów Rozdzielanie poligonów ST_SymDifference i ST_Dump
Skalowanie obiektów ST_Scale
Analiza sieciowa - algorytmy rozszerzenia pgrouting Najkrótsza droga (algorytm Dijkstra) Problem komiwojażera (TSP - ang. travelling salesman problem) Wyznaczanie isochron i inne przykłady: http://planet.qgis.org/planet/tag/pgrouting/ http://workshop.pgrouting.org/
Aktualizacja rozszerzeń CREATE EXTENSION postgis; ALTER EXTENSION postgis UPDATE TO "2.3.0"; CREATE EXTENSION pgrouting; ALTER EXTENSION pgrouting UPDATE TO "2.3.0";
PgRouting przygotowanie danych do analizy sieciowej --Do tabeli z siecią dróg dodać specjalne kolumny source, target i length: ALTER TABLE blok_2.drogi ADD COLUMN source integer; ALTER TABLE blok_2.drogi ADD COLUMN target integer; ALTER TABLE blok_2.drogi ADD COLUMN length double precision; --Załadować dane do kolumn sorce i target: SELECT pgr_createtopology('blok_2.drogi', 0.00001, 'geom_d', 'id_d'); --Wyliczyć długości odcinków UPDATE blok_2.drogi SET length = ST_Length(geom_d); ALTER TABLE blok_2.drogi ADD COLUMN reverse_cost double precision; UPDATE blok_2.drogi SET reverse_cost = length;
Kontrola topologii sieci SELECT pgr_analyzegraph('blok_2.drogi', 0.00001,'geom_d','id_d');
Generowanie poprawionej sieci SELECT pgr_nodenetwork('blok_2.drogi', 0.00001, 'id_d', 'geom_d'); SELECT pgr_createtopology('blok_2.drogi_noded', 0.00001, 'geom_d', 'id'); SELECT pgr_analyzegraph('blok_2.drogi_noded', 0.00001,'geom_d','id'); ALTER TABLE blok_2.drogi_noded ADD COLUMN length double precision; UPDATE blok_2.drogi_noded SET length = ST_Length(geom_d);
pgrouting: Algorytm Dijkstra Uruchomiamy obliczenia najkrótszej drogi wg schematu pgr_costresult[] pgr_dijkstra(text sql, integer source, integer target, boolean directed, boolean has_rcost); SELECT seq, id1 AS node, id2 AS edge, cost FROM pgr_dijkstra('select id_d AS id, source::integer, target::integer, length::double precision AS cost FROM blok_2.drogi_noded',14,8, false,false);
Trasowanie przy pomocy wtyczki QGIS (pgroutinglayer)
Trasowanie przy pomocy zapytania w QGIS DB Manager
pgrouting: Algorytm DijkstraVia SELECT seq, node, edge, cost, geom_d FROM pgr_dijkstravia('select id, source::integer, target::integer, length::double precision AS cost FROM blok_2.drogi_noded', ARRAY[110, 106, 49])as di join blok_2.drogi_noded pt on di.edge=pt.id;
pgrouting: problem komiwojażera Algorytm TSP (travelling salesman problem) Macierz odległości między wybranymi punktami: SELECT dmatrix, ids FROM pgr_makedistancematrix('select cast(id as integer), ST_X(the_geom)as x, ST_Y(the_geom) as y FROM blok_2.drogi_vertices_pgr where id=6 or id=10 or id =11 or id=2');
pgrouting: Algorytm TSP SELECT seq, id1, id2, round(cost::numeric, 2) AS cost FROM pgr_tsp('select cast(id as integer), ST_X(the_geom)as x, ST_Y(the_geom) as y FROM blok_2.drogi_vertices_pgr where id=6 or id=10 or id =11 or id=2', 6,2);
pgrouting: Algorytm TSP (zapytanie w QGIS)
Trasowanie warunkowe wtyczka QGIS
Trasowanie warunkowe aplikacja web
Wyznaczanie izochron
Wyznaczanie izochron aplikacja web
Przygotowanie sieci do routingu Przykład Sieć nietrasowalna: create table network (id int, the_geom geometry(linestring) ); insert into network values (1, 'linestring(0 0, 10 10)'::geometry); insert into network values (2, 'linestring(2 0, 8 10)'::geometry); insert into network values (3, 'linestring(1 1, 10 0)'::geometry); insert into network values (4, 'linestring(10 0, 8 10)'::geometry);
Nadawanie węzłów w punktach przecięcia sieci
Gotowa sieć do trasowania
Przykładowa sieć
Korekta sieci
Prawidłowa trasowalna sieć