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ı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" "CartoDB.Positron"
## [3] "CartoDB.PositronNoLabels" "CartoDB.PositronOnlyLabels"
## [5] "CartoDB.DarkMatter" "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)
Ş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")
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
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)
## Warning: package 'rgdal' was built under R version 3.4.4
## Loading required package: sp
## Warning: package 'sp' was built under R version 3.4.4
## rgdal: version: 1.3-3, (SVN revision 759)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 2.2.3, released 2017/11/20
## Path to GDAL shared files: C:/Users/user/Documents/R/win-library/3.4/rgdal/gdal
## GDAL binary built with GEOS: TRUE
## Loaded PROJ.4 runtime: Rel. 4.9.3, 15 August 2016, [PJ_VERSION: 493]
## Path to PROJ.4 shared files: C:/Users/user/Documents/R/win-library/3.4/rgdal/proj
## Linking to sp version: 1.3-1
k <- readOGR("TUR_admn_adm2_py_GeneralCommandOfMapping_hh_v3.shp")
## OGR data source with driver: ESRI Shapefile
## Source: "C:\Users\user\OneDrive\Makale\R\toros\leaflet\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/user/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
))
## Warning: package 'bindrcpp' was built under R version 3.4.4
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\user\OneDrive\Makale\R\toros\leaflet\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/user/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 ADM0 ADM1 ADM2 PCODE
## <int> <fct> <fct> <fct> <fct> <fct> <int> <int> <fct>
## 1 0 ALTINÖZÜ ALTINOZU HATAY HATAY TR 31 1131 TR3101131
## 2 1 DEFNE DEFNE HATAY HATAY TR 31 2082 TR3102082
## 3 2 AYDINCIK AYDINCIK MERSIN MERSİN TR 33 1766 TR3301766
## 4 3 REYHANLI REYHANLI HATAY HATAY TR 31 1585 TR3101585
## 5 4 ANTAKYA ANTAKYA HATAY HATAY TR 31 2080 TR3102080
## 6 5 BOZYAZI BOZYAZI MERSIN MERSİN TR 33 1779 TR3301779
## 7 6 ANAMUR ANAMUR MERSIN MERSİN TR 33 1135 TR3301135
## 8 7 BELEN BELEN HATAY HATAY TR 31 1887 TR3101887
## 9 8 GAZİPAŞA GAZIPASA ANTALYA ANTALYA TR 7 1337 TR0701337
## 10 9 ARSUZ ARSUZ HATAY HATAY TR 31 2081 TR3102081
## # ... with 960 more rows, and 4 more variables: 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ş.