TL; Вероятно самопересекающиеся или перекрывающиеся геометрии, проблема с кольцами/отверстиями в полигоне 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
в том же скрипте.
Чтение там (и это не мой основной язык), я вижу комментарий о:
// hole setting based on comments by default (OGC SFS order) // but by ring order if comment 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"));
, который наводит на мысль, что нужно х, у координаты в некотором роде для обработки отверстий/колец в многоугольниках. Вернуться к help("Polygons-class")
мы видим параметр labpt
, который:
Object of class "numeric"; pair of x, y coordinates giving a label point, the label point of the largest ring component
И теперь мы можем дать гипотезу о том, он вызывает ошибку: она связана с обработкой колец/отверстий в полигонах, и при создании Polygon
объектов, для правильной обработки колец/отверстий нужны метки. Однако точки метки, которые он находит, не являются конечными, и ошибка запускается.
И, наконец, есть примечание:
Polygon objects belonging to an Polygons object should either not overlap one-other, or should be fully included (as lakes or islands in lakes). They should not be self-intersecting.
, который предполагает, что вы, вероятно, возникли проблемы с плохой геометрией, которая является перекрытием или самопересекающимся. Вы можете использовать инструменты (например, в QGis) для проверки и исправления геометрии.
Этот вопрос следует задать здесь: http://gis.stackexchange.com. –
вы можете запустить 'ogrinfo -so/path/to/layer layer' в командной строке (проще всего в Linux/Mac)? Файл формы может иметь некоторые бесконечные координаты каким-то образом ... Проверьте объем, выводимый из этой команды. – Spacedman
Вы перекрестно размещены здесь и там. Удалите одно из этих сообщений. –