29.4. 부록 D: QGIS R 스크립트 문법
Scuola Superiore Sant’Anna 의 지원으로 마테오 게타(Matteo Ghetta)가 작성함
공간 처리 프레임워크에서 R 스크립트를 작성하는 일은 그 특수 문법 때문에 조금 까다로울 수도 있습니다.
공간 처리 R 스크립트는 그 입력물 과 산출물 을 정의하는 것으로 시작합니다. 각각 그 앞에 2중 해시 문자(##
)를 삽입해야 합니다.
입력물 앞에, 알고리즘을 배치할 그룹을 지정할 수 있습니다. 이미 존재하는 그룹이라면 알고리즘이 해당 그룹에 추가될 것입니다. 존재하지 않는 그룹이라면 해당 그룹을 생성할 것입니다. 다음 예시에서 그룹의 명칭은 My group 입니다:
##My Group=group
29.4.1. 입력물
모든 입력 데이터 및 파라미터를 지정해야 합니다. 입력물의 유형은 여럿 있습니다:
벡터:
##Layer = vector
벡터 필드:
##F = Field Layer
(여기서 ‘Layer’ 는 필드가 속한 입력 벡터 레이어의 명칭입니다)래스터:
##r = raster
테이블:
##t = table
숫자:
##Num = number
문자열:
##Str = string
불(boolean):
##Bol = boolean
드롭다운 메뉴의 항목들은 쌍반점
;
으로 구분되어야만 합니다:##type=selection point;lines;point+lines
29.4.2. 산출물
입력물의 경우와 마찬가지로, 스크립트 시작 부분에서 각 산출물을 정의해야 합니다.
벡터:
##output= output vector
래스터:
##output= output raster
테이블:
##output= output table
플롯(plot):
##output_plots_to_html
(이전 버전에서의 ##showplots)결과물 뷰어 에 R 산출물을 표시하려면, 사용자가 표시하고자 하는 산출물을 생산하는 명령어 앞에
>
문자를 삽입하십시오.
29.4.3. QGIS R 스크립트용 문법 요약
수많은 입력 및 산출 파라미터 유형을 지원합니다.
29.4.3.1. 입력 파라미터 유형
파라미터 |
문법 예시 |
반환하는 객체 |
---|---|---|
vector |
Layer = vector |
sf 객체 (또는 ##load_vector_using_rgdal 을 지정한 경우 SpatialDataFrame 객체) |
vector point |
Layer = vector point |
sf 객체 (또는 ##load_vector_using_rgdal 을 지정한 경우 SpatialDataFrame 객체) |
vector line |
Layer = vector line |
sf 객체 (또는 ##load_vector_using_rgdal 을 지정한 경우 SpatialDataFrame 객체) |
vector polygon |
Layer = vector polygon |
sf 객체 (또는 ##load_vector_using_rgdal 을 사용하는 경우 SpatialPolygonsDataFrame 객체) |
multiple vector |
Layer = multiple vector |
sf 객체 (또는 ##load_vector_using_rgdal 을 지정한 경우 SpatialDataFrame 객체) |
table |
Layer = table |
CVS에서 변환한 데이터프레임으로 |
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 |
선택한 좌표계의 문자열, 서식: |
extent |
E = 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
29.4.3.2. 산출 파라미터 유형
파라미터 |
문법 예시 |
---|---|
vector |
Output = output vector |
raster |
Output = output raster |
table |
Output = output table |
file |
Output = output file |
참고
공간 처리 결과물 뷰어 에서 플롯을 .png
포맷으로 저장할 수도 있고, 또는 알고리즘 인터페이스에서 직접 저장할 수도 있습니다.
29.4.3.3. 스크립트 본문
스크립트 본문은 R 문법을 따르며, 사용자 스크립트에 잘못된 점이 있을 경우 로그 패널에서 그 원인을 찾아볼 수 있습니다.
스크립트에서 모든 추가 라이브러리를 불러와야 한다는 점을 기억하십시오:
library(sp)
29.4.4. 예제
29.4.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
는 기본값이 10인 숫자 파라미터입니다.Output
은 알고리즘이 생성할 벡터 레이어입니다.library(sp)
는 sp 라이브러리를 불러옵니다.spatpoly = as(Layer, "Spatial")
은 입력 레이어를 sp 객체로 변형합니다.sp
라이브러리의spsample
함수를 호출, 앞에서 정의한 입력물을 (Layer
및Size
를) 사용해서 실행합니다.SpatialPointsDataFrame
함수를 사용해서 SpatialPointsDataFrame 객체를 생성합니다.st_as_sf
함수를 사용해서 산출 벡터 레이어를 생성합니다.
끝입니다! QGIS 범례에 있는 벡터 레이어와 함께 알고리즘을 실행하고, 랜덤 포인트의 개수를 선택하십시오. 산출되는 레이어가 사용자 맵에 추가될 것입니다.
29.4.4.2. 래스터 산출물 예시
다음 스크립트는 평범한 기본 크리그 격자법(kriging)을 수행합니다. automap
R 패키지의 autoKrige
함수를 사용해서 입력 포인트 벡터 레이어의 지정 필드로부터 보간한 값들의 래스터 맵을 생성할 것입니다. 먼저 크리그 격자법 모델을 계산한 다음 래스터를 생성할 것입니다. 이 래스터는 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
객체에서 변형해야 할 필요가 없어집니다.
29.4.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
세 번째 줄에서 입력물의 벡터 필드 를 지정하고, 네 번째 줄에서 알고리즘에 테이블을 산출해야 한다고 알려줍니다.
마지막 줄에서 스크립트가 생성한 Stat
객체를 받아 .csv
테이블로 변환할 것입니다.
29.4.4.4. 콘솔 산출물 예시
앞의 예시를 사용해서 테이블을 생성하는 대신 결과물 뷰어 에 결과물을 출력해보겠습니다:
##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
이 스크립트는 두 군데 수정 사항을 제외하면 앞의 것과 완전히 동일합니다:
산출물을 지정하지 않았습니다. (네 번째 줄을 제거했습니다.)
마지막 줄 맨 앞에
>
기호를 삽입했습니다. 결과물 뷰어를 통해 사용할 수 있는 객체를 생성해야 한다고 공간 처리 프레임워크에 알려주는 것입니다.
29.4.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]])
이 스크립트는 벡터 레이어(Layer
)의 필드(Field
)를 입력물로 사용해서 (분포의 정규성을 점검하기 위한) QQ Plot 을 생성합니다.
이 플롯은 공간 처리 결과물 뷰어 에 자동적으로 추가됩니다.