将IDW插值限制为R {Spatstat}中的多边形

时间:2016-02-25 03:16:53

标签: r spatial spatstat

我是一位相当新的R用户,负责处理嵌入美国都市区的地方的空间数据。我正在为许多变量生成IDW地图,并且无法定义IDW的边界。我想仅在大都会区域范围内插入数据,而我目前的方法填补了整个情节。

我首先从ppp创建一个dataframe对象:

x.points<-SpatialPointsDataFrame(coords =x.data[,c("LON10","LAT10")],
  data=x.data[,c("v1","v2")],
  proj4string=CRS("+proj=longlat +ellps=GRS80 +datum=NAD83 +no_defs"))

x.proj<-spTransform(x.points,CRSobj = CRS("+proj=aea
  +lat_1=29.5 +lat_2=45.5 +lat_0=37.5 +lon_0=-96 +x_0=0 +y_0=0 
  +datum=NAD83 +units=m +no_defs +ellps=GRS80 +towgs84=0,0,0"))    

x.ppp<-as.ppp(x.proj)

使用ppp投影此plot(x.ppp)对象会显示每个变量的图表(&#34; v1&#34;&#34; v2&#34;在上面的代码中)。但是,该图填充整个矩形框。我在绘制ppp对象时通过为其分配owin对象来限制此框架,如下所示:

y.spdf<-spTransform(y.spdf,CRSobj = CRS("+proj=aea 
  +lat_1=29.5 +lat_2=45.5 +lat_0=37.5 +lon_0=-96 +x_0=0 +y_0=0 
  +datum=NAD83 +units=m +no_defs +ellps=GRS80 +towgs84=0,0,0"))

y.owin<-as.owin(y.spdf)

x.ppp<-x.ppp[y.owin]

使用plot(x.ppp)绘制此图现在为我提供了我的数据点在他们的都市区域的多边形内正确构图的图。虽然这是一个好的开始,但我想继续将此空间框架传递到IDW地图上。咨询spatstat手册让我相信我可以将owin对象作为as.mask参数传递,但每当我这样做时,我都会收到错误。示例代码如下:

idw<-idw(x.ppp, power=4, as.mask(y.owin))

这给了我错误&#34;切换错误(at,pixels = {:EXPR必须是长度为1的向量&#34;。使用at="points"不起作用,因为我得到了结果{ {1}}对象而不是dataframe。如果我省略了imlist参数,我得到了一个正确的idw,但它插入了我以前能够使用{{{ 1}}对象。

我认为这是一项相当普遍的任务,但是查看spatstat文档让我有点失落。 as.mask论证看起来似乎有效,而且我不确定我哪里出错了。关于如何解决这个问题的任何意见或建议,或者我可以转向尝试并更好地理解问题的来源将是一个很大的帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

我看到这有点令人困惑。基本上idw计算包含数据的整个矩形框中的结果(owin的框架)。 如果您执行rslt <- idw(x.ppp),则会获得此结果。要将结果限制为多边形窗口,我们需要通过此窗口对结果图像进行子集化(并设置drop=FALSE以获得生成的不规则图像,而不是多边形区域内的像素值)。在代码中解释:

简单案例(一个数字标记值)

library(spatstat)
# Fake data with one numeric mark
X <- humberside
marks(X) <- runif(npoints(X))
# Window is a polygonal region:
W <- Window(X)
W
# IDW in the frame of W
rslt <- idw(X)
# Subset of IDW inside W
rslt <- rslt[W, drop = FALSE]
plot(rslt)

IDW for one variable

多变量情况(两个或更多数字标记值)

library(spatstat)
# Fake data with more numeric marks
X <- humberside
marks(X) <- cbind(x = runif(npoints(X)), y = runif(npoints(X)))
# Window is a polygonal region:
W <- Window(X)
W
# IDW in the frame of W for each mark variable (imlist object)
rslt <- idw(X)
# Subset of IDW inside W for each mark variable (imlist object)
rslt <- solapply(rslt, "[.im", W, drop = FALSE)
plot(rslt)

IDW for two variables