dawid gonzo kałędowski: r jako osobisty gps

18
R jako osobisty GPS Współpraca R z serwerem danych przestrzennych Dawid 'Gonzo' Kałędkowski

Upload: analyticsconf

Post on 15-Apr-2017

131 views

Category:

Data & Analytics


0 download

TRANSCRIPT

Page 1: Dawid Gonzo Kałędowski: R jako osobisty GPS

R jako osobisty GPSWspółpraca R z serwerem danych przestrzennych

Dawid 'Gonzo' Kałędkowski

Page 2: Dawid Gonzo Kałędowski: R jako osobisty GPS

• Język R został stworzony do obliczeń statystycznych i wizualizacji danych w Bell Laboratories przez

Johna Chambersa i kolegów na bazie wcześniejszego języka S

• R to język stworzony przez statystyków dla statystyków

• Cechuje go prostota

• Dla zaawansowanych użytkowników także bardzo szybki – zastosowanie kodów C++ bezpośrednio na

obiektach R

• Możliwość pracy na danych wszelkiego typu i formatu

• Nieskomplikowany menedżer pakietów

Język i środowisko

Page 3: Dawid Gonzo Kałędowski: R jako osobisty GPS

Język i środowisko • Użytkownicy rozszerzają możliwości R o nowe integracje:

• Bazy danych (ODBC, MySQL, postgreSQL, sqlite3, mongolite, …)

• Pliki znanych programów statystycznych (SPSS, Stata, SAS, …)

• Web (curl, Selenium, ...)

• Dane geoprzestrzenne (GDAL, OGR)

• Poprawianie efektywności obliczeń (Hadoop, GPU, Spark, C++, ...)

• R na serwerze (shiny, Rapache, opencpu, …)

Page 4: Dawid Gonzo Kałędowski: R jako osobisty GPS

1. Wymagany serwer PostgreSQL wraz z dodatkowymi rozszerzeniami:

PostGIS http://wiki.openstreetmap.org/wiki/PostGIS/Installation

pgRouting http://pgrouting.org/download.html

2. Dane OSM dla Polski we dwóch formatach

http://download.geofabrik.de/europe/poland-latest.osm.pbf

http://download.geofabrik.de/europe/poland-latest.osm.bz2

Dane z OSM

Page 5: Dawid Gonzo Kałędowski: R jako osobisty GPS

3. Utworzenie bazy na podstawie danych z OSM osm2pgsql

http://wiki.openstreetmap.org/wiki/Osm2pgsql

OSM – import do pgSQL

$> createdb poland_osm $> psql poland_osm poland_osm=# create extension postgis; poland_osm=# create exiention hstore; poland_osm=# create exiention pgrouting; poland_osm=# \q $> osm2pgsql -c -d poland_osm -C 5000 -S default.style --number-processes 3 poland-latest.osm.pbf

Alternatywy: osmosis, shp2pgsql

Page 6: Dawid Gonzo Kałędowski: R jako osobisty GPS

OSM – trasowanie

$ psql poland_pgr poland_osm=# create extension postgis; poland_osm=# create exiention pgrouting; > osm2pgrouting -file "poland-latest.osm" -conf "mapconfig.xml" -dbname poland_osm -user <user_name> -host <host> -passwd <passwd>

4. Stworzenie topologii ulic w formie sieci z użyciem osm2pgrouting

http://pgrouting.org/docs/tools/osm2pgrouting.html

5. Po zakończeniu importowania uruchom serwer PostgreSQL

Page 7: Dawid Gonzo Kałędowski: R jako osobisty GPS

OSM – struktura bazyosm2pgsql

1. planet_osm_line – linie dróg, granice, trasy komunikacji miejskiej, trasy kolei, linie wysokiego napięcia

2. planet_osm_points – obiekty takie jak restauracje, przystanki, stacje, wieże energetyczne

3. planet_osm_polygon – obszary jednostek administracyjnych, przedsiębiorstw, parków, rezerwatów

4. planet_osm_roads – podzbiór planet_osm_line służący do renderowania map na dużym oddaleniu

osm2pgrouting

5. ways – relacje sieci ulic

6. ways_vertices_pgr – węzły (w tablicy ways source i target)

Page 8: Dawid Gonzo Kałędowski: R jako osobisty GPS

OSM – struktura bazyZaimportowane dane mają te same właściwości co oryginalna baza z openstreetmap.com.

Lista tagów dostępna na http://wiki.openstreetmap.org/wiki/Category:Tag_descriptions_by_group

SELECT *FROM planet_osm_polygon WHERE osm_id = 239280436

Page 9: Dawid Gonzo Kałędowski: R jako osobisty GPS

Nawiązanie połączenia

R> install.packages(c("rgdal“,”RPostgreSQL”,”rgeos”,”ggplot2”,”ggmap”,”ggrepel”))R> devtools:::install_github("elo2zero/oddsandsods")R> library(oddsandsods);library(rgeos);library(ggplot2);library(magrittr)# sprawdź czy w bibliotece rgdal są sterowniki do PostgreSQLR> rgdal:::ogrDrivers()R> sqlConnect(“poland_osm”)

UWAGA! W przypadku braku sterowników do PostgreSQL w rgdal należy zainstalować pakiet z

http://www.kyngchaos.com/files/software/frameworks/rgdal-1.0.7-1.dmg a następnie

zainstalować przy pomocy devtools:::install(“ścieżka do folderu z pakietem”)

Page 10: Dawid Gonzo Kałędowski: R jako osobisty GPS

Pobieraanie danych

R> województwa <- pgisRead({"SELECTname, st_transform(way, 4326) geom

FROM planet_osm_polygon

WHEREadmin_level = '4'"}, data.frame=T)

R> miasta <- customQuery({“SELECT name, place, st_x(st_transform(way, 4326)) long,st_y(st_transform(way,4326)) lat

FROM planet_osm_point

WHERE place='city' ORDER BY name”})

pgisRead() - funkcja pobiera dane z bazy danych zwraca obiekt typu spatial {sp} lub

data.frame gdy argument data.frame=T.

customQuery() - uniwersalna funkcja do wyciągania danych z baz

Page 11: Dawid Gonzo Kałędowski: R jako osobisty GPS

Mapa województw

R> theme <- theme(axis.line = element_blank(), axis.ticks = element_blank(), axis.ticks.length = unit( 0 ,"null"), axis.ticks.margin = unit( 0, "null"), axis.text.x = element_blank(), axis.text.y = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank(), legend.position="none", panel.background = element_blank(), panel.border = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), plot.background = element_rect(fill = "white", colour=NA), plot.margin = unit(c(0,0,0,0), "null"), panel.margin = unit(c(0,0,0,0), "null"), legend.margin = unit(0, "null"), plot.background = element_rect(fill = "transparent",colour = NA))

R> ggplot(woj) + geom_polygon(aes(x=long, y=lat, group=group),fill="transparent", col="blue") + geom_point(data=miasta, aes(x=long, y=lat), color="red") + geom_text(data=miasta, aes(label = name,x=long+0.05,y=lat+0.05), size=3)+ coord_map() + theme

Page 12: Dawid Gonzo Kałędowski: R jako osobisty GPS

Mapa okolicy Starterabiuro <- pgisRead({"SELECT wayFROM planet_osm_polygon WHERE name SIMILAR TO '(Gdański Inkubator Przedsiębiorczości|Arkońska)%';"})okolica_biura <- pgisRead({"SELECT ST_Intersection( ST_Transform(ST_MakeEnvelope(18.57285, 54.40688, 18.57997, 54.40391, 4326),900913), way )FROM planet_osm_lineWHERE ST_Intersects( ST_MakeEnvelope(18.57285, 54.40688, 18.57997, 54.40391, 4326), ST_Transform(way,4326) ) andhighway in ('motorway','trunk','primary','secondary','tertiary','residential') ;"})

ggplot(biuro) + geom_polygon(aes(x=long, y=lat, group=group), color="red") + geom_path(data=okolica_biura,aes(x=long, y=lat, group=group))+ coord_fixed() + theme

Page 13: Dawid Gonzo Kałędowski: R jako osobisty GPS

gda <- pgisRead({"SELECT st_transform(way, 4326)FROM planet_osm_polygonWHERE name = 'Gdańsk'"})ulice <- pgisRead({"SELECT st_transform(r.way, 4326)FROM planet_osm_line r, planet_osm_polygon pWHERE p.name = 'Gdańsk' AND ST_Intersects(p.way, r.way) and r.highway in ('motorway','trunk','primary','secondary','tertiary','residential')"})wody <- pgisRead({"SELECT st_transform(r.way, 4326)FROM planet_osm_polygon r, planet_osm_polygon pWHERE ST_intersects(r.way,ST_Envelope(p.way)) AND r.waterway IS NOT NULL AND p.name = 'Gdańsk'"})

mapa_gda <- ggplot(gda) + geom_polygon(aes(x=long, y=lat, group=group),

color="blue", fill=NA, size =.4) + geom_polygon(data = wody, aes(x = long, y = lat, group = group),

fill = "skyblue", color = NA) + geom_path(data = ulice, aes( x= long, y = lat, group = group), size = .1) + coord_map(ylim = bbox(gda)[ c(2,4) ], xlim = bbox(gda)[ c(1,3) ]) + theme

Mapa ulic Gdańska

Page 14: Dawid Gonzo Kałędowski: R jako osobisty GPS

library(ggmap) bbox <- bbox(gda) img <- get_map(bbox, source =”osm”) mapa_gda <- ggmap(img) + geom_polygon(data=gda, aes(x=long, y=lat, group=group), color=”blue”, fill=NA, size=.4) + geom_polygon(data=wody,aes(x=long, y=lat, group=group), fill=”skyblue”, color=NA) + geom_path(data=ulice, aes(x=long, y=lat, group=group), size=.1) + coord_map(ylim=bbox(gda)[c(2,4)], xlim=bbox(gda)[c(1,3)]) + theme

Pobieranie rastrów

Page 15: Dawid Gonzo Kałędowski: R jako osobisty GPS

library(ggrepel) trasa <- pgrGetShortestPath(x1=18.7088469, y1=54.3602994, x2=18.5758874, y2=54.4050216) mapa_gda + geom_path(data=trasa, aes(x=long, y=lat), color = "red") ulice <- trasa@data %>% mutate(distance = cumsum(length)) %>% dplyr:::filter( ! duplicated(name)) mapa_gda + geom_path(data=trasa, aes(x=long, y=lat), color = "red") + geom_point(data=ulice,aes(x=x1, y=y1), color="red")+ geom_label_repel(data=ulice,aes(x=x1, y=y1, label=name), size=2, fill="red", color="white", box.padding = unit(0.35, "lines"), point.padding = unit(0.3, "lines"))

Trasowanie

Page 16: Dawid Gonzo Kałędowski: R jako osobisty GPS

Wizualizacja trasy

Page 17: Dawid Gonzo Kałędowski: R jako osobisty GPS

Dodatkowo Jakub Nowosad – Geostatystyka w R

https://bookdown.org/nowosad/Geostatystyka/

Working with postGis from R https://rpubs.com/dgolicher/6373

David Kahle, Hadley Wigham – ggmap: Spatial Visualization with ggplot2 https://journal.r-project.org/archive/2013-1/kahle-wickham.pdf

Skrypt z prezentacji https://gist.github.com/elo2zero/e4f05d5f44f47546e67abfa6e540002b

Page 18: Dawid Gonzo Kałędowski: R jako osobisty GPS

Dawid KałędkowskiBusiness Analyst

+48 728 403 323

[email protected]

Dziękuję za uwagę!