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

  1. leaflet paketinin yüklenmesi
  2. leaflet() fonksiyonu ile paketin çalıştırılması
  3. 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

  1. data: her poligon için tanımlanmış veri, örneğin gelir seviyesi, nüfus vb.
  2. polygons: poligonların işlenmesi için gerekli koordinatlar
  3. plotOrder: poligonların işlenme sırası
  4. bbox: coğrafi verinin sınırları
  5. 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ş.