R : RasterLayer에서 위도와 경도를 얻는 방법은 무엇입니까?


14

나는 지리 데이터의 절대 초보자이므로 질문이 적절하지 않은 경우 용서하십시오.

NCDC NARR에서 데이터를 다운로드하고 raster패키지를 사용하여 R에로드 할 수있었습니다 . 위도, 경도 및 가치가있는 목록을 얻고 싶습니다. 나는 rasterToPoints()내가 원하는 것을 정확하게해야한다는 것을 이해 하지만 위도 및 경도 값은 이상하게 보입니다.

r <- raster(myfile)
data_matrix <- rasterToPoints(r)
head(data_matrix)
            x       y value
[1,] -5405401 4347242    70
[2,] -5372938 4347242    88
[3,] -5340475 4347242    76
[4,] -5308012 4347242    85
[5,] -5275549 4347242    87
[6,] -5243086 4347242    88

현재 Lambert Conformal Conic (LCC) 인 투영으로 무언가를해야한다고 가정합니다. 래스터에 대한 추가 정보는 다음과 같습니다.

> r
class       : RasterLayer 
dimensions  : 277, 349, 96673  (nrow, ncol, ncell)
resolution  : 32463, 32463  (x, y)
extent      : -5648874, 5680713, -4628777, 4363474  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=lcc +lat_1=50 +lat_2=50 +lat_0=50 +lon_0=-107 +x_0=0 +y_0=0 +a=6371200 +b=6371200 +units=m +no_defs 
data source : mypath-to-file
names       : value

실제 미국 위도 및 경도 값을 얻으려면 어떻게해야합니까?

답변:


14

실제로 "projectRaster"또는 "spTransform"을 사용하여 래스터를 지리적 (십진도) 투영으로 다시 투영해야합니다. 또한 원하는 투영 문자열을 지정하는 CRS sp 정의를 살펴보십시오. "projectRaster"에 대한 도움말의 예제는이를 수행하는 방법에 대해 매우 분명합니다.

래스터 데이터를 SpatialPointsDataFrame 객체로 강제 변환하는 경우 "spTransform"을 사용하여 @ 좌표 슬롯에서 좌표를 가져와 @data 슬롯의 data.frame에 추가합니다. 다음은 그 모습에 대한 예입니다.

library(raster)
library(rgdal) # for spTransform

# Create data
r <- raster(ncols=100, nrows=100)
  r[] <- runif(ncell(r))
  crs(r) <- "+proj=lcc +lat_1=48 +lat_2=33 +lon_0=-100 +ellps=WGS84"
  projection(r)

# Convert raster to SpatialPointsDataFrame
r.pts <- rasterToPoints(r, spatial=TRUE)
  proj4string(r.pts)

# reproject sp object
geo.prj <- "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0" 
r.pts <- spTransform(r.pts, CRS(geo.prj)) 
  proj4string(r.pts)

# Assign coordinates to @data slot, display first 6 rows of data.frame
r.pts@data <- data.frame(r.pts@data, long=coordinates(r.pts)[,1],
                         lat=coordinates(r.pts)[,2])                         
head(r.pts@data)

래스터를 벡터 객체 클래스로 변환하고 메모리 안전 처리를 제공하는 래스터 패키지의 장점을 무효화하는 것은 좋은 방법이 아닙니다. 문제에 대해 실제로 생각하고 올바르게 접근하고 있는지 평가하는 것이 현명합니다. OP가 모든 셀에 대해 [x, y] 좌표가 필요한 이유에 대한 컨텍스트를 제공 한 경우 포럼 커뮤니티는 래스터 환경에서 문제를 유지할 계산 대안을 제공 할 수있었습니다.


1
(데이터 변환을 피하는 것에 대해)주의를 기울이는 한 가지 방법은 원래 래스터 (아마도 매우 거친 그리드)를 투영 해제하고, 투영되지 않은 정도를 커버하는 위도 및 경도 값의 두 그리드를 생성하고 다시 투영하는 것입니다. 원래 그리드의 범위. 벡터 클래스는 생성되지 않습니다. 전적으로 래스터 작업입니다.
whuber

4

셀 중심의 좌표를 가져 와서 공간 개체를 만듭니다.

spts <- rasterToPoints(r, spatial = TRUE)

포인트를 원하는 대상으로 변환하십시오.

library(rgdal)
llprj <-  "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"
llpts <- spTransform(spts, CRS(llprj))

이 SpatialPointsDataFrame에서 값이 이미 열로 복사되었습니다.

print(llpts)

이제 완료하려면 data.frame을 얻으십시오.

x <- as.data.frame(llpts)

SGAT 패키지에는 일반적인 구현이 lonlatFromCell있습니다. 여기의 기능을 참조 하십시오.

https://github.com/SWotherspoon/SGAT/blob/master/R/Raster.R


이것을 시도했지만 다음과 같은 오류 메시지가 나타납니다. > llpts$layer1 <- values(r[[1]]) Error in [[<-. (, name, value = c(NA, NA, NA, NA, NA, : replacement has 96673 rows, data has 95025
data.frame

실제로 속성을 전송할 필요는 없습니다. 제거하겠습니다.
mdsumner

SGAT 패키지 조언 외에, 이것은 내가 제공 한 답변과 예와 정확히 일치하지 않습니까? 좌표는 데이터 슬롯의 data.frame으로 전파되지 않으며 래스터의 값만 전파됩니다. 실제로 좌표는 좌표 슬롯에 유지되며 data.frame에 추가해야합니다.
Jeffrey Evans

감사합니다. as.data.frame 단계를 추가했습니다. 객체의 좌표가 변경 될 수 있기 때문에 좌표를 속성으로 추가하는 것이 끔찍한 조언이라고 생각합니다. 원시 data.frame을 원하면 만드십시오. 나는 정보가 어디에 있는지 상관하지 않을 것입니다. 아마도 당신의 정보를 편집하고 우리는이 답변을 짤 수 있습니다.
mdsumner

OP는 특별히 좌표를 원했고 별도의 data.frame에 저장하는 것이 중복 적이라고 생각합니다. 나는 일반적으로 좌표 슬롯과 중복되기 때문에 주로 데이터 슬롯에 좌표를 추가하는 것을 좋아하지 않습니다. 이 외에, 데이터 슬롯에 정보를 추가하는 것은 "끔찍한 조언"이 아닙니다. 두 개의 좌표계를 원한다면 어떻게해야합니까? 데이터 슬롯에 위도 / 경도를 추가하고 완전히 다른 투영으로 객체를 가질 수 있습니다. 또한 GIS 형식 자체가 아닌 플랫 파일 만 내보내려면 data.frame에 좌표를 추가하고 csv로 저장할 수 있습니다.
Jeffrey Evans

0

거기에 투영 좌표가있는 것으로 보입니다 (위도 / 경도가 일명 GCS 좌표가 아님). 그게 문제라는 것이 분명하지 않았을 것입니다. 이 게시물을 참조하십시오. R에서 지리 좌표계 변환


대답하기 전에 당신이 참조하는 게시물을 잡지 못했습니다. 이것을 중복으로 표시 할 수 있습니다. SpatialPointsDataFrame 강제 및 좌표 할당을 추가하면 약간 다릅니다. 당신의 전화.
Jeffrey Evans

나는 그것을 그렇게 표시하는 것에 대해 생각했지만 다른 사람이 값을 투영해야한다는 것을 모른 채 비슷한 대답을 찾고 있다면 이것이 나타날 수 있다고 생각했습니다. 당신의 대답 외에도 다른 방법으로 갈 수 있습니다 (Upvoted).
jbchurchill 2016

나는 당신이 나열된 출처를 보려고 노력했습니다. 표준 위도 / 경도를 얻기 위해 발행했습니다 lonlat_r <- projectRaster(r, crs="+init=epsg:4326"). 그러나 새로운 래스터의 범위는 -181.3232, 181.4938, -1.590457, 87.76154 (xmin, xmax, ymin, ymax)내가 미국에서 기대하는 것과는 거리가 멀다 (30에서 70에서 -60에서 -160 사이). 나는 무언가를 오해했을 것입니다.
janosdivenyi 2016
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.