Zarządzanie danymi przestrzennymi Analizy przestrzenne
Przykładowe problemy 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 języki skryptowe Analizy rastrowe
Analiza bliskości obiektów Wyszukiwanie najbliższych obiektów np. jeziora nieczadujące się w odległości 1000 m od Katedry select distinct point.name, lake.name, ST_Distance(point.way,lake.way) from planet_osm_polygon as lake inner join planet_osm_point as point on ST_DWithin(point.way, lake.way,10000) where point.name='katedra' and lake.natural='water' and lake.name like '%Jezioro%'
Analiza bliskości obiektów Wyszukiwanie dróg przecinających się z rzeką Warta (mosty) select r.name from planet_osm_line as l inner join planet_osm_roads as r on ST_Intersects(l.way, r.way) where l.name='warta' and r.bridge='yes' and r.oneway='yes'
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 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 chronozon i inne przykłady: http://planet.qgis.org/planet/tag/pgrouting/ http://workshop.pgrouting.org/
PgRouting: Algorytm Dijkstra najkrótsza droga Dodajemy rozszerzenie pdrouting Do tabeli z drogami dodajemy 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; Ładujemy dane do kolumn sorce i target: SELECT pgr_createtopology('blok_2.drogi', 0.00001, 'geom_d', 'id_d'); Wyliczamy 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;
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',14,8, false,false);
PgRouting: Algorytm Dijkstra - wynik Zapytanie obliczenia najkrótszej drogi wykonane z poziomu QGISa
PgRouting: Algorytm Dijkstra obliczenia przy pomocy wtyczki QGIS (pgroutinglayer)
PgRouting: problem komiwojażera Algorytm TSP (travelling salesman problem) Macież 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)
Łączenie PostGIS z innymi narzędziami Łączenie z językiem PL/R Łączenie z językiem Python Łączenie z serwerami Web-GIS
Łączenie PostGIS z PL/R CREATE EXTENSION plr Funkcja R pobierająca dane i rysująca wykresy SELECT gis.save_postgis_rdata()
Łączenie PostGIS z PL/Python (geokodowanie) CREATE EXTENSION plpython3u Przykład z bibloteką geokodującą geopy Utworzenie funkcji geokodującej pobierającej współrzędne geograficzne i zwracającej adres obiektu: Uruchomienie zapytania wyszukiwania adresów budynków przy pomocy funkcji: Wynik zapytania- uzyskane adresy budynków
Łączenie PostGIS z PL/Python Przykład zastosowania funkcji wykorzystującej bibliotekę Pythona xlrd obsługującą arkusze Excella
Łączenie PostGIS z serwerami sieciowymi MapServer GeoServer
Serwisy mapowe w sieci WMS (Web Mapping Service) WFS (Web Feature Service) WFS-T (Web Feature Service Transactional)
Konfiguracja Mapserwera
Uruchomienie Mapserwera: plik mapfile
Mapserver: pobranie mapy Adres w przeglądarce: http://localhost/cgi-bin/mapserv map=/media/dysk/maptest.map&service=wms&request=getmap&version= 1.1.1&LAYERS=Wielkopolska&SRS=EPSG:4326&BBOX=15.5,51,19.3,53.7&FORM AT=PNG&WIDTH=600&HEIGHT=600 Mapa jest gotowa do przesłania do interfejsu utworzonego w OpenLayers
Analizy Rastra Zmiana wielkości kafla Kontrola parametrów rastra Praca z wieloma kanałami Przecinanie rastrów obiektami geometrycznymi Algebra map
Zmiana wielkości kafla (tiling) Przesyłanie obrazów rastrowych do PostGIS przy pomocy raster2pgsql i parametry do połączenia zostały opisane na wykładzie II --utworzenie nowej tabeli dla rastra CREATE TABLE raster.pozdem_tiled ( rid serial primary key, rast raster ); --wstawienie rastra o zmienionych parametrach kafla 30x30 pixeli INSERT INTO raster.pozdem_tiled (rast) SELECT ST_Tile(rast, 30, 30, true) AS rast FROM raster.pozdem; --nałożenie indeksów przestrzennych CREATE INDEX idx_pozdem_tiled_gist ON raster.pozdem_tiled USING gist (ST_ConvexHull(rast)); --w efekcie mamy 5600 kafli z poprzednich 1400
Kontrola parametrów rastra SELECT rid As r, ST_Width(rast) As w, ST_Height(rast) As h, round(st_pixelwidth(rast)::numeric,4) AS pw, round(st_pixelheight(rast)::numeric,4) As ph, ST_SRID(rast) AS srid, ST_BandPixelType(rast,1) AS bt FROM raster.pozdem_tiled;
Praca z wieloma kanałami dodanie nowego kanału aspekt --Utworzenie tabeli do przechowania dwóch kanałów: CREATE TABLE raster.pozdem_band (rid serial primary key, rast raster); --Wstawienie dwóch kanałów aspekt i dem INSERT INTO raster.pozdem_2bands (rast) SELECT ST_AddBand(ST_Aspect(rast, 1, '8BUI'), rast) FROM raster.pozdem --Aktualizacja ograniczeń: SELECT AddRasterConstraints('raster', 'pozdem_2bands'::name, 'rast'::name);
Praca z kanałami raster PostGIS wielokanałowy w QGIS
Wydzielenie wybranego kanału z rastra wielokanałowego SELECT rid, ST_Band(rast,1) As rast INTO raster.pozaspekt FROM raster.pozdem_2bands; CREATE INDEX idx_pozaspekt_rast_gist ON raster.pozaspekt USING gist (ST_ConvexHull(rast)); SELECT AddRasterConstraints('raster', 'pozaspekt'::name, 'rast'::name);
Przecinanie rastrów obiektami geometrycznymi
Algebra map CREATE TABLE raster.pozaspekt_10 ( rid serial primary key, rast raster ); --obliczenie pixel*10 INSERT INTO raster.pozaspekt_10(rast) SELECT ST_MapAlgebra( rast, 1, '32BF'::text, '[rast.val]/10.0'::text ) FROM raster.pozaspekt
Algebra map (funkcja klasyfikująca pixele ze względu na wartość) Pixele w rastrze rastrze-kanał 4 o wartości równej i poniżej 30 to woda, powyżej 30 to ląd
Algebra map (uruchomienie funkcji klasyfikującej) Dodanie tabeli przechowującej wyniki w postaci dwóch kanałów Dodanie kanałów, 1 -oryginalny, 2 -wynik klasyfikacji
Algebra map (efekt klasyfikacji)