TL;DR:可能是自相交或重叠的几何图形,多边形 Shapefile 中的环/孔存在问题。
readOGR
首先,通过在提示符中输入不带参数的函数名来查看 的来源。源代码上的“查找”表明错误中的代码和消息不在该函数中。
使用这种方法,我找到了调用的函数列表readOGR
:
[1] "-" ":" "!" "!=" ".Call"
[6] "(" "[" "[[" "{" "&&"
[11] "%in%" "+" "<" "<-" "<="
[16] "==" ">" "||" "$" "all.equal"
[21] "any" "as.character" "as.integer" "as.logical" "attr"
[26] "attributes" "c" "cat" "cbind" "class"
[31] "comment" "CRS" "data.frame" "do.call" "for"
[36] "function" "gc" "geometry" "getCPLConfigOption" "getGDALVersionInfo"
[41] "iconv" "identical" "if" "ifelse" "integer"
[46] "is.character" "is.na" "is.null" "isTRUE" "lapply"
[51] "length" "Line" "Lines" "list" "make.names"
[56] "match" "match.arg" "max" "message" "missing"
[61] "names" "nchar" "nrow" "ogrFIDs" "ogrInfo"
[66] "paste" "Polygon" "Polygons" "print" "rbind"
[71] "return" "rm" "sapply" "seq" "seq_along"
[76] "setCPLConfigOption" "slot" "sort" "SpatialLines" "SpatialLinesDataFrame"
[81] "SpatialPointsDataFrame" "SpatialPolygons" "SpatialPolygonsDataFrame" "stop" "stopifnot"
[86] "strsplit" "sum" "suppressMessages" "switch" "table"
[91] "try" "unique" "vector" "warning" "which"
那里列出的函数实际上是其中的一部分library(sp)
(您可以知道,因为<environment: namespace:sp>
当您打印其源代码时他们会说),并且错误消息看起来像是来自Polygon
or类Polygons
。
在Polygons
中,我们从错误消息中找到代码位:stopifnot(is.list(srl))
。查看help(Polygons)
,您会看到这srl
是一个“Polygon
类对象列表”,因此该错误意味着正在传递列表以外的其他内容。
所以现在,我们应该回到来源readOGR
并寻找对Polygons
(有三个)的调用。两个第一次调用make_Polygonlist
(一个 Crgdal
函数),第三个组装它自己的 list pllist
。最后一个很有趣,因为错误被静音了:try(pllist[[j]] <- Polygon(cmat), silent = TRUE)
,这意味着这不太可能引发您的错误。这留下了另外两个,并把你带到这个源代码,我们看到它在同一个脚本makePolygonlist
中调用。make_Polygon
在那里阅读(这不是我的主要语言),我看到以下评论:
// 默认情况下基于注释的孔设置(OGC SFS 顺序) // 但如果注释为空,则按环顺序 121019
稍后:
SET_STRING_ELT(VECTOR_ELT(dimnames, 1), 0, COPY_TO_USER_STRING("x"));
SET_STRING_ELT(VECTOR_ELT(dimnames, 1), 1, COPY_TO_USER_STRING("y"));
这表明它需要某种 x,y 坐标才能处理多边形中的孔/环。回到help("Polygons-class")
我们看到的一个参数labpt
是:
“数字”类的对象;一对 x, y 坐标给出一个标签点,最大环组件的标签点
现在我们可以给出一个关于错误原因的假设:它与多边形中环/孔的处理有关,并且在创建Polygon
对象时,它需要标签点来正确处理环/孔。但是,它找到的标签点不是有限的,因此会触发错误。
最后,有一个注释:
属于 Polygons 对象的多边形对象不应相互重叠,或应完全包含在内(如湖泊或湖泊中的岛屿)。它们不应该是自相交的。
这表明您可能遇到了重叠或自相交的不良几何形状的问题。您可以使用工具(例如在 QGis 中)来检查和修复几何图形。