我试图使用rgdal库读取shapefile,但没有运气。
当我尝试使用以下语法导入时:
geo <- readOGR("/path/to/layer","layer")
我遇到了错误
Error in stopifnot(is.list(srl)) : infinite label point
如何进行诊断和解决问题?非常感谢。
答案 0 :(得分:0)
TL; DR:可能是自相交或重叠的几何图形,多边形Shapefile中的环/孔存在问题。
首先,通过在提示符中输入不带参数的函数名来查看readOGR
的源代码。源上的“查找”表示错误中的代码和消息不在该函数中。
使用this approach,我找到了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>
),并且错误消息看起来像comes from Polygon
或Polygons
个类。
在Polygons
中,我们从错误消息中找到代码位:stopifnot(is.list(srl))
。查看help(Polygons)
,您会看到srl
是“Polygon
类对象列表”,因此错误意味着正在传递除列表之外的其他内容。
现在,我们应该回到readOGR
的来源,并寻找对Polygons
的调用(有三个)。两个第一个调用make_Polygonlist
(一个C rgdal
函数),第三个调用它自己的列表pllist
。最后一个是有趣的,因为错误是沉默的:try(pllist[[j]] <- Polygon(cmat), silent = TRUE)
,这意味着这不太可能引发你的错误。这留下了另外两个,并将您带到this source code,我们看到makePolygonlist
在同一个脚本中调用make_Polygon
。
在那里阅读(这不是我的主要语言),我看到有关的评论:
//基于默认评论的洞设置(OGC SFS订单) //但是如果注释为NULL 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坐标给出一个标签 point,最大环组件的标签点
现在我们可以给出一个关于错误原因的假设:它与多边形中环/孔的处理有关,并且在创建Polygon
对象时,它需要标签点来正确处理环/孔。但是,它找到的标签点不是有限的,并且会触发错误。
最后,有一个注释:
属于多边形对象的多边形对象应该不是 相互重叠,或应完全包括(作为湖泊或岛屿 湖泊)。它们不应该是自相交的。
这表明你可能遇到了一个重叠或自相交的坏几何问题。您可以使用工具(例如在QGis中)来检查和修复几何体。