فكرة عابرة : خريطة تفاعلية لواردات المملكة


جيوغرافي مهارة


احد اسرار عشقي للغة الـ R هو شعوري بأنه لا يوجد حد لما استطيع فعله بهذه اللغة الرائعة. اليوم سوف استعرض لكم احد تلك الإمكانيات الا وهي صنع تصويرات بيانية تفاعلية. نعم لقد قرأت تلك الجملة بشكل صحيح. R بإمكانه أن يكون تفاعلي. في الحقيقة هناك الكثير من الحزم التي تمكننا من فعل ذلك لكنني لن استعرضها كلها فذلك يستحق كتاب بذاته.

حركة الـ HTMLWIDGETS

مؤخرا انتشرت حركة في وسط مجتمع مطوري حزم لغة R خصوصا المهتمين بالتصوير البياني. تلك الحركة تهدف إلى جلب قوة Java Script الرائعة في صنع مختلف الرسومات والتصويرات البيانية على صفحات الويب و ترويضها لتعمل بتناغم تام مع لغة R . تلك الحركة انجبت لنا ما يعرف الآن بـ HTMLWIDGETS

مثال واردات المملكة

دعنا نحاول ان نمثل واردات المملكة على خريطة تفاعلية حيث يمكننا التصغير و التكبير وحتى سحب الخريطة نفسها. سنقوم بذلك عن طريق اتباع الخطوات التالية :

  1. تحميل المعلومات من موقع هيئة الإحصاء
library("here")
file_path <- here("static", "data", "Saudi_Imports.csv")
sa.imp <-read.csv(file_path, sep = ",", header = TRUE )
  1. إرفاق بعض الحزم المهمة
library("dplyr") # لمعالجة البيانات
library("stringi") # حزمة متخصصة لمعالجة النصوص
library("leaflet") # لرسم الخرائط التفاعلية
library("sp") # حزمة مساعدة للرسم على الخرائط
library("maps") # معلومات عن الدول وعواصمها
library("widgetframe")
  1. حساب مجموع قيمة الواردات إلى المملكة
grouped.imports <- sa.imp %>%
                   group_by(Country.Name) %>%
                   summarise(grand.total = sum(Value))
  1. كتابة دالة لإستخراج احداثيات عاصمة اي دولة
  • نحتاج هذه العملية لرسم الخطوط بين المملكة وباقي الدول و لأن بعض الدول كبيرة جدا يتوجب علينا تحديد بداية كل خط

  • لذلك اخترنا بداية الخط لتكون العاصمة في تلك الدول

get.capital.location <- function(c.n) {
      x <-filter(world.cities, country.etc == c.n, capital == 1)
      return(x[,5:4])
    }
  1. معالجة الأسماء الموجودة في البيانات من هيئة الإحصاء لتتوافق مع حزمة maps
ds<-sapply(stri_trans_totitle(grouped.imports$Country.Name),get.capital.location)
ds.1 <- t(ds)
  1. معالجة بعض اسماء الدول يدويا
ds.1["United Kingdom",] <- get.capital.location("UK")
ds.1["U.s.a",] <- get.capital.location("USA")
ds.1["Sultanate Of Oman",] <- get.capital.location("Oman")
ds.1["Russian Federation",] <- get.capital.location("Russia")
ds.1[,1]<-as.numeric(as.character(ds.1[,1]))
ds.1[,2]<-as.numeric(as.character(ds.1[,2]))
ds.c <- matrix(unlist(ds.1), ncol = 2)
rownames(ds.c) <-rownames(ds.1)
ds.c <- ds.c[!is.na(ds.c[,1]),]
  1. كتابة دالة متخصص في ربط كل إحداثية عاصمة بالرياض
creat.line2sa <- function(x) {
  return(Line(rbind(
    get.capital.location("Saudi Arabia"), x, make.row.names = TRUE
    )))

}
  1. إعداد قائمة الخطوط ومعالجتها لتكون جاهزة للتصوير الجيوغرافي
lines.list <-lapply(seq_along(ds.c[,1]), function(inex, x) {(creat.line2sa(ds.c[inex,]))}, x=ds.c)
  1. اخيرا رسم الخريطة التفاعلية مع جميع خطوط واردات المملكة
mapp<-leaflet() %>% addTiles()  %>% addPolylines(data =SpatialLines(list(Lines(lines.list, "ID"))))
frameWidget(mapp, height = 350, width = '95%')

جرب بنفسك

كامل الكود تجده هنا

comments powered by Disqus