我在美国大陆的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公里x 30公里的网格(打算在上面)的作物模型(来自Miguez等,2012)。



如何将它们转换为具有GIS相关元数据(例如地图投影)的栅格文件?文本(ASCII?)文件,因为我希望它独立于平台和软件。

评论

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

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

这是我在R和GIS上遇到的最好的参考文献之一。非常感谢你!您能否提供另一个lat和long并带有正确proj4string的csv?我真的很感激。

@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文件有何不同,或者由接受的答案产生?

对我来说是行不通的!我不知道在“ coordinates(pts)=〜x + y”上加上“ x”和“ y”

#1 楼

需要几个步骤:



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

a。将其读入R作为数据框,其中包含x,y和yield列。

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


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

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


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

d。告诉R这是网格化的:

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


此时,如果坐标不在良好的规则网格上,则会出现错误。

现在使用栅格数据包将其转换为栅格并设置其CRS: br />
gridded(pts) = TRUE



现在使用栅格数据包将其写为geoTIFF文件:

r = raster(pts)
projection(r) = CRS("insert your proj4 string here")



此geoTIFF在所有主要GIS软件包中均应可读。这里显而易见的缺失部分是proj4字符串要转换为:这可能是某种UTM参考系统。没有更多数据很难说...

评论


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

– hu
2012年2月9日在13:38

它非常接近于UTM系统,但是我尝试过的系统都没有一个足够接近常规网格的R网格系统。我有点想遍历R的整个epsg数据库...。

– Spacedman
2012年2月9日在14:23

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

– hu
2012年2月9日14:32

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

– hu
2012-2-10 15:32



安倍,您的意思是阅读网页吗?它是r = Import [“ https://ebi-forecast.igb.illinois.edu/bety/miscanthusyield.csv”,“数据”];。之后,您可以通过data = Rest [r];快速获得这些点。 ListPlot [data [[;; ,{3,2}]]]](或ListPointPlot3D [data [[;; {3,2,4}]]]))。对于重新投影,请从GeoGridPosition的帮助开始,然后进行一些智能的猜测和交叉引用,以了解发生了什么事情:-)。顺便说一句,@ Spacedman的解释确实是相关的:从25度到49度的度量失真等于cos(25)/ cos(49)= 1.38;那是实质性的。

– hu
2012-2-10 22:14



#2 楼

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

library(raster)
rasterFromXYZ(mydata)


评论


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

–地理理论
2014年7月31日12:57

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

–安倍
2015年4月15日14:52



...事实上,它之所以令人窒息,是因为它占用了我约400KB的文件,并在/ tmp /中创建了一个文件,当我磁盘空间不足时,该文件约为19GB。

–安倍
15年4月15日在15:12

某处可能有一个n平方的过程。您也许可以通过宽网格对点数据进行分组,分别栅格化每个组,然后将结果合并在一起。

–地理理论
15年4月15日在21:22



尽一切应有的尊重,但是这个答案比Spacedman的答案要好得多。

–鬼
17年5月25日在19:39