使用 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 【问题描述】:

我正在尝试使用来自spspsample() 来采样比利时境内的点,使用来自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 被分配给dxurmaxbbox(be) 列;而llbbox(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

对某些库使用 -all_load 但对某些库不使用

为啥 python 框架安装指南会建议对一些必需的包使用 easy_install 而对其他包使用 pip?

对纬度/经度对使用自定义距离度量进行聚类

如何使用 scikit-learn 对文本对进行分类?

使用 KMeans 算法和 Python 对地理位置坐标(纬度、经度对)进行聚类