26.2. الملحق د: صياغة سكربتات R في QGIS

بمساهمة Matteo Ghetta - بتمويل من Scuola Superiore Sant'Anna

كتابة سكربتات R في المعالجة (Processing) صعبة بعض الشيء بسبب صياغتها الخاصة.

يبدأ سكربت R للمعالجة بتعريف المدخلات و المخرجات، ويُسبق كل منها بعلامتي الشباك (##).

يمكن قبل المدخلات تحديد المجموعة التي ستوضع فيها الخوارزمية. فإذا كانت المجموعة موجودة مسبقًا أُضيفت الخوارزمية إليها، وإلا أُنشئت المجموعة. في المثال أدناه، اسم المجموعة هو My group:

##My Group=group

26.2.1. المدخلات

يجب تحديد جميع بيانات المدخلات ومعاملاتها. وهناك عدة أنواع من المدخلات:

  • متجهي: ##Layer = vector

  • حقل متجهي: ##F = Field Layer (حيث Layer هو اسم طبقة متجهية مدخلة ينتمي إليها الحقل)

  • شبكي: ##r = raster

  • جدول: ##t = table

  • رقم: ##Num = number

  • نص: ##Str = string

  • منطقي: ##Bol = boolean

  • عناصر في قائمة منسدلة. يجب الفصل بين العناصر بفواصل منقوطة ;: ##type=selection point;lines;point+lines

26.2.2. المخرجات

كما هو الحال مع المدخلات، يجب تعريف كل مُخرَج في بداية السكربت:

  • متجهي: ##output= output vector

  • شبكي: ##output= output raster

  • جدول: ##output= output table

  • الرسوم البيانية: ##output_plots_to_html (‏##showplots في الإصدارات السابقة)

  • لعرض مخرجات R في Result Viewer (عارض النتائج)، ضع > أمام الأمر الذي تريد عرض مخرجاته.

26.2.3. ملخص صياغة سكربتات R في QGIS

تتوفر عدة أنواع من معاملات المدخلات والمخرجات.

26.2.3.1. أنواع معاملات المدخلات

المعامل

مثال على الصياغة

الكائنات المُعادة

vector

Layer = vector

كائن sf (أو كائن SpatialDataFrame إذا حُدِّد ##load_vector_using_rgdal)

vector point

الصياغة: Layer = vector point

كائن sf (أو كائن SpatialDataFrame إذا حُدِّد ##load_vector_using_rgdal)

vector line

الصياغة: Layer = vector line

كائن sf (أو كائن SpatialDataFrame إذا حُدِّد ##load_vector_using_rgdal)

vector polygon

الصياغة: Layer = vector polygon

كائن sf (أو كائن SpatialPolygonsDataFrame إذا استُخدم ##load_vector_using_rgdal)

multiple vector

الصياغة: Layer = multiple vector

كائن sf (أو كائنات SpatialDataFrame إذا حُدِّد ##load_vector_using_rgdal)

table

Layer = table

إطار بيانات (dataframe) محوَّل من csv، وهو الكائن الافتراضي للدالة read.csv

field

الصياغة: Field = Field Layer

اسم الحقل المحدد، مثل "Area"

raster

Layer = raster

كائن RasterBrick، وهو الكائن الافتراضي للحزمة raster

multiple raster

الصياغة: Layer = multiple raster

كائنات RasterBrick، وهي الكائن الافتراضي للحزمة raster

number

N = number

العدد الصحيح أو العشري المختار

string

S = string

النص المُدخل في المربع

longstring

LS = longstring

النص المُدخل في المربع، ويمكن أن يكون أطول من النص العادي

selection

الصياغة: S = selection first;second;third

نص العنصر المختار من القائمة المنسدلة

crs

C = crs

نص نظام الإحداثيات المرجعي (CRS) الناتج المختار، بالصيغة: "EPSG:4326"

extent

E = extent

كائن Extent من الحزمة raster، ويمكنك استخراج القيم بالشكل E@xmin

point

P = point

عند النقر على الخريطة تحصل على إحداثيات النقطة

file

F = file

مسار الملف المختار، مثل "/home/matteo/file.txt"

folder

F = folder

مسار المجلد المختار، مثل "/home/matteo/Downloads"

يمكن أن يكون المعامل اختياريًا (OPTIONAL)، أي يمكن تجاهله.

لجعل أحد المدخلات اختياريًا، أضف النص optional قبل المُدخل، مثل:

##Layer = vector
##Field1 = Field Layer
##Field2 = optional Field Layer

26.2.3.2. أنواع معاملات المخرجات

المعامل

مثال على الصياغة

vector

الصياغة: Output = output vector

raster

الصياغة: Output = output raster

table

الصياغة: Output = output table

file

الصياغة: Output = output file

ملاحظة

يمكنك حفظ الرسوم البيانية بصيغة png من Processing Result Viewer (عارض نتائج المعالجة)، أو يمكنك اختيار حفظ الرسم البياني مباشرة من واجهة الخوارزمية.

26.2.3.3. نص برمجي

يتبع متن السكربت صياغة R، ويمكن أن تساعدك لوحة Log (السجل) إذا كان في السكربت خطأ ما.

تذكّر أن عليك تحميل جميع المكتبات الإضافية داخل السكربت:

library(sp)

26.2.4. أمثلة

26.2.4.1. مثال بمخرجات متجهية

لنأخذ خوارزمية من المجموعة المتاحة على الإنترنت تُنشئ نقاطًا عشوائية ضمن امتداد طبقة مدخلة:

##Point pattern analysis=group
##Layer=vector polygon
##Size=number 10
##Output=output vector
library(sp)
spatpoly = as(Layer, "Spatial")
pts=spsample(spatpoly,Size,type="random")
spdf=SpatialPointsDataFrame(pts, as.data.frame(pts))
Output=st_as_sf(spdf)

الشرح (لكل سطر في السكربت):

  1. Point pattern analysis هي مجموعة الخوارزمية

  2. Layer هي الطبقة المتجهية المدخلة

  3. Size معامل رقمي بقيمة افتراضية 10

  4. Output هي الطبقة المتجهية التي ستُنشئها الخوارزمية

  5. library(sp) تحمّل المكتبة sp

  6. spatpoly = as(Layer, "Spatial") تحوّلها إلى كائن sp

  7. استدعِ الدالة spsample من المكتبة sp وشغّلها باستخدام المدخلات المعرّفة أعلاه (Layer و Size)

  8. أنشئ كائن SpatialPointsDataFrame باستخدام الدالة SpatialPointsDataFrame

  9. أنشئ الطبقة المتجهية الناتجة باستخدام الدالة st_as_sf

هذا كل شيء! شغّل الخوارزمية فقط مع طبقة متجهية موجودة في مفتاح QGIS، واختر عدد النقاط العشوائية. ستُضاف الطبقة الناتجة إلى خريطتك.

26.2.4.2. مثال بمخرجات شبكية

يُجري السكربت التالي استيفاء كريغينغ عاديًا (ordinary kriging) بسيطًا لإنشاء خريطة شبكية من القيم المستوفاة من حقل محدد في الطبقة المتجهية النقطية المدخلة، باستخدام الدالة autoKrige من حزمة R المسماة automap. سيحسب أولًا نموذج الكريغينغ ثم يُنشئ طبقة شبكية. تُنشأ الطبقة الشبكية باستخدام الدالة raster من حزمة R المسماة raster:

##Basic statistics=group
##Layer=vector point
##Field=Field Layer
##Output=output raster
##load_vector_using_rgdal
require("automap")
require("sp")
require("raster")
table=as.data.frame(Layer)
coordinates(table)= ~coords.x1+coords.x2
c = Layer[[Field]]
kriging_result = autoKrige(c~1, table)
prediction = raster(kriging_result$krige_output)
Output<-prediction

باستخدام ##load_vector_using_rgdal تصبح الطبقة المتجهية المدخلة متاحة على شكل كائنات SpatialDataFrame، فنتجنب الحاجة إلى تحويلها من كائن sf.

26.2.4.3. مثال بمخرجات جدولية

لنعدّل الخوارزمية Summary Statistics بحيث يكون المُخرَج ملف جدول (csv).

متن السكربت هو التالي:

##Basic statistics=group
##Layer=vector
##Field=Field Layer
##Stat=Output table
Summary_statistics<-data.frame(rbind(
    sum(Layer[[Field]]),
    length(Layer[[Field]]),
    length(unique(Layer[[Field]])),
    min(Layer[[Field]]),
    max(Layer[[Field]]),
    max(Layer[[Field]])-min(Layer[[Field]]),
    mean(Layer[[Field]]),
    median(Layer[[Field]]),
    sd(Layer[[Field]])),
  row.names=c("Sum:","Count:","Unique values:","Minimum value:","Maximum value:","Range:","Mean value:","Median value:","Standard deviation:"))
colnames(Summary_statistics)<-c(Field)
Stat<-Summary_statistics

يحدد السطر الثالث Vector Field (الحقل المتجهي) في المدخلات، ويخبر السطر الرابع الخوارزمية بأن المُخرَج يجب أن يكون جدولًا.

يأخذ السطر الأخير الكائن Stat المُنشأ في السكربت ويحوّله إلى جدول csv.

26.2.4.4. مثال بمخرجات في وحدة التحكم

يمكننا استخدام المثال السابق، وبدلًا من إنشاء جدول نطبع النتيجة في Result Viewer (عارض النتائج):

##Basic statistics=group
##Layer=vector
##Field=Field Layer
Summary_statistics<-data.frame(rbind(
sum(Layer[[Field]]),
length(Layer[[Field]]),
length(unique(Layer[[Field]])),
min(Layer[[Field]]),
max(Layer[[Field]]),
max(Layer[[Field]])-min(Layer[[Field]]),
mean(Layer[[Field]]),
median(Layer[[Field]]),
sd(Layer[[Field]])),row.names=c("Sum:","Count:","Unique values:","Minimum value:","Maximum value:","Range:","Mean value:","Median value:","Standard deviation:"))
colnames(Summary_statistics)<-c(Field)
>Summary_statistics

السكربت مطابق تمامًا للسكربت السابق باستثناء تعديلين:

  1. لا يوجد مُخرَج محدد (حُذف السطر الرابع)

  2. يبدأ السطر الأخير بـ >، مما يخبر المعالجة بإتاحة الكائن عبر عارض النتائج

26.2.4.5. مثال برسم بياني

لإنشاء رسوم بيانية، عليك استخدام المعامل ##output_plots_to_html كما في السكربت التالي:

##Basic statistics=group
##Layer=vector
##Field=Field Layer
##output_plots_to_html
####output_plots_to_html
qqnorm(Layer[[Field]])
qqline(Layer[[Field]])

يستخدم السكربت حقلًا (Field) من طبقة متجهية (Layer) مُدخلًا، ويُنشئ رسم QQ Plot (لاختبار اعتدالية التوزيع).

يُضاف الرسم البياني تلقائيًا إلى Result Viewer (عارض النتائج) الخاص بالمعالجة.