R jako osobisty GPSWspółpraca R z serwerem danych przestrzennych
Dawid 'Gonzo' Kałędkowski
• 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
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, …)
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
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
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
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)
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
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”)
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
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
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
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
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
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
Wizualizacja trasy
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
Top Related