R을 사용하여 위도, 경도 값 형식의 데이터를 래스터 파일로 변환하는 방법은 무엇입니까?


40

미국 대륙의 km 격자에 대한 데이터 값이 있습니다. 열은 "위도", "경도"및 "관측"입니다. 예 :

"lat"    "lon"     "yield"
 25.567  -120.347  3.6 
 25.832  -120.400  2.6
 26.097  -120.454  3.4
 26.363  -120.508  3.1
 26.630  -120.562  4.4

또는 R 데이터 프레임으로 :

mydata <- structure(list(lat = c(25.567, 25.832, 26.097, 26.363, 26.63), 
lon = c(-120.347, -120.4, -120.454, -120.508, -120.562), 
yield = c(3.6, 2.6, 3.4, 3.1, 4.4)), .Names = c("lat", 
"lon", "yield"), class = "data.frame", row.names = c(NA, -5L))

(전체 데이터 세트는 여기 에서 CSV로 다운로드 할 수 있습니다 )

데이터는 30km x 30km 그리드 ( Miguez et al 2012 ) 의 작물 모델 (출력 예정)에서 출력됩니다 .

여기에 이미지 설명을 입력하십시오

지도 투영과 같은 GIS 관련 메타 데이터를 사용하여 래스터 파일로 변환하려면 어떻게해야합니까?

플랫폼과 소프트웨어에 독립적이기 때문에 파일은 텍스트 (ASCII?) 파일이 이상적입니다.


CSV,이 이미 입니다 ASCII에서 "텍스트 파일". 또한 투영을 전혀 사용하지 않으므로 추가 할 관련 메타 데이터가 거의 없을 수 있습니다 (대부분). 어떤 종류의 결과물을 찾고자하는지에 대해 좀 더 구체적으로 설명해 주시겠습니까?
whuber

다른 변환 소프트웨어 (ArcGIS, Google Maps, Grass, R 등)와 함께 데이터를 사용하여 가능한 한 쉽게 변환하여 추가 변환 단계가 필요하지 않아 재사용을 용이하게하고 싶습니다. GIS 파일 형식 의 Wikipedia 페이지 를 기준으로 1) "래스터"파일에는 이미지와 같이 위도와 열 이름이 경도 인 행 이름이 있어야하며 2) 메타 데이터에는 지리적 정보 (모서리의 위치, 해당 지역이 포함됨)가 포함되어야합니다 데이터 별).
Abe

이것은 내가 R과 GIS에서 접한 최고의 참조 중 하나입니다. 대단히 감사합니다! 올바른 proj4string으로 위도 및 경도가 다른 CSV를 제공 할 수 있습니까? 정말 고맙겠습니다.

@ Nandini 올바른 proj4string이 무엇인지 확실하지 않으면 lambert conformal이proj +proj=lcc +lat_1=50.0 +lat_2=50.0 +units=km +lon_0=-145.5 +lat_0=1.0 의심 됩니다. 다른 CSV 파일과 관련하여 무엇을 요구하는지 잘 모르겠습니다. 문제에 링크 된 파일과 어떻게 다릅니 까? 허용 된 답변으로 생성 된 것입니까?
Abe

나를 위해 작동하지 않습니다! "coordinates (pts) = ~ x + y"에 "x"와 "y"를 무엇을 입력해야할지 모르겠습니다.

답변:


44

몇 가지 단계가 필요합니다.

  1. 규칙적인 1km 그리드라고 말하면 위도는 규칙적이지 않습니다. 먼저 정규 그리드 좌표 시스템으로 변환하여 X 및 Y 값이 정기적으로 간격을 두어야합니다.

    에이. 열 x, y, 수율로 데이터 프레임으로 R로 읽습니다.

    pts = read.table("file.csv",......)

    비. sp 패키지를 사용하여 데이터 프레임을 SpatialPointsDataFrame으로 변환하십시오.

    library(sp)
    library(rgdal)
    coordinates(pts)=~x+y

    씨. 먼저 CRS가 무엇인지 말한 다음 일반 km 시스템으로 변환 한 다음 목적지로 spTransform하십시오.

    proj4string(pts)=CRS("+init=epsg:4326") # set it to lat-long
    pts = spTransform(pts,CRS("insert your proj4 string here"))

    디. R에게 이것이 격자로 표시되어 있다고 말합니다.

    gridded(pts) = TRUE

    이 시점에서 좌표가 규칙적인 격자에 있지 않으면 오류가 발생합니다.

  2. 이제 래스터 패키지를 사용하여 래스터로 변환하고 CRS를 설정하십시오.

    r = raster(pts)
    projection(r) = CRS("insert your proj4 string here")
  3. 이제 살펴보십시오 :

    plot(r)
  4. 이제 래스터 패키지를 사용하여 geoTIFF 파일로 작성하십시오.

    writeRaster(r,"pts.tif")

이 geoTIFF는 모든 주요 GIS 패키지에서 읽을 수 있어야합니다. 여기서 명백히 누락 된 부분은 변환 할 proj4 문자열입니다. 이것은 아마도 일종의 UTM 참조 시스템 일 것입니다. 더 이상의 데이터없이 말하기가 어렵습니다 ...


+1 워크 플로를 마련해 주셔서 감사합니다. 질문에 제공된 링크에서 데이터를 사용할 수 있습니다. 살펴보십시오. 아쉽게도, 그들에 대한 당신의 가정 중 일부가 틀렸다는 것을 알게 될 것입니다. (특히 그리드를 만드는 데 사용되는 투영 에 대한 문서를 찾았지만 아무것도 찾지 못했습니다. 점을 그려서 볼 수 있듯이 이상한 투영입니다.)
whuber

UTM 시스템에 매우 가깝지만, 내가 시도한 시스템 중 어느 것도 R이 그리드를 그릴 수있는 일반 그리드에 충분히 가깝지 않습니다. 나는 R의 전체 epsg 데이터베이스를 반복하는 유혹을 느낍니다 ....
Spacedman

그런 식으로 프로젝션을 발견 할 수 있다면 그것은 진정한 투어 디 포스가 될 것입니다! 핵심은이 7,000 개 이상의 포인트가 일반 그리드에 놓기에 충분히 가까운 시기를 결정하는 효과적이고 효율적인 기준을 찾는 것입니다 (표준 프로젝션에서 전혀 완벽한 그리드를 형성하지 못할 수도 있기 때문에). 데이터베이스를 빠르게 실행하려면 그리드 북쪽의 동서 거리와 남쪽의 동서 거리와 같은 적은 수의 거리를 비교하면 충분합니다. 그것은 대다수의 후보자를 빨리 제거해야합니다.
whuber

3
Mathematica 8에서 지원하는 모든 (기본) 투영법을 살펴 보았습니다 . 점이 실제로 그리드에 떨어지는 것처럼 보입니다. Alaska State Plane (1983) Zone 10! 이것은 Lambert Conformal Conic 투영입니다. EPSG 26940 이라고 생각합니다 . 대략 경도 -106의 중심에 오도록이 점을 수정하면 점이 꽤 좋은 그리드를 형성합니다.
whuber

1
아베, 당신은 웹 페이지를 읽는 것을 의미합니까? 이었다 r = Import[ "https://ebi-forecast.igb.illinois.edu/bety/miscanthusyield.csv", "Data"];. 나중에 data = Rest[r]; ListPlot[data[[;; , {3, 2}]]](또는 ListPointPlot3D[data[[;; , {3, 2, 4}]]]) 를 통해 포인트의 빠른 플롯을 얻을 수 있습니다 . 재 투영의 경우에 대한 도움말로 GeoGridPosition시작한 다음 지능적인 추측 및 상호 참조를 수행하여 진행 상황을 파악하십시오. :-). BTW, @Spacedman의 설명은 실제로 관련이 있습니다. 25에서 49 도의 메트릭 왜곡은 cos (25) / cos (49) = 1.38과 같습니다. 그것은 실질적입니다.
whuber

29

질문에 마지막으로 답변 한 이후, rasterFromXYZ필요한 모든 단계 (CRS 문자열 지정 포함)를 캡슐화 하는 래스터 패키지 기능을 사용하면 훨씬 쉬운 솔루션이 존재합니다 .

library(raster)
rasterFromXYZ(mydata)

1
자주 도움을 주신 지칠 줄 모르는 @Spacedman에게 사과하지만이 답변은 유쾌한 녹색 진드기를 물려받을 가치가 있다고 생각합니다.
geotheory

@geotheory이 답변을 선택합니다. 훌륭한 기능이지만 사용중인 데이터 세트에서 매우 느려 보입니다 (Op에 연결됨)
Abe

1
... 실제로 ~ 400KB 파일을 가져 와서 /tmp/디스크 공간이 부족하면 ~ 19GB 의 파일을 생성했기 때문에 질식했습니다 .
Abe

아마도 어딘가에 n 제곱 프로세스가있을 것입니다. 넓은 그리드로 점 데이터를 그룹화하고 각 그룹을 개별적으로 래스터 화 한 다음 merge()결과를 함께 묶을 수 있습니다.
geotheory

모든면에서 존중하지만이 대답은 Spacedman보다 훨씬 낫습니다.
유령
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.