我想知道这是否可以做到这一点。
我有一个数据作为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区域内。
所以我正在寻找一种用多边形图层修剪轮廓图层的方法。
我附上了我的代码所带的图像。
在图像中,您可以看到shapefile中的线条。我也想知道 如何在地图上显示轮廓水平。
非常感谢你。
Jdbaba
我也想知道叠加层到底做了什么。它是否与两个数据的区域相交?
谢谢。
答案 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')