Celem pierwszej części pracy jest analiza i wizualizacja danych wektorowych pobranych z Open Street Map z wykorzystaniem operatora pipe dla automatyzacji pracy w R. Celem części drugiej jest próba analizy sieciowej z wykorzystaniem pakietu sfnetworks.
W pierwszej części pracy do analizy i wizualizacji zostaną pobrane dane z OSM o sklepach w Warszawie i kinach w Polsce.
Aby pracować z określonymi danymi, trzeba wczytać pakiety osmdata i sf. Pakiet sf pozwala na obsługę dodatkowych typów danych wektorowych, łatwiejsze przetwarzanie danych oraz obsługę przestrzennych baz danych, natomiast pakiet osmdata umożliwia pobieranie danych z Open Street Map.
library(osmdata)
## Data (c) OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright
library(sf)
## Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1
Wybierzemy dla analizy dane o rozmieszczeniu salonów samochodowych, sklepów rowerowych oraz sklepów motocyklowych w Warszawie. Za pomocą operatora pipe można pobrać wybrane dane z OSM w następujący sposób:
samochody = opq("warszawa poland") %>%
add_osm_feature(key = "shop", value = "car") %>%
osmdata_sf()
rowery = opq("warszawa poland") %>%
add_osm_feature(key = "shop", value = "bicycle") %>%
osmdata_sf()
motory = opq("warszawa poland") %>%
add_osm_feature(key = "shop", value = "motorcycle") %>%
osmdata_sf()
Wizualizacja danych realizowana za pomocą funkcji plot(). Wykres jest przedstawiony w następnym rozdziale.
Dalej pobierzemy dane o rozmieszczeniu sieci kin w Polsce. W tym celu należy najpierw ustawić zakres współrzędnych określający Polskę:
zasieg = c(14.09, 48.98, 24.15, 54.85)
Następnie za pomocą operatora pipe można pobrać dane o rozmieszczeniu kin Multikino oraz Helios z OSM, dodając do kodu funkcję wyszukiwania po nazwie (np. add_osm_feature(“name”, “Multikino”)):
multikino = opq(zasieg, timeout = 25*100) %>%
add_osm_feature("amenity", "cinema")%>%
add_osm_feature("name", "Multikino") %>%
osmdata_sf()
helios = opq(zasieg, timeout = 25*100) %>%
add_osm_feature("amenity", "cinema")%>%
add_osm_feature("name", "Helios") %>%
osmdata_sf()
Wizualizacja danych realizowana za pomocą funkcji plot(). Wykres jest przedstawiony w następnym rozdziale.
Dla wykonania części drugiej pracy trzeba wczytać następujące pakiety:
library(rgugik)
library(sfnetworks)
library(tidygraph)
##
## Attaching package: 'tidygraph'
## The following object is masked from 'package:stats':
##
## filter
Dla analizy sieciowej zostały wybrane dane BDOT o drogach w Warszawie, które wczytamy w R za pomocą pakietu rgugik:
topodb_download("Warszawa", outdir = "C:\\Users\\daria\\Desktop")
drogi = st_read("C:\\Users\\daria\\Desktop\\PL.PZGiK.330.1465\\BDOT10k\\PL.PZGiK.330.1465__OT_SKDR_L.xml")
## Reading layer `OT_SKDR_L' from data source `C:\Users\daria\Desktop\PL.PZGiK.330.1465\BDOT10k\PL.PZGiK.330.1465__OT_SKDR_L.xml' using driver `GML'
## Simple feature collection with 59776 features and 30 fields
## geometry type: LINESTRING
## dimension: XY
## bbox: xmin: 626541.6 ymin: 472232.8 xmax: 655247.4 ymax: 502061.9
## projected CRS: ETRS89 / Poland CS92
Do analizy zostały wybrane tylko główne drogi:
drogi_gl = drogi[drogi$x_kod %in% c("SKDR01", "SKDR02", "SKDR03", "SKDR04", "SKDR05"),]
Dalej obiekt sf drogi_gl został zamieniony na obiekt sfnetwork:
net = as_sfnetwork(drogi_gl)
Żeby pozbyć się pseudo-wierzchołków w sieci dróg, korzystamy z funkcji convert():
smooth_net = as_sfnetwork(drogi_gl) %>%
convert(to_spatial_smooth)
Obliczymy centralność wierzchołków za pomocą funkcji centrality_betweenness():
smooth_net = as_sfnetwork(drogi_gl) %>%
convert(to_spatial_smooth) %>%
mutate(bc = centrality_betweenness())
Dla wizualizacji wyników wykorzystujemy pakiet tmap, który trzeba najpierw wczytać:
library(tmap)
Następnie obiekt smooth_net (sfnetwork) trzeba zamienić na obiekt sf za pomocą funkcji st_as_sf():
smooth_sf = st_as_sf(smooth_net)
Dane o lokalizacji w Warszawie sklepów sprzedających samochody, rowery i motocykle zwizualizowano na poniższym wykresie.
plot(st_geometry(samochody$osm_points), col = "orange", main = "Rozmieszczenie sklepow w Warszawie",
border = "darkgrey", axes = T, pch = 1, cex = 0.5, las = 1)
plot(st_geometry(rowery$osm_points), pch = 2, col = "blue", add = T)
plot(st_geometry(motory$osm_points), pch = 3, col = "chartreuse3", add = T)
legend("bottomleft", legend = c("Salony samochodowe", "Sklepy rowerowe", "Sklepy motocyklowe"), cex = 0.5, fill = c("orange", "blue", "chartreuse3"))
Korzystając z dodanych opcji funkcji plot, na wykresie przedstawiono lokalizację sklepów w Warszawie według ich specjalizacji: sprzedaż samochodów (kolor pomarańczowy), rowerów (kolor niebieski) i motocykli (kolor zielony). Jak widać na wykresie, w całym mieście jest sporo punktów sprzedaży samochodów i rowerów, natomiast punktów sprzedaży motocykli jest znacznie mniej i one skupione są głównie w centralnej części Warszawy.
Dalej zwizualizujemy dane o lokalizacji sieci kin w Polsce:
plot(st_geometry(multikino$osm_points), col = "red", main = "Rozmieszczenie kin w Polsce",
border = "darkgrey", axes = T, pch = 2, las = 1)
plot(st_geometry(helios$osm_points), pch = 3, col = "blue", add = T)
legend("bottomright", legend = c("Multikino", "Helios"), fill = c("red", "blue"))
Wykres przedstawia rozmieszczenie sieci kin Multikino i Helios w Polsce. Jak widać, w Polsce dominują kina sieci Helios, z których większość znajduje się w centralnej i południowej Polsce. Większość kin sieci Multikino zlokalizowana jest w północnej i południowej Polsce.
Na poniższym wykresie zwizualizowano sieć głównych dróg Warszawy na podstawie danych pobranych z bazy danych obiektów topograficznych.
plot(st_geometry(drogi_gl))
Dalej obiekt sf drogi_gl został zamienony na obiekt sfnetwork, a następnie za pomocą funkcji convert() były wyeliminowane pseudo-wierzchołki, które nie leżą na przecięciach dróg. Wynik jest zwizualizowany na poniższym wykresie.
plot((smooth_net), col = "cyan3", main = "Siec glownych drog w Warszawie", border = "darkgrey", axes = T)
Następnie była wykorzystana funkcja centrality_betweenness() wewnątrz funkcji mutate(), która pozwoliła na utworzenie nowego atrybutu w sieci dróg, w którym wartość centralności została obliczona dla każdego wierzchołka (atrybut “bc”). Dla wizualizacji wyniku wczytujemy pakiet tmap i przechodzimy do trybu interaktywnego:
tmap_mode('view')
## tmap mode set to interactive viewing
Wizualizujemy sieć głównych dróg w Warszawie z obliczoną centralnością wierzchołków (“bc”):
tm_shape(drogi_gl)+
tm_lines()+
tm_shape(smooth_sf)+
tm_dots("bc")+
tm_bubbles("bc", col = "red")+
tmap_options(basemaps = 'OpenStreetMap')
## Warning: One tm layer group has duplicated layer types, which are omitted. To
## draw multiple layers of the same type, use multiple layer groups (i.e. specify
## tm_shape prior to each of them).