Bölüm14 Leaflet ile Poligonlar

14.1 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
  ))


# rte > yüzde50 değişkeni

l <- l %>% 
  mutate(rte1 = case_when(
    rte > 50 ~ 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 = " ")

Haritalarımıza arama yapma gibi bazı ek özellikler de katabiliriz. Bunun için leaflet.extras() paketin kullanacağız. Aşağıda bu işlemi gerçekleştiren kodu bulabilirsiniz.

library(leaflet.extras)
leaflet() %>%
  addTiles() %>%
  addSearchOSM() %>% 
  addReverseSearchOSM() %>% 
  addResetMapButton()

Yukarıdaki kodda bulunan addSearchOSM() fonksiyonu harita üzerinde arama yapmak için bir alan yaratır. Bu alana aramak istediğiniz konumu (şehir, bina vb.) yazarak dünya üzerindeki yerini bulabiliriz. addReverseSearchOSM() fonksinu ise araığımız yerin enlem ve boylam bilgilerini tek bir tıklama ile bize verir. Son olarak addResetMapButton() fonksiyonu ise arama alanın altına bir buton yerleştirerek haritayı orjinal görünümüne geri çevirir.

14.2 Katman Yaratma

Haritalara işlenen bilgileri katmanlar halinde tanımlamak veriyi daha anlaşılır bir hale getirmek için yapılan en temel işlemlerden biridir. Daha önce hazırladığımız Ankara seçim bölgelerini gösteren haritayı seçim bölgelerini group() fonksiyonu kullanarak katmanlar olarak tekrar üreten kodu aşağıda bulabilirsiniz. Bu kod htmltools() paketini de kullanarak ilçe isimlerinde meydana gelebilecek olası isim bozukluklarını da gidermektedir.

library(tidyr)
library(htmltools)
library(dplyr)
library(leaflet)

ankara <- klmn %>% 
  filter (city.y == "Ankara")

# Ankara'daki ilçeleri gösteren baz harita
 ank_base <- ankara %>% 
  leaflet() %>% 
  addProviderTiles("CartoDB") %>% 
  addCircleMarkers(radius = 2,
        label = ~ townp.f)

# Birinci bolge ilcelerine ait veri tabanı

b1 <- ankara %>% 
  filter(sb == "birinci_bolge")

# Birinci blgeye ait ilçelerin katman haline gruplanması

ank_base %>% 
  addCircleMarkers(
    data = b1,
    label = ~ htmlEscape(~ townp.f),
    group = "birinci_bolge"
  )

Şimdi aynı kodu ikinci ve üçüncü bölgeler için yazıp addLayersControl fonksiyonu ile sonlandırıp istediğimiz haritayı oluşturalım.

# renk paletinin tanımlanması
pal <- colorFactor(palette = c("red", "blue", "green"), 
                   levels = c("birinci_bolge", "ikinci_bolge", "ucuncu_bolge"))

# bölgelere ait veritabanlarının oluşturuması
b1 <- ankara %>% 
  filter(sb == "birinci_bolge")
b2 <- ankara %>% 
  filter(sb == "ikinci_bolge")
b3 <- ankara %>% 
  filter(sb == "ucuncu_bolge")

# haritanın çizimi
ank_base %>% 
  addCircleMarkers(
    data = b1,
    label = ~ ~NAME_EN.y.y,
    color = ~ pal (sb),
    group = "birinci_bolge") %>% 
  addCircleMarkers(
    data = b2,
    label = ~ ~NAME_EN.y.y,
    color = ~ pal (sb),
    group = "ikinci_bolge") %>% 
  addCircleMarkers(
    data = b3,
    label = ~ ~NAME_EN.y.y,
    color = ~ pal (sb),
    group = "ucuncu_bolge") %>% 
  addLayersControl(
    overlayGroups = c("birinci_bolge",
                      "ikinci_bolge",
                      "ucuncu_bolge"))

Görüldüğü üzere yukarıdaki kod bölgeleri ayrı katmanlar (layer) halinde haritaya işledi. Sağ üstteki buton sayesinde istediğimiz bölgeyi haritada tutup istemediğimizi çıkartabilir hale geldik.

Son olarak farklı harita sağlayıcıların haritaları ile çizdiğimiz haritanın nasıl göründüğüne bakalım.

# bölgelere ait veritabanlarının oluşturuması
b1 <- ankara %>% 
  filter(sb == "birinci_bolge")
b2 <- ankara %>% 
  filter(sb == "ikinci_bolge")
b3 <- ankara %>% 
  filter(sb == "ucuncu_bolge")
# renk paletinin tanımlanması
pal <- colorFactor(palette = c("red", "blue", "green"), 
                   levels = c("birinci_bolge", "ikinci_bolge", "ucuncu_bolge"))
# leaflet'in çalıştırılması
leaflet() %>% 

# üç değişik harita sağlayıcının haritalarının işlenmesi
addTiles(group = "OSM") %>% 
  addProviderTiles("CartoDB", group = "Carto") %>% 
  addProviderTiles("Esri", group = "Esri") %>% 
  
# haritanın çizimi
  addCircleMarkers(
    data = b1,
    label = ~ ~NAME_EN.y.y,
    color = ~ pal (sb),
    group = "birinci_bolge") %>% 
  addCircleMarkers(
    data = b2,
    label = ~ ~NAME_EN.y.y,
    color = ~ pal (sb),
    group = "ikinci_bolge") %>% 
  addCircleMarkers(
    data = b3,
    label = ~ ~NAME_EN.y.y,
    color = ~ pal (sb),
    group = "ucuncu_bolge") %>% 
 
# harita sağlayıcıları ve çizdiğimiz haritanın birleştirilmesi
  
   addLayersControl(
    baseGroups = c("OSM", "Carto", "Esri"),
    overlayGroups = c("birinci_bolge",
                      "ikinci_bolge",
                      "ucuncu_bolge"))

14.3 Mekansal (spatial) veri ve poligonlar

Aşağıdaki kodlar farklı seçim verileri ile harita çizmeye ait yukarıdaki pratikleri poligon çizimi için gerekli olan addPolygons() argümanı ile birleştiriyor. Bu aşamada kodları inceleyip elinizdeki veri ile farklı haritaları çizmeyi deneyebilirsiniz.

MHP’nin 2015 ve 2018 seçimlerinde aldığı oyları karşılaştıran harita

nc_pal <- colorNumeric(palette = "Blues", 
                   domain = k@data$mhp_comp)

mhp_comp <- k %>% 
  leaflet() %>% 
  addTiles() %>% 
  addProviderTiles("CartoDB") %>% 
      addPolygons(weight = 0.5,
                  color = ~ nc_pal(mhp_comp),
                  label = ~paste0(NAME_EN.y, " (", mhp_comp, ")"),
                  highlight = highlightOptions(weight = 3,
                                              color = "red",
                                              bringToFront = TRUE)) %>% 
                  addLegend(title = "2015-2018 MHP Oy Farkı", pal = nc_pal, values = c(-25:35), 
                  position = "bottomright")
mhp_comp

Yukarıdaki haritaya 1. Yer imleri olarak Recep Tayyip Erdoğan’ın %50’den fazla oy aldığı illeri yer imi olarak işaretleyen ve 2. Farklı harita sağlayıcıları haritaya seçimlik olarak ekleyen

kodu da aşağıda bulabilirsiniz.

#polygon renk
nc_pal <- colorNumeric(palette = "Blues", 
                   domain = k@data$mhp_comp)
#yer imi renk
pal <- colorFactor(palette = "Oranges", domain = c(0:1))

f <- 
  leaflet() %>% 
  addTiles(group = "OSM") %>% 
  addProviderTiles("CartoDB", group = "CartoDB") %>% 
  addProviderTiles("Esri", group = "Esri") %>%
  
  # mhp fark poligonu
  addPolygons(data = k, weight = 1, fillOpacity = 5,
                  color = ~ nc_pal(mhp_comp),
                  label = ~paste0(NAME_EN.y, " (", mhp_comp, ")"),
                  group = "MHP 2018 > 205",
                  highlight = highlightOptions(weight = 3,
                                              color = "red",
                                              bringToFront = FALSE)) %>% 
                  addLegend(title = " ", pal = nc_pal, values = c(-25:35), 
                  position = "bottomright") %>% 

  addCircleMarkers(data = klmn, radius = 3,
                   color = ~pal(rte1.y), 
                   label = ~paste0(NAME_EN.y.y, " (", rte1.y, ")"),
                   group = "Erdoğan > %50") %>% 

addLayersControl(baseGroups = c("OSM", "Carto", "Esri"),
                 overlayGroups = c("MHP 2018 > 2015",
                                  "Erdoğan > %50"))


f