是否可以叠加SpatialLinesDataFrame和SpatialPolygonsDataFrame

时间:2013-01-19 05:09:01

标签: r map plot gis clip

我想知道这是否可以做到这一点。

我有一个数据作为SpatialLinesDataFrame,另一个数据作为spatialPolygonDataFrame。是否有可能覆盖这两个数据?

当我尝试覆盖这些时,我收到以下错误:

  jd <- overlay(res,hello) 
  Error in function (classes, fdef, mtable)  :  unable to find an inherited method for function      
  ‘overlay’ for signature ‘"SpatialLinesDataFrame", "SpatialPolygonsDataFrame"’

在上面的代码中,res是SpatialLinesDataFrame,hello是SpatialPolygonDataFrame。

我有一个shapefile,然后我有x,y和z的数据点 坐标。我想在shapefile上显示轮廓线。

我使用的程序是使用akima包进行插值。该 我用来插值的代码是

fld <- interp(x,y,z)

然后我使用以下代码将其更改为空间对象:

res <-ContourLines2SLDF(contourLines(fld))

上述命令会将轮廓线存储为空间数据。

然后我读取shapefile,并按如下方式绘制shapefile和res:

p1 <-
spplot(hello,sp.layout=list(list("sp.lines",res)),col="blue",lwd=0,fill="grey",colorkey=F)
p1

“hello”是我的shapefile,“res”是我创建的对象,如上所示。

问题是存储在“res”中的轮廓超出了shapefile。所以我 想要使用shapefile剪切该轮廓并仅显示轮廓 在shapefile区域内。

所以我正在寻找一种用多边形图层修剪轮廓图层的方法。

我附上了我的代码所带的图像。 enter image description here

在图像中,您可以看到shapefile中的线条。我也想知道 如何在地图上显示轮廓水平。

非常感谢你。

Jdbaba

我也想知道叠加层到底做了什么。它是否与两个数据的区域相交?

谢谢。

2 个答案:

答案 0 :(得分:6)

听起来您正在尝试将线条剪切到多边形范围。使用gIntersection包中的rgeos。这是一个可重复的例子:

library(rgeos)
xx <- SpatialPoints(coords=matrix(data=c(0,0), nrow=1))
xx <- gBuffer(spgeom=xx, width=1)
yy <- SpatialLines(list(Lines(Line(matrix(c(-1,1,-1,1), nrow=2)), ID=1)))
zz <- gIntersection(yy, xx)

您可以像这样叠加图:

plot(xx)
plot(zz, add = TRUE, col = "blue")

答案 1 :(得分:1)

诺亚的回答对我来说非常有效。但是,他的答案输出是SpatialLines对象,无法将其保存为形状文件。

我的两分钱是关于如何将SpatialLines对象转换为SpatialLinesDataFrame并将其保存为形状文件。

res.df <- fortify(res) # create data frame of res, your original SpatialLinesDataFrame

data <- data.frame(id = unique(res.df$id)) # get ids of road segments
rownames(data) <- data$id

# transform SpatialLines object into SpatialLinesDataFrame
zzSpatialLineDF <- SpatialLinesDataFrame(zz, data) # convert zz object keeping road ids


# 5 Save Shape File to your working directory
writeOGR(zzSpatialLineDF, dsn = '.', layer ='zzSpatialLineDF', driver = 'ESRI Shapefile')