使用R读取ESRI形状文件时出错
我正在尝试使用rgdal库读取shapefile,但运气不佳 当我尝试使用以下语法导入时:使用R读取ESRI形状文件时出错,r,gdal,rgdal,R,Gdal,Rgdal,我正在尝试使用rgdal库读取shapefile,但运气不佳 当我尝试使用以下语法导入时: geo <- readOGR("/path/to/layer","layer") 我如何着手诊断和解决问题?非常感谢 TL;DR:可能是自相交或重叠的几何体,这是多边形形状文件中的环/孔问题 首先,通过在提示符中输入不带参数的函数名,查看readOGR的源代码。对源代码的查找表明错误中的代码和消息不在该函数中 使用,我找到了readOGR调用的函数列表: 这表明它需要某种x,y坐标来处理多边形中的
geo <- readOGR("/path/to/layer","layer")
我如何着手诊断和解决问题?非常感谢 TL;DR:可能是自相交或重叠的几何体,这是多边形形状文件中的环/孔问题
首先,通过在提示符中输入不带参数的函数名,查看readOGR的源代码。对源代码的查找表明错误中的代码和消息不在该函数中
使用,我找到了readOGR调用的函数列表:
这表明它需要某种x,y坐标来处理多边形中的孔/环。回到helpPolygons类,我们看到一个参数labpt,它是:
数值类的对象;一对x,y坐标表示一个标签
点,最大环组件的标签点
现在我们可以给出一个关于错误原因的假设:它与多边形中环/孔的处理有关,在创建多边形对象时,它需要标签点来正确处理环/孔。但是,它找到的标签点不是有限的,并且会触发错误
最后,有一点值得注意:
属于多边形对象的多边形对象不应
相互重叠,或应完全作为湖泊或岛屿纳入
湖泊。它们不应该是自相交的
这表明您可能遇到了错误几何体的问题,即重叠或自相交。例如,您可以使用QGis中的工具来检查和修复几何体。这里应该问这个问题:。您可以在Linux/Mac中最简单的命令行上运行ogrinfo-so/path/to/layer吗?形状文件可能有一些无限的坐标。。。检查该命令的数据块输出。你在这里和那里交叉发布。请移除其中一根立柱。合理范围为:-179.147340、17.881242-179.778465、71.390482
Error in stopifnot(is.list(srl)) : infinite label point
[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"
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"));