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، وهو الكائن الافتراضي للدالة |
field |
الصياغة: Field = Field Layer |
اسم الحقل المحدد، مثل |
raster |
Layer = raster |
كائن RasterBrick، وهو الكائن الافتراضي للحزمة |
multiple raster |
الصياغة: Layer = multiple raster |
كائنات RasterBrick، وهي الكائن الافتراضي للحزمة |
number |
N = number |
العدد الصحيح أو العشري المختار |
string |
S = string |
النص المُدخل في المربع |
longstring |
LS = longstring |
النص المُدخل في المربع، ويمكن أن يكون أطول من النص العادي |
selection |
الصياغة: S = selection first;second;third |
نص العنصر المختار من القائمة المنسدلة |
crs |
C = crs |
نص نظام الإحداثيات المرجعي (CRS) الناتج المختار، بالصيغة: |
extent |
E = extent |
كائن Extent من الحزمة |
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)
الشرح (لكل سطر في السكربت):
Point pattern analysisهي مجموعة الخوارزميةLayerهي الطبقة المتجهية المدخلةSizeمعامل رقمي بقيمة افتراضية 10Outputهي الطبقة المتجهية التي ستُنشئها الخوارزميةlibrary(sp)تحمّل المكتبة spspatpoly = as(Layer, "Spatial")تحوّلها إلى كائن spاستدعِ الدالة
spsampleمن المكتبةspوشغّلها باستخدام المدخلات المعرّفة أعلاه (LayerوSize)أنشئ كائن SpatialPointsDataFrame باستخدام الدالة
SpatialPointsDataFrameأنشئ الطبقة المتجهية الناتجة باستخدام الدالة
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
السكربت مطابق تمامًا للسكربت السابق باستثناء تعديلين:
لا يوجد مُخرَج محدد (حُذف السطر الرابع)
يبدأ السطر الأخير بـ
>، مما يخبر المعالجة بإتاحة الكائن عبر عارض النتائج
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 (عارض النتائج) الخاص بالمعالجة.