github linkedin
Leaflet ile İnteraktif Haritalar

Leaflet-R

Leaflet özellikle web tabanlı interaktif haritalama işlemlerinde en sık kullanılan JavaScript kütüphanelerinden birisidir. Rstudio tarafından geliştirilen aynı isimdeki Leaflet paketi ile R üzerinden de Leaflet haritaları oluşturulabilmektedir.

#Gerekli kütüphanelerin aktif hale getirilmesi
library(leaflet)
library(dplyr)

En basit haliyle interaktif bir haritayı aşağıdaki şekilde oluşturabiliriz.

#Leaflet
m <- leaflet(width = 720) %>%
  addTiles() %>%  
  addMarkers(lng=32.860156, lat=39.901967, popup="Kuğulu Park")
m  


Yukarıdaki basit örnekte gereken koordinatları vererek Ankara Kuğulu Park’ı gösterdim. Paket içerisinde kullanılan Syntax’da dikkat edildiği üzere, magrittr paketindeki yaklaşımda olan “%>%” pipeline operatorler kullanılmaktadır. Pipe operatorları kullanmak istemeyen birisi bu kodları iç içe geçmiş fonksiyonlar olarak da ifade edebilir. Yukarıda görüldüğü üzere oluşan Leaflet harita tamamen interaktifdir. Zoom yapılabilmekte, haritadaki diğer alanlar da Google Map uygulamasında olduğu gibi incelenebilmektedir. Haritanızı HTML formatında dışarı aktarmanız durumunda, kendi web sayfanıza kolaylıkla gömüleyebilirsiniz. Haritanın sağ altında harita sağlayıcısı (map provider) adı görülmektedir. Kütüphane otomatik olarak OpenStreetMap harita sağlayıcısını kullanmıştır. Buna benzer birçok sağlayıcıyı bulunmaktadır, her birinin farklı görsel tasarımları vardır. Haritayı oluştururken kullandığımız kodun içerisine istediğimiz harita sağlayıcısı bilgisini girdiğimizde leaflet haritası buna bağlı olarak farklılaşabilmektedir. Aşağıdaki örnekte Stamen sağlayıcısını kullanıyorum. Diğer farklı sağlayıcılara ilişkin bilgiler Leaflet adresinde bulunabilir.

#Stamen Leaflet
m %>% addProviderTiles(providers$Stamen.Toner)


Yukarıdaki yapılan işlem özünde nokta verilerinin görselleştirmesi ile ilgilidir. Fakat analizlerde belirli coğrafi alanı gösteren (il, bölge) renk tonlu tematik (choropleth) haritalar da sıkça kullanılmaktadır. Fakat burada öncelikle leaflet haritasının üstüne göstermek istediğimiz coğrafi alana ilişkin harita dosyasına ihtiyaç bulunmaktadır. Harita dosyası yerleştirildikten sonra geriye incelemek istediğimiz herhangi bir değişkene göre coğrafi alanların renklendirilmesi kalmaktadır.

Aşağıdaki örnekte Türkiye’deki 81 ile ilişkin işsizlik oranı durumlarını (2013 yılı itibariyle) Leaflet üzerinden tematik haritaya dökmek istiyorum. İlk iş olarak öncelikle ESRI Shapefile (.shp) formatındaki harita dosayasını yüklüyorum. Türkiye için il baszndaki Shapefile harita dosyaları internette aramayla kolayca bulunabilmektedir. Shapefile dosyasından farklı olarak JSON veya TopoJSON formatında tutulan verilerde kullanılabilir.

Ardından TÜİK’den il bazında indirmiş olduğum işsizlik oranı verilerini harita dosyamla eşleştiriyorum. Devamında oluşturduğum veri objesini Leaflet kodumun içerisinde belirterek tematik haritayı yaratıyorum.

## OGR data source with driver: ESRI Shapefile 
## Source: "C:/--DOSYALARIM/R-Projects/Github_Page/website-hugo/static/Veri/TUR_NUTS_3.shp", layer: "TUR_NUTS_3"
## with 81 features
## It has 5 fields
## Integer64 fields read as strings:  STAT_LEVL_
# Gerekli kütühanelerin aktif hale getirilmesi
library(readxl)
library(rgdal)

#Verilerin olduğu excel dosyasının import edilmesi
dataset_unemp <- read_excel("TR3-Issizlik.xlsx")

#Harita ShapeFile dosyasının alınması
il_harita <- readOGR(dsn ="TUR_NUTS_3.shp")

Öncelikle indirdiğimiz harita dosyasının içerisinde incelemek istediğimiz verilerin anahtar kodlara uygun olarak yerleştirilmesi gerekmektedir. Harita dosyaları SpatialPolygonDataFrame sınıfında yani “list” tarzı objeler olduğu için sıradan DataFrame objelerinden farklı olarak merge işleminde data slotuna verilerin yerleştirilmesi gerekmektedir.

#Harita verisini ayrı bir isimde kayedilmesi
merged.data.spatial <- il_harita
merged.data.spatial@data$rec <- 1:nrow(merged.data.spatial@data)
merged.data.spatial@data$NUTS_ID <- as.character(merged.data.spatial@data$NUTS_ID)
tmp <- inner_join(merged.data.spatial@data, dataset_unemp, by=c("NUTS_ID"="TRKOD")) %>% arrange(rec)
merged.data.spatial@data <- tmp

Verileri yerleştirdikten sonra geriye görselleştirme esnasında kullanacağımız bazı parametrelere ilişkin objeleri oluşturmak kalmaktadır.

#Lejand kırımlarının belirlenmesi
bins <- c(4,6,8,10,15,20,Inf)
#Lejandın oluşturulması
pal2 <- colorBin("viridis",  domain = merged.data.spatial$ISSIZLIKORAN, bins = bins,
                 reverse = TRUE)

#Etiketlerin oluşturulması
labels <- sprintf(
  "<strong>%s</strong><br/>İşsizlik Oranı: %g",
  merged.data.spatial$ILADI, merged.data.spatial$ISSIZLIKORAN) %>% lapply(htmltools::HTML)

Veriler ve parametreler tamamlandıktan sonra artık leaflet haritamızı oluşturabiliriz. addPolygons fonksiyonunun içerisinde çizgi tipleri, saydamlığa ve bazı interaktivite detaylarına ilişkin parametreleri tanımlıyoruz.

leaflet(options = leafletOptions(minZoom = 5, maxZoom = 18), width=720) %>%
  addPolygons(data= merged.data.spatial, color = "#444444", weight = 1, smoothFactor = 0.5, dashArray="",
              opacity = 1.0, fillOpacity = 0.7, fillColor = ~pal2(merged.data.spatial$ISSIZLIKORAN),
              highlightOptions = highlightOptions(color = "white", weight = 2,
                                                  dashArray = "",
                                                  fillOpacity = 1,
                                                  bringToFront = TRUE),
              label = labels,
              labelOptions = labelOptions(
                style = list("font-weight" = "normal", padding = "3px 8px"),
                textsize = "12px",
                direction = "auto")) %>% 
  
   addLegend(pal = pal2, values = merged.data.spatial$ISSIZLIKORAN, opacity = 0.7, title = NULL,
    position = "bottomright") %>%
  
  
  addProviderTiles(providers$CartoDB.Positron)