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