2015-03-10 3 views
0

Я пытаюсь прочитать в шейп-файле, используя библиотеку rgdal, и мне не повезло.Ошибка чтения в файле ESRI Shapefile с использованием R

Когда я пытаюсь импортировать, используя следующий синтаксис:

geo <- readOGR("/path/to/layer","layer") 

Я встретился с ошибкой

Error in stopifnot(is.list(srl)) : infinite label point 

Как я могу идти о диагностике и устранении этой проблемы? Большое спасибо.

+0

Этот вопрос следует задать здесь: http://gis.stackexchange.com. –

+1

вы можете запустить 'ogrinfo -so/path/to/layer layer' в командной строке (проще всего в Linux/Mac)? Файл формы может иметь некоторые бесконечные координаты каким-то образом ... Проверьте объем, выводимый из этой команды. – Spacedman

+0

Вы перекрестно размещены здесь и там. Удалите одно из этих сообщений. –

ответ

0

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) для проверки и исправления геометрии.