내 질문은 점의 위치에서 래스터에서 값을 추출하는 것입니다. 함수 추출을 사용하면 이것은 매우 쉽고, 함수는 포인트의 모든 변수 값을 가진 데이터 프레임을 제공합니다. 해당 데이터 프레임에 각 점의 좌표를 갖고 싶습니다. 어떻게 그렇게 할 수 있습니까? 래스터에서 값을 추출 할 때 위치 포인트의 열도 추가한다고 R에 말할 수 있습니까?
이것은 내 절차입니다.
presencias=read.table("c:/SDM_R/presencias/P_lentiscus_pres.csv",header=TRUE,sep=";")
lista_variables <-list.files(path="Variables_modelizacion/solo_ascii",pattern='*.asc',full.names=TRUE)
variables <- stack(lista_variables)
variables_presencia<-extract(variables, presencias)
결과는 다음과 같습니다.
> bio1 bio12 bio18 bio2 bio4
> 90 875 165 95 4886
> 115 1085 158 83 4075
> 135 1153 153 67 3402
> 85 1026 137 99 5203
> 96 667 128 108 5823
> 98 531 109 113 6305
> 132 450 63 123 6598
> 132 569 104 106 5963
> 95 814 196 98 5571
> 146 474 39 114 6603
그러나 좌표 데이터가있는 두 개의 열이 더 필요합니다 (그러나 csv 추출 위치 테이블의 다른 열 일 수 있음).
너무 감사합니다.
답변
그 가정 presencias
과 variables
같은 돌출부를 공유, 이것은 쉬운 작업이 될 것이다. 데이터 프레임을 SpatialPointsDataFrame 객체 read.table()
로 변환하기 위해 명령문 뒤에 이러한 코드 줄을 추가하는 것이 좋습니다 presencias
(예와 다른 경우 x 및 y 좌표를 포함하는 열의 이름을 수정하십시오).
coordinates(presencias) <- c("x", "y")
재현 가능한 예를 제공하기 위해 대답의 범위를 조금 더 열려고합니다. 우선, 독일에서 어느 정도 중요한 위치 에이 ESRI shapefile 을 다운로드하여 압축을 푸십시오 . 이것들은 나중에 포인트 데이터로 사용됩니다. 또한 패키지가 필요합니다 dismo
, rgdal
그리고 raster
이 짧은 예를 들어, 그래서이 라이브러리 (및 모든 종속성) 로컬 하드 드라이브에 설치되어 있는지 확인하십시오.
필요한 패키지를로드하는 것으로 시작하겠습니다.
library(dismo)
library(rgdal)
library(raster)
다음으로 샘플 RasterLayer를 생성해야합니다. 우리의 경우, 우리는 독일의 물리적지도를 얻기 위해 패키지에서 gmap()
기능을 사용할 것 dismo
입니다.
germany.mrc <- gmap("Germany")
이제 readOGR
R의 rgdal
패키지 를 통해 포인트 셰이프 파일을 가져올 수 있습니다 . 데이터 소스 이름 (dsn = …)을 조정하십시오. 특정 경우에는 전체 투 사물이 더 이상 사용되지 않습니다. 그러나 점 데이터를 독일 RasterLayer로 오버레이하려면이 예에서 수행해야합니다.
# Import SpatialPointsDataFrame
germany.places <- readOGR(dsn = "/path/to/shapefile", layer = "places")
# Define shapefile's current CRS
projection(germany.places) <- CRS("+proj=lonlat +ellps=WGS84")
# Reproject to RasterLayer's CRS
germany.places.mrc <- spTransform(germany.places, CRS(projection(germany.mrc)))
우리는 포인트 데이터의 거대한 크기를 줄이기 위해 독일에서 10 곳의 무작위 샘플을 추출 할 것입니다. 이것은 우리의 목적에 충분해야합니다.
set.seed(35)
germany.places.mrc.sample <- germany.places.mrc[sample(nrow(germany.places.mrc), 10), ]
이제 준비물이 완성되었으므로 무작위로 샘플링 한 10 개의 점이 속하는 특정 픽셀의 값을 추출하기 시작했습니다.
data <- data.frame(coordinates(germany.places.mrc.sample),
germany.places.mrc.sample$name,
extract(germany.mrc, germany.places.mrc.sample))
names(data) <- c("x", "y", "name", "value")
포인트 좌표를 추출 된 픽셀 값과 병합하려면 SpatialPointsDataFrame의 좌표를 포함하는 데이터 프레임을 설정하면됩니다. 그게 다야!
data
x y name value
1 1073490.3 6513446 Veitsteinbach 208
2 1269100.8 6156690 Assenhausen 231
3 1336757.5 6246284 Frauenwahl 195
4 828579.9 6634122 Altenhof 189
5 1571418.1 6662558 Wohla 151
6 1192299.4 6864087 Flechtorf 170
7 976270.0 6362050 Hilsenhain 208
8 1117416.4 6092146 Nestbaum 175
9 1274192.0 6344490 Wappeltshofen 236
10 878488.2 6839843 Leeden 208
답변
확실히 당신은 할 수 있습니다 :
variables_presencia$x <- presencias['x']
variables_presencia$y <- presencias['y']
(좌표 데이터가 ‘x’와 ‘y’라는 두 열에 있다고 가정)