Bölüm13 Leaflet paketi
htmlwidgets
ve leaflet
paketi kullanılarak R içerisinde etkileşimli haritalar yaratılabilir. Bu iş için üç aşama gerekir
leaflet
paketinin yüklenmesileaflet()
fonksiyonu ile paketin çalıştırılması- harita kaplamasının eklenmesi
tidyverse
paketinde olduğu gibi leaflet
paketin de de%>%
aktarma operatörü kullanılabilir. Aşağıdaki kodda bu kullanıma bir örnek bulabilirsiniz.
# leaflet paketinin yüklenmesi
library(leaflet)
# addTiles() komutu ile bir leaflet haritası yaratılması
leaflet() %>%
addTiles()
Yukarıdaki örnek addtiles()
fonkisyonu ile pakette “OpenStreetMap (OSM)” adı ile verili olarak (default) tanımlı bulunan harita sağlayıcısındaki harita kaplamasını kullandı. leaflet
paketi ile 100’den fazla harita sağlayıcısının kullanıma sunduğu değişik harita kaplamalarını işlerinizde kullanabilirsiniz. Bu sağlayıcıların listesine names(providers)
komutu ile ulaşıp istediğiniz sağlayıcının haritasını kullanabilirsiniz. Aşağıdaki kodda bu kullanıma bir örnek bulabilirsiniz.
## [1] "CartoDB"
## [2] "CartoDB.Positron"
## [3] "CartoDB.PositronNoLabels"
## [4] "CartoDB.PositronOnlyLabels"
## [5] "CartoDB.DarkMatter"
## [6] "CartoDB.DarkMatterNoLabels"
## [7] "CartoDB.DarkMatterOnlyLabels"
Bu örnekte çoğunlukla CartoDB harita kaplamalarını kullanacağız. Bu ayarı aşağıdaki kod gerçekleştirmektedir.
leaflet() %>%
addProviderTiles(provider = "CartoDB")
Haritamızı istediğimiz alana odaklamak için setView()
fonksiyonu kullanılır. Türkiye için bu işlemi aşağıdaki kod gerçekleştirmektedir. Kodda kullanılan lng değişkeni Türkiyenin boylam, lat değişkeni ise enlem değeridir. Ayrıca harita sağlayıcısı da “Esri” olarak değiştirilmiştir.
leaflet() %>%
addProviderTiles("Esri") %>%
setView(lng = 35.2433, lat = 38.9637, zoom = 5)
13.1 Yer İmleri
Şu ana kadar sadece temel harita kaplamaları ile çalıştık. Bu aşamada haritalara istediğimiz katmaları ekleyeceğiz. Haritalamada en çok kullanılan katmanların başında “yer imleri/ location markers” gelir. Yer imleri addMarkers()
fonksiyonu ile temel haritanın üstüne işlenir. Aşağıdaki kodda haritaya Tarsus ilçesi işlenmektedir. Kod aynı anda options
argümanı ile haritanın ilk açıldığındaki çerçevesini ve odak değerlerinibelirlemektedir.
leaflet(options =
leafletOptions(dragging = TRUE,
minZoom = 1,
maxZoom = 18)) %>%
addProviderTiles("Esri") %>%
setView(lat = 35.2433, lng = 38.9637, zoom = 5) %>%
addMarkers(lng = 34.8952, lat = 36.9166)
Yukarıdaki kodda yer imimize ait isim bulunmuyor.Haritamızı daha anlaşılır hale geitrmek için kullandığımız yer imine popup()
argümanı ile isim ekleyebiliriz. Aşağıdaki kod bu işlemleri gerçekleştirmektedir.
leaflet(options =
leafletOptions(dragging = TRUE,
minZoom = 1,
maxZoom = 18)) %>%
addProviderTiles("Esri") %>%
setView(lat = 35.2433, lng = 38.9637, zoom = 5) %>%
addMarkers(lng = 34.8952, lat = 36.9166,
popup = "Tarsus")
13.2 Harita verisinin düzenlenmesi
Her analizde olduğu gibi harita incelemelerinde de en önemli aşama verinin düzenlenmesi aşamasıdır. Aşağıda bu çalışmada kullanılan verinin düzenlenme aşamalarını bulabilirsiniz. Bu kod farklı analizlerin kullanacağı dosyalar için değişik olacağından uygun dosya isimleri ile her analiz için tekrar üretilmelidir.
Kodun aşamalarını incelersek ilk olarak uygun *.shp dosyasınının rgdal
paketi ile yüklendiğini görürüz. shp dosyaları harita üzerine işlenecek olan poligonların (il, ilçe vb) bilgisini içerirler.
Şu ana kadar haritalarımıza sadece yer imleri ekledik. R içerisinde il ilçe gibi mekansal poligonlar SpatialPolygonsDataFrame
adı verilen özel bir tip R nesnesi olarak saklanırlar. Bu tip veritabanları 5 tip bilgi içerir
- data: her poligon için tanımlanmış veri, örneğin gelir seviyesi, nüfus vb.
- polygons: poligonların işlenmesi için gerekli koordinatlar
- plotOrder: poligonların işlenme sırası
- bbox: coğrafi verinin sınırları
- proj4string: kordinat referans sistemi
Bu örnekteki shp dosyası intenetten bulunmuştur. İkinci aşamada elimizdeki verinin (bu örnekte il bazında toplanmış seçim verileri) shp dosyasının data kısmı ile birleştirilmesi işi gerçekleştirilmektedir. Bu işlem için shp dosyasındaki data kısmı ile eilmizdeki verinin ortak bir değişkene (bizim örneğimizde ilçe kodu olan ADM2 değişkeni) gerek vardır. Üçüncü aşamada yer imleri analizleri için gerek enlem ve boylam (Latitude ve Longitude) bilgilerinin shp dosyasından çekilmesi işlemi yapılmaktadır. Bu işlem de yapıldıktan sonra son aşamada harita için gerekli tüm nesneler birleştirilmektedir.
Tüm bu işlemler analizin ihtiyaçlarına göre farklı yollarla yapılabilir. Kendi analiziniz için lütfen kullanılan paketlerin yardım dosyalarını inceleyiniz.
# Birinci aşama: shp dosyasının yüklenmesi ve data kısmına kendi verimizin ADM2 değişkeni kullanılarak eklenmesi
library(dplyr)
library(rgdal)
k <- readOGR("TUR_admn_adm2_py_GeneralCommandOfMapping_hh_v3.shp")
## OGR data source with driver: ESRI Shapefile
## Source: "C:\Users\emretoros\OneDrive\Makale\R\book\TUR_admn_adm2_py_GeneralCommandOfMapping_hh_v3.shp", layer: "TUR_admn_adm2_py_GeneralCommandOfMapping_hh_v3"
## with 970 features
## It has 12 fields
## Integer64 fields read as strings: ADM1 ADM2
# İkinci aşama: elimizdeki verinin yüklenmesi ve shp dosyası ile birleştirilmesi
l <- read.csv("C:/Users/emretoros/OneDrive/Makale/R/toros/leaflet/son_guncel_ilce.csv", sep=";")
l$ADM2 <- as.factor(l$ADM2)
# ittifak değişkeni
l <- l %>%
mutate(ittifak = case_when(
rte > 50 & mhp_comp > 0 ~ 1,
TRUE ~ 0
))
k@data <- k@data %>%
left_join(l, by = c("ADM2" = "ADM2"))
klm <- k@data %>%
left_join(l, by = c("ADM2" = "ADM2"))
#Üçüncü aşama: Long ve Lat bilgilerinin shp dosyasından çekimi
library(rgdal)
xx <- readOGR("TUR_admn_adm2_py_GeneralCommandOfMapping_hh_v3.shp")
## OGR data source with driver: ESRI Shapefile
## Source: "C:\Users\emretoros\OneDrive\Makale\R\book\TUR_admn_adm2_py_GeneralCommandOfMapping_hh_v3.shp", layer: "TUR_admn_adm2_py_GeneralCommandOfMapping_hh_v3"
## with 970 features
## It has 12 fields
## Integer64 fields read as strings: ADM1 ADM2
ll <- coordinates(spTransform(xx, CRS("+proj=longlat +datum=WGS84")))
ll <- as.data.frame(ll)
guncel_ilce_master <- read.csv("C:/Users/emretoros/OneDrive/Makale/R/toros/leaflet/guncel_ilce_master.csv", encoding="UTF-8")
as_tibble(ll)
## # A tibble: 970 x 2
## V1 V2
## * <dbl> <dbl>
## 1 36.3 36.1
## 2 36.1 36.2
## 3 33.3 36.2
## 4 36.5 36.3
## 5 36.2 36.3
## 6 33.0 36.2
## 7 32.8 36.3
## 8 36.2 36.5
## 9 32.5 36.3
## 10 36.0 36.4
## # ... with 960 more rows
as_tibble(guncel_ilce_master)
## # A tibble: 970 x 13
## X NAME_TR NAME_EN PROV_EN PROV_TR
## <int> <fct> <fct> <fct> <fct>
## 1 0 ALTINÖ~ ALTINO~ HATAY HATAY
## 2 1 DEFNE DEFNE HATAY HATAY
## 3 2 AYDINC~ AYDINC~ MERSIN MERSIN
## 4 3 REYHAN~ REYHAN~ HATAY HATAY
## 5 4 ANTAKYA ANTAKYA HATAY HATAY
## 6 5 BOZYAZI BOZYAZI MERSIN MERSIN
## 7 6 ANAMUR ANAMUR MERSIN MERSIN
## 8 7 BELEN BELEN HATAY HATAY
## 9 8 GAZIPA~ GAZIPA~ ANTALYA ANTALYA
## 10 9 ARSUZ ARSUZ HATAY HATAY
## # ... with 960 more rows, and 8 more
## # variables: ADM0 <fct>, ADM1 <int>,
## # ADM2 <int>, PCODE <fct>,
## # Shape_Leng <dbl>, ADDINFO <fct>,
## # Shape_Le_1 <dbl>, Shape_Area <dbl>
lld <- bind_cols(ll, guncel_ilce_master)
lld <- rename(lld, lng=V1, lat=V2)
lld$ADM2 <- as.factor(lld$ADM2)
#Dördüncü aşama: tüm R nesnelerinin birleştirilmesi
klmn <- klm %>%
left_join(lld, by = c("ADM2" = "ADM2"))
klmn$ct <- paste(klmn$city.y, klmn$town.y, sep = " ")
Analizin bundan sonraki kısmında yukarıda oluşturduğumuz klmn
isimli veritabanını kullanacağız. Veri tabanının özelliklerini aşağıdaki kod ile görebilirsiniz.
glimpse(klmn)
Ankara’daki ilçeler üzerinden bir inceleme yapmak istediğimizi düşünelim. Öncelikle veritabanımızdan Ankara ilçelerini ayıklayalım ve haritadaki yerlerini aşağıdaki kod ile işaretleyelim
library(leaflet)
ankara <- klmn %>%
filter (city.y == "Ankara")
ankara_harita <- ankara %>%
leaflet() %>%
addProviderTiles("Esri") %>%
addMarkers(lat = ankara$lat, lng = ankara$lng)
ankara_harita
Yukarıdaki haritada yer imleri birbirlerinin üzerine binerek haritanın anlaşılmasını zorlaştırmaktadır. Bu durumdan kurtulmak ve yer imlerini değişik bir şekilde oluşturmak için aşağıdaki kodu kullanabiliriz.Bu koddaki clearMarkers()
argümanı önceden oluşan yer imlerini ortadan kaldırır ve addCircleMarkers()
argümanı ise yer imlerini daireler şeklinde gösterir.
ankara_harita %>%
clearMarkers() %>%
addCircleMarkers(lat = ankara$lat, lng = ankara$lng, radius = 3)
Haritanın üzerinde bazı değişiklikler yapan aşağıdaki kodu inceleyiniz.
ankara_harita <- ankara_harita %>%
clearMarkers() %>%
addCircleMarkers( data= ankara,
lat = ankara$lat, lng = ankara$lng,
radius = 5,
color = "red",
popup = ~NAME_EN.y.y)
ankara_harita
Bu kod haritamızı ankara_harita
isimli bir R objesi halinde sakladı ve üzerinde bazı kozmetik değişiklikler yaptı. Bu kozmetik değişiklikler ile ilgili detaylı bilgiyi paketin yardım dosyasında bulabilirsiniz.
Şimdi, ankara veri tabanını kullanan ve yer imlerinin isimlerini popup
yerine labels
argümanı ile gösteren aşağıdaki kodu inceleyiniz. labels
argümanı yer imlerinin ait isimleri tıklamaya gerek bırakmaksızın üzerine gelince ortaya çıkartmaya yarar.
ankara_harita <- ankara %>%
leaflet() %>%
addProviderTiles("Esri") %>%
addCircleMarkers( data= ankara,
lat = ankara$lat, lng = ankara$lng,
radius = 5,
color = "red",
label = ~NAME_EN.y.y)
ankara_harita
Şimdi bu ilçeleri Ankara için tanımlanmış üç seçim bölgesi için ayrı renk olarak haritaya colorFactor()
fonksiyonu işaretleyen aşağıdaki koda göz atalım.
pal <- colorFactor(palette = c("red", "blue", "green"),
levels = c("birinci_bolge", "ikinci_bolge", "ucuncu_bolge"))
ankara_sb <-
ankara %>%
leaflet() %>%
addProviderTiles("CartoDB") %>%
addCircleMarkers(radius = 2,
color = ~pal(sb),
label = ~NAME_EN.y.y)
## Assuming "lng" and "lat" are longitude and latitude, respectively
ankara_sb %>%
addLegend(position = "bottomright",
pal = pal,
values = c("birinci_bolge", "ikinci_bolge", "ucuncu_bolge"))
Kod öncelikle pal
adı altında renk ve seçim bölgesi tanımlaması yapıyor ve veritabanında seçim bölgelerini ifade eden sb değişkeni ile ilişkilendiriyor. Ayrıca bu harita “Esri” yerine “CartoDB” sağlayıcısını haritasını kullanıyor.
Şimdi bu ilçelerde Adalet ve Kalkınma Partisinin aldığı oy oranlarını colorNumeric()
fonksiyonu ile haritamıza işleyelim.
pal <- colorNumeric(palette = "Oranges", domain = c(5:70))
akp_map <-
ankara %>%
leaflet() %>%
addProviderTiles("CartoDB") %>%
addCircleMarkers(radius = 6,
color = ~pal(akp2018.y),
fillOpacity = 5,
label = ~paste0(NAME_EN.y.y, " (", akp2018.y, ")")) %>%
addLegend(title = "Adalet ve Kalkınma Partisi", pal = pal, values = c(5:70),
position = "bottomright")
## Assuming "lng" and "lat" are longitude and latitude, respectively
akp_map
Yukarıdaki kodun ilk satırı öncelikle pal
adı altında renk ve aralık tanımlıyor. “5:70” aralığıise partinin Ankara’da aldığı oyların aralığını tanımlamak için kullanılmış. Bir önceki koddan farklı olarak label()
fonksiyonu hem ilin adını hem de oy oranını gösterecek şekilde düzenlenmiş.