使用R中的Polygon shapefile从栅格中提取栅格


13

我是R的新手,正在使用raster包。我从现有栅格文件中提取多边形时遇到问题。如果我用

extract(raster, poly_shape)

栅格上的函数始终会创建包含数据的列表。我真正想要的是提取另一个可以再次使用ArcGIS加载的栅格文件。阅读更多内容后,我认为裁剪功能才是我真正需要的。但是当我尝试使用此功能时

crop(raster, poly_shape)

我收到此错误:

Error in .local(x, y, ...) : extents do not overlap
In addition: Warning message:
In intersect(extent(x), extent(y)) : Objects do not overlap

这两个函数的文件raster和poly_shape相同。你能告诉我这里有什么问题吗?裁剪功能创建另一个栅格而不是列表是否正确?

编辑:range()函数不适用于我。我仍然遇到相同的错误。但是我确信这两个数据集会重叠!随着

extract(raster, poly_shape)

我从中得到正确的数据。只是列表而不是像我想要的栅格一样。我之前只是将数据集加载到ArcGIS中,它们非常吻合,所以我没有检查投影。现在我尝试

projection(raster) # "+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs"
projection(poly_shape) # "+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs"

您会看到这些投影不合适。提取功能似乎能够以正确的方式自动转换文件。我知道这是因为我做了以下事情:

  • 我也切出了在ArcGIS中也在R中提取的多边形的确切部分
  • 我计算了提取的R多边形(列表)的所有值的总和
  • 我计算了在ArcGIS中剪切的所有栅格像元的总和

2具有完全相同的结果,因此我想得出的结论应该是提取函数确实可以正确工作。现在我有2种选择:

  1. 我需要一种使栅格再次脱离提取列表的方法,或者
  2. 2个数据集(栅格+多边形形状)需要使用相同的注入,并且裁剪函数应该起作用

您建议在这里做什么?


如果它是4波段RGB栅格怎么办?乐队至今为止迷路了……
多丽丝(Doris)

欢迎使用GIS SE!作为新用户,请务必进行简短导览。然后考虑编辑您的答案以提供其他信息和参考。请参阅我如何写一个好的答案?有关更多信息。
安迪

如果您有新问题,请单击“ 提问”按钮提问。如果它有助于提供上下文,请包括此问题的链接。- 评分
埃里克·

Answers:


19

提取功能的行为完全正确。您可以强制裁切功能使用多边形的范围,然后对对象进行遮罩以返回表示多边形区域的精确栅格。如果您继续收到该错误,则意味着您的数据实际上并不重叠。

请记住,R不会执行“即时”投影,因此,请检查您的投影。您可以使用“ extent()”功能检查扩展区是否重叠。

这是一个使用多边形范围进行裁剪然后使用“栅格化”多边形掩盖所得栅格的示例。

# Add required packages
require(raster)
require(rgeos)
require(sp)

# Create some data using meuse 
data(meuse)
  coordinates(meuse) <- ~x+y
    proj4string(meuse) <- CRS("+init=epsg:28992")
data(meuse.grid)
  coordinates(meuse.grid) = ~x+y
    proj4string(meuse.grid) <- CRS("+init=epsg:28992")
      gridded(meuse.grid) = TRUE    
        r <- raster(meuse.grid) 
          r[] <- runif(ncell(r))

# Create a polygon
f <- gBuffer(meuse[10,], byid=FALSE, id=NULL, width=250, 
                         joinStyle="ROUND", quadsegs=10)   

# Plot full raster and polygon                       
plot(r)
  plot(f,add=T)

# Crop using extent, rasterize polygon and finally, create poly-raster
#          **** This is the code that you are after ****  
cr <- crop(r, extent(f), snap="out")                    
  fr <- rasterize(f, cr)   
    lr <- mask(x=cr, mask=fr)

# Plot results
plot(lr)
  plot(f,add=T)

4
extract()确实会即时执行重投影,而crop()则不会。这可能会引起一些混乱
mdsumner 2014年

@Jefferey crop()和mask()仅根据多边形的矩形范围来裁剪栅格,而不会从多边形的边界内对其进行裁剪。知道什么命令可以将栅格裁剪到给定多边形的边界内吗?
csheth

1
@Chintan Sheth,要使遮罩成为多边形内的子集,您需要具有一个代表多边形内值的栅格。这就是为什么要栅格化子集多边形然后对其进行遮罩的原因。裁剪步骤是将栅格的范围减小到与子集多边形相同的范围,如果过去跳过子集,将引发范围不匹配错误。
Jeffrey Evans,2015年

spTransformsp包(有时会自动与其他空间R包一起加载)中的允许重新投影,以使两个文件位于同一投影中,例如。good_poly=spTransform(spolygon, CRSobj=crs(raster_file))
user3386170

@ user3386170,是吗?不知道你在做什么。这个问题是在光栅包只是在某些功能内“即时投影”中添加时发生的。这些功能以前在投影不匹配时抛出错误,但是此帖子来自2014年。您还应该注意,在使用sp :: spTransform()时始终加载rgdal,因为它在幕后添加了其他重要的功能。
杰弗里·埃文斯

8

我真正搜索的是mask()功能。

mask(raster, poly_shape)

可以正常工作,并返回我搜索的内容。


2
重新投影数据,使其位于相同的投影空间中。即使在自动进行即时投影的ArcGIS中,对不同的投影进行分析也是非常糟糕的做法。使用不同投影的数据,您的数据将不会共享公共范围,这就是您收到的错误。
杰弗里·埃文斯

使用projectExtent()即可获取裁剪栅格的范围。
mdsumner 2014年

为了适应网站的问与答格式,应将其作为编辑/更新放置在问题的主体中(然后在“答复”中添加评论的答案,以便他们知道还有更多内容要看)。
马特·威尔基2014年

@mattwilkie对不起,我的格式不合适,但是我的文字太长了,无法在此处发表评论。@JeffreyEvans我尝试了以下方法:projection(raster) = projection(poly_shape)以及其他方法,projection(poly_shape) = projection(raster)但是两种方法都产生相同的错误:Error in .local(x, y, ...) : extents do not overlap In addition: Warning message: In intersect(extent(x), extent(y)) : Objects do not overlap。有没有一种方法可以通过使用extract()函数来查看使用中的投影(因为一个明显可行)?
拉斯

1
我真正搜索的是mask()函数。mask(raster, poly_shape)可以正常工作,并返回我搜索的内容。
拉斯

-1

范围工作得很好...我认为您范围的Xmin,Xmax,Ymin和Ymax与栅格的X和Y不同-即它们设置为相反

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.