使用 spsample() 对 SpatialPolygonsDataFrame 进行采样会导致 seq.default() 出错
Posted
技术标签:
【中文标题】使用 spsample() 对 SpatialPolygonsDataFrame 进行采样会导致 seq.default() 出错【英文标题】:Sampling a SpatialPolygonsDataFrame with spsample() results in error from seq.default() 【发布时间】:2016-12-05 22:17:07 【问题描述】:我正在尝试使用来自sp
的spsample()
来采样比利时境内的点,使用来自GDAM 的SpatialPolygonsDataFrame
。这会导致来自seq.default()
-call 的错误。
be <- readRDS(gzcon(url('http://biogeo.ucdavis.edu/data/gadm2.8/rds/BEL_adm0.rds')))
spsample(be, type="hexagonal", cellsize=10)
seq.default(ll[1], ur[1] - dx/2, dx)
中的错误: 'by' 参数中的错误登录
str(be)
# Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots
# ..@ data :'data.frame': 1 obs. of 68 variables:
# .. ..$ OBJECTID : int 1
# [snip]
# .. ..$ LDC : chr ""
# ..@ polygons :List of 1
# .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
# .. .. .. ..@ Polygons :List of 3
# .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
# .. .. .. .. .. .. ..@ labpt : num [1:2] 3.37 51.36
# [snip]
进一步尝试:
使用 GDAM 的 Shapefile 版本会导致同样的错误。 先转换为SpatialPolygons
-object,会导致同样的错误。
packageVersion('sp')
# [1] ‘1.2.3’
【问题讨论】:
【参考方案1】:您的cellsize
太大。
看be
的边界框:
bbox(be)
# min max
# x 2.555356 6.40787
# y 49.497215 51.50382
太不太明白spsample
在做什么,但是如果你看回溯你的错误的结果,你可以在代码中四处寻找调试:
spsample(be, type="hexagonal", cellsize=10)
traceback()
# 9: stop("wrong sign in 'by' argument")
# 8: seq.default(ll[1], ur[1] - dx/2, dx)
# 7: seq(ll[1], ur[1] - dx/2, dx)
# 6: genHexGrid(dx, bb[, 1], bb[, 2])
# 5: hexGrid(bb, n = n, offset = offset, cellsize = cellsize)
# 4: sample.Spatial(as(x, "Spatial"), n_tot * (1 + its * 0.1), type = type,
# offset = offset, ...)
# 3: .local(x, n, type, ...)
# 2: spsample(be, type = "hexagonal", cellsize = 10)
# 1: spsample(be, type = "hexagonal", cellsize = 10)
您可以查看hexGrid
/ genHexGrid
的代码(通过输入getAnywhere("hexGrid")
或者,因为您可以猜到代码在sp
包中,通过在控制台上输入sp:::hexGrid
),其中你会看到cellsize
被分配给dx
; ur
是max
的bbox(be)
列;而ll
是bbox(be)
的min
列。
所以您尝试创建的x
序列实际上是:
x <- seq(2.555, 1.408, 10)
因此这是试图创建一个从高到低的序列,以正数递增,这是不可能的。
改为尝试更小的cellsize
:
spsample(be, type="hexagonal", cellsize=1)
# SpatialPoints:
# x y
# 2 4.205421 50.40138
# 3 5.205421 50.40138
# 4 6.205421 50.40138
# 5 3.705421 51.26741
# 6 4.705421 51.26741
# Coordinate Reference System (CRS) arguments:
# +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84
# +towgs84=0,0,0
我能够通过结合traceback()
和谨慎使用debugonce(sp:::sample.Spatial)
来解决所有问题。希望这个答案可以为您提供有用的调试工具箱。
【讨论】:
以上是关于使用 spsample() 对 SpatialPolygonsDataFrame 进行采样会导致 seq.default() 出错的主要内容,如果未能解决你的问题,请参考以下文章
对某些 URL 强制使用 HTTPS,对所有其他 URL 强制使用 HTTP