如何使用R将lat,lon,value形式的数据转换为栅格文件?


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的形式下载)

数据从30 km x 30 km的作物模型(预期在)上输出(来自Miguez等,2012)。

在此处输入图片说明

如何使用GIS相关的元数据(例如地图投影)将它们转换为栅格文件?

理想情况下,该文件将是文本(ASCII?)文件,因为我希望它与平台和软件无关。


作为CSV,这已经 ASCII中的“文本文件”。另外,由于它根本不使用任何投影,因此可能几乎没有要添加的相关元数据(主要是基准)。您能否更具体地说明您要寻求什么样的输出以及打算如何使用它?
ub

我想通过各种地图绘制软件(ArcGIS,Google Maps,Grass,R等)使某人尽可能轻松地使用数据,从而方便重用,例如不需要其他转换步骤。根据GIS文件格式的Wikipedia页面,我推断1)“光栅”文件应具有带有纬度的行名和经度的列名(如图片),以及2)元数据应包括地理信息(拐角位置,覆盖区域)通过数据)。
安倍

这是我在R和GIS上遇到的最好的参考文献之一。非常感谢你!您能为另外一个csv提供lat和long以及正确的proj4string吗?我将非常感谢。

@Nandini不知道正确的proj4string是什么,我怀疑lambert保形:proj +proj=lcc +lat_1=50.0 +lat_2=50.0 +units=km +lon_0=-145.5 +lat_0=1.0。对于另一个csv文件,我不确定您要的是什么-与问题中链接到的csv文件有什么不同,或者由接受的答案产生?
2014年

对我来说是行不通的!我不知道在“ coordinates(pts)=

Answers:


44

需要几个步骤:

  1. 您说这是一个常规的1公里网格,但这意味着纬度不规则。首先,您需要将其转换为常规的网格坐标系,以便X和Y值有规律地间隔。

    一种。将其读入R作为数据帧,其x,y列为yield。

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

    b。使用sp程序包将数据帧转换为SpatialPointsDataFrame,如下所示:

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

    C。通过首先告诉它是什么CRS,然后将其转换到目标,从而转换为常规的km系统。

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

    d。告诉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感谢您安排工作流程。请注意,数据在问题中提供的链接中可用:看看。a,您会发现您对它们的某些假设不正确。(特别是,我搜寻了有关用于创建网格的投影的任何文档,但没有找到。这是一个奇怪的投影,正如您通过绘制点所看到的那样。)
whuber

它非常接近于UTM系统,但是我尝试过的系统都没有足够接近R的常规网格。我半过R的整个EPSG数据库诱惑循环....
Spacedman

如果您能以这种方式发现投影,那将是一次真正的巡回演出!关键是找到一个有效且有效的标准来确定这7,000多个点何时足够接近常规网格(因为它们可能根本无法在任何标准投影中形成完美的网格)。为了快速浏览数据库,应该比较少量距离,例如网格北部的东西向距离与南部的东西距离。那应该迅速消除绝大多数候选人。
ub

3
我遍历了Mathematica 8 支持的所有(默认)投影。它找到了一个投影,其中的点似乎确实落在网格上:阿拉斯加国家平面(1983)10区!这是兰伯特保形圆锥投影。我相信是EPSG 26940。如果您修改它以使其大致位于经度-106的中心,则这些点会形成一个很好的网格。
ub

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,然后进行一些智能的猜测和交叉引用,以了解发生了什么:-)。顺便说一句,@ Spacedman的解释确实很重要:从25度到49度的度量失真等于cos(25)/ cos(49)= 1.38;那是实质性的。
ub

29

自从最后一个问题被回答以来,使用光栅包的rasterFromXYZ功能封装了所有必要的步骤(包括CRS字符串的说明),因此存在一个更简单的解决方案。

library(raster)
rasterFromXYZ(mydata)

1
对经常帮助我的孜孜不倦的@Spacedman表示歉意,但是我认为这个答案值得继承欢乐的绿色勾号。
geotheory,2014年

@geotheory我会选择这个答案,它的功能很棒,但是在我正在使用的数据集上似乎很慢(在op中链接到)
安倍晋三

1
...实际上,它之所以令人窒息/tmp/,是因为当我用尽磁盘空间时,它占用了我的〜400KB文件并创建了一个〜19GB的文件。
安倍

某处可能存在一个n平方的过程。您也许可以通过宽网格对点数据进行分组,分别栅格化每个组,然后merge()将结果汇总在一起。
geotheory,2015年

尽一切应有的尊重,但是这个答案比Spacedman的答案要好得多。
Ghost
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.