3. WPROWADZENIE DO POSTGIS
PRZYKŁAD DANYCH
id track_fid time ele x y
1 1
2018-12-04
12:00:01
261,1 20,0001 50,001
2 1
2018-12-04
12:00:02
261,1 20,0002 50,002
3 1
2018-12-04
12:00:03
262,0 20,0003 50,003
4 1
2018-12-04
12:00:04
261,5 20,004 50,004
4. WPROWADZENIE DO POSTGIS
WSPÓŁRZĘDNE GEOGRAFICZNE
▸ 1 stopień szerokości geograficznej to ok. 110 km
▸ 1 stopień długości geograficznej to:
▸ 110 km na równiku,
▸ 72 km w Przemyślu,
▸ 66.5 km w Szczecinie,
▸ 55 km w Oslo,
▸ 36 km na Nordkapp
7. WPROWADZENIE DO POSTGIS
NARZĘDZIA
QGIS
aplikacja GUI
wizualizacja danych i wyników zapytań
import / eksport
zarządzanie bazą
GDAL
biblioteka i narzędzia CLI
import/eksport danych
integracja w aplikacjach
9. WPROWADZENIE DO POSTGIS
TYPY DANYCH I UKŁADY WSPÓŁRZĘDNYCH
▸ Dane mogą być przechowywane we współrzędnych
płaskich lub geograficznych
▸ Dla układów płaskich stosuje się typ GEOMETRY, dla
geograficznych - typ GEOGRAPHY
▸ Układ identyfikowany jest przez kod SRID
10. WPROWADZENIE DO POSTGIS
TYPY DANYCH I UKŁADY WSPÓŁRZĘDNYCH
▸ Praktyczne znaczenie w Polsce mają kody SRID:
▸ 4326 - układ współrzędnych geograficznych WGS84
▸ 3857 - globalny układ Merkatora
▸ 2180 - państwowy układ współrzędnych geodezyjnych
"1992" (ogólnopolski)
▸ 2176, 2177, 2178, 2179 - państwowy układ współrzędnych
geodezyjnych "2000" (podzielony na strefy, dla geodezji
szczegółówej)
11. WPROWADZENIE DO POSTGIS
KOMPOZYCJA GEOMETRII
▸ ALTER TABLE punkty_gps ADD COLUMN geom
geography;
▸ UPDATE punkty_gps SET geom =
ST_SetSRID(ST_MakePoint(x,y),4326)::geography;
12. WPROWADZENIE DO POSTGIS
KOMPOZYCJA GEOMETRII
▸ CREATE TABLE trasy_gps AS SELECT track_fid, min(time)
AS start_time, max(time) AS end_time,
ST_MakeLine(geom::geometry ORDER BY
time)::geography AS geom FROM punkty_gps GROUP BY
track_fid;
13. WPROWADZENIE DO POSTGIS
POMIARY GEOMETRII
▸ SELECT track_fid,ST_Length(geom) / 1000 ,
(ST_Length(geom)/1000) / (EXTRACT(EPOCH FROM
(end_time- start_time))/3600) AS speed FROM trasy_gps;
Dla typu GEOMETRY funkcja ST_Length zwraca
wyniki w jednostkach układu współrzędnych
Dla typu GEOGRAPHY - w metrach
14. WPROWADZENIE DO POSTGIS
IMPORT DANYCH REFERENCYJNYCH
▸ Państwowy Rejestr Granic:
▸ http://www.gugik.gov.pl/pzgik/dane-bez-oplat/dane-z-
panstwowego-rejestru-granic-i-powierzchni-jednostek-
podzialow-terytorialnych-kraju-prg
▸ Państwowy Rejestr Nazw Geograficznych:
▸ http://www.gugik.gov.pl/pzgik/dane-bez-oplat/dane-z-
panstwowego-rejestru-nazw-geograficznych-prng
15. WPROWADZENIE DO POSTGIS
IMPORT DANYCH REFERENCYJNYCH
▸ QGIS
▸ posiada GUI
▸ obsługuje wiele formatów
▸ powolny przy dużych danych
▸ ogr2ogr
▸ linia komend
▸ obsługuje wiele formatów
▸ stosunkowo szybki
▸ shp2pgsql
▸ linia komend, dostarczany razem z PostGIS
▸ obsługuje tylko format SHP
▸ najszybszy
16. WPROWADZENIE DO POSTGIS
ZAPYTANIE PRZESTRZENNE
▸ Przez które dzielnice przebiegają poszczególne trasy?
ST_INTERSECTS - FUNKCJA "CATCH ALL"
SPRAWDZA, CZY GEOMETRIE MAJĄ COKOLWIEK WSPÓLNEGO
MOGĄ SIĘ NAKŁADAĆ, PRZECINAĆ, ZAWIERAĆ, STYKAĆ 1 PUNKTEM
18. WPROWADZENIE DO POSTGIS
INDEKS PRZESTRZENNY
▸ Na podstawie zasięgu przestrzennego (bounding box)
tworzy krótką listę geometrii, które potencjalnie mogłyby
się przecinać
▸ CREATE INDEX ON jednostki_ewidencyjne USING
gist(geom);
20. WPROWADZENIE DO POSTGIS
OPENSTREETMAP
▸ "Wikipedia wśród map"
▸ Projekt udostępniający wysokiej jakości dane geograficzne
każdemu, kto ich potrzebuje
▸ Używa PostgreSQL
▸ Możliwość pobrania danych dla świata, kontynentów,
krajów
▸ Możliwość wykonywania zapytań z użyciem wtyczki do
QGIS "QuickOSM" lub usługi Overpass
22. WPROWADZENIE DO POSTGIS
POSZUKIWANIE W PROMIENIU
▸ SELECT tr.track_fid, sh.name, sh.shop,
ST_Distance(sh.geom,tr.geom) FROM shop sh, trasy_gps tr
WHERE ST_DWithin(tr.geom,sh.geom,100);
DLA TYPU GEOMETRY
FUNKCJE ST_DWITHIN
I ST_DISTANCE
UŻYWAJĄ JEDNOSTEK
UKŁADU WSPÓŁRZĘDNYCH
DLA TYPU GEOGRAPHY
- METRÓW
24. WPROWADZENIE DO POSTGIS
ANALIZA SKUPIEŃ
▸ SELECT cid,ST_Centroid(ST_Collect(geom))AS geom,
count(*) as n_points FROM (SELECT
ST_ClusterDBSCAN(ST_Transform(geom::geometry,2180),
eps := 50, minpoints := 5) over () AS cid,
ST_Transform(geom::geometry,2180) as geom FROM
punkty_gps) sq GROUP BY cid;