2012-07-11 13 views
14

Estoy tratando de hacer una superposición espacial entre dos polígonos ("grd" y "rango") usando la función de sobre (rgeos).¿Cómo puedo manejar un "orificio huérfano" en un shapefile de polígono en R o ArcGIS?

Este código funciona para todos los archivos menos uno:

range.grd.overlay <- grd[!is.na(over(grd, range)), ]@data$grdID # get gridcells that overlap with range 

y obtener este mensaje de error:

Error in createPolygonsComment(p) : 
    rgeos_PolyCreateComment: orphaned hole, cannot find containing polygon for hole at index 9 

entiendo que hay un agujero sin un polígono que rodea en alguna parte del archivo de formas, pero No puedo encontrar la manera de evitarlo. ¿Puedo simplemente eliminar el agujero en el índice 9? Cómo ? Si tiene una solución para arreglar el shapefile en ArcGIS, también estaría bien para mí.

Muchas gracias de antemano por su ayuda !!

Saludos, Carsten

+0

nadie puede ayudar con esto, ya que no tenemos idea sobre la estructura de GRD o distancia. Muchos objetos pueden tener una ranura @ data $ grdID. Esto necesita trabajo para hacer un ejemplo reproducible. Sin embargo, utilice QGIS (gratuito) con herramientas de geometría o Múltiple (asequible) con Topology Factory para obtener un comprobador de geometría interactivo. – mdsumner

+0

Parece que eliminar el agujero en el índice 9 debería funcionar. ¿Qué pasa cuando pruebas eso? 'subconjunto' en el paquete' taRifx' debería hacerlo si no tienes una mejor manera (no estoy al día con mis métodos espaciales). –

+0

Ok, veo, disculpe por no ser muy específico sobre mi problema: – user1012744

Respuesta

2

Tanto grd y range son de la clase SpatialPolygonsDataFrame.

range tiene una estructura como esta:

> str(range) 
Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots 
    [email protected] data  :'data.frame': 3 obs. of 17 variables: 
    .. ..$ OBJECTID : int [1:3] 725 726 727 
    .. ..$ SPCRECID : int [1:3] 3313 3313 3313 
    .. ..$ DATE_  : Factor w/ 1 level "19/10/2009": 1 1 1 
    .. ..$ SCINAME : Factor w/ 1 level "Synthliboramphus antiquus": 1 1 1 
    .. ..$ SOURCE : Factor w/ 1 level "Gaston & Jones, 1998; Brazil, 2009": 1 1 1 
    .. ..$ PRESENCE : int [1:3] 1 1 1 
    .. ..$ ORIGIN : int [1:3] 1 1 1 
    .. ..$ SEASONAL : int [1:3] 2 1 3 
    .. ..$ DATA_SENS : Factor w/ 0 levels: NA NA NA 
    .. ..$ SENS_COMM : Factor w/ 0 levels: NA NA NA 
    .. ..$ COMPILER : Factor w/ 1 level "Philip Taylor (BirdLife International)": 1 1 1 
    .. ..$ TAX_COM : Factor w/ 0 levels: NA NA NA 
    .. ..$ DIST_COM : Factor w/ 0 levels: NA NA NA 
    .. ..$ REVIEWERS : Factor w/ 0 levels: NA NA NA 
    .. ..$ CITATION : Factor w/ 1 level "BirdLife International and Natureserve (2011) Bird species distribution maps of the world.": 1 1 1 
    .. ..$ SHAPE_Leng: num [1:3] 190 209 1240 
    .. ..$ SHAPE_Area: num [1:3] 39 16.6 600.8 
    .. ..- attr(*, "data_types")= chr [1:17] "N" "N" "C" "C" ... 
    [email protected] polygons :List of 3 
    .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots 
    .. .. .. [email protected] Polygons :List of 138 
    .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots 
    .. .. .. .. .. .. [email protected] labpt : num [1:2] 178.6 51.8 
    .. .. .. .. .. .. [email protected] area : num 4.58 
    .. .. .. .. .. .. [email protected] hole : logi FALSE 
    .. .. .. .. .. .. [email protected] ringDir: int 1 
    .. .. .. .. .. .. [email protected] coords : num [1:49, 1:2] 180 180 179 179 179 ... 
    .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots 
    .. .. .. .. .. .. [email protected] labpt : num [1:2] -172.2 52.6 

... y así sucesivamente.

grd tiene una estructura como esta:

> str(grd) 
Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots 
    [email protected] data  :'data.frame': 40680 obs. of 12 variables: 
    .. ..$ ID  : int [1:40680] 361 362 363 364 365 366 367 368 369 370 ... 
    .. ..$ X_COORD : num [1:40680] -180 -178 -178 -176 -176 ... 
    .. ..$ Y_COORD : num [1:40680] 79.1 79.1 79.1 79.1 79.1 ... 
    .. ..$ ID_1  : Factor w/ 13713 levels "10","10000","10001",..: NA NA NA NA NA NA NA NA NA NA ... 
    .. ..$ grdID  : int [1:40680] 1 2 3 4 5 6 7 8 9 10 ... 
    .. ..$ ROW  : int [1:40680] 1 1 1 1 1 1 1 1 1 1 ... 
    .. ..$ COL  : int [1:40680] 1 2 3 4 5 6 7 8 9 10 ... 
    .. ..$ AREA  : num [1:40680] 12364 12364 12364 12364 12364 ... 
    .. ..$ PERIMETER : num [1:40680] 445 445 445 445 445 ... 
    .. ..$ MAJORITY : int [1:40680] 0 0 0 0 0 0 0 0 0 0 ... 
    .. ..$ PROP0_0062: num [1:40680] 0 0 0 0 0 0 0 0 0 0 ... 
    .. ..$ AREA_KM2 : num [1:40680] 0 0 0 0 0 0 0 0 0 0 ... 
    .. ..- attr(*, "data_types")= chr [1:12] "N" "N" "N" "C" ... 
    [email protected] polygons :List of 40680 
    .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots 
    .. .. .. [email protected] Polygons :List of 1 
    .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots 
    .. .. .. .. .. .. [email protected] labpt : num [1:2] -179.5 79.1 
    .. .. .. .. .. .. [email protected] area : num 5.3 
    .. .. .. .. .. .. [email protected] hole : logi FALSE 
    .. .. .. .. .. .. [email protected] ringDir: int 1 
    .. .. .. .. .. .. [email protected] coords : num [1:13, 1:2] -179 -180 -180 -180 -180 ... 
    .. .. .. [email protected] plotOrder: int 1 
    .. .. .. [email protected] labpt : num [1:2] -179.5 79.1 

... y así sucesivamente.

Me encontraron esta ayuda de Roger Bivand y esto trabajó para dos de los tres archivos problemáticos:

>slot(shape.input, "polygons") <- lapply(slot(shape.input, "polygons"), checkPolygonsHoles) 
>range.grd.overlay <- grd[!is.na(over(grd, range)), ]@data$grdID # get gridcells of that overlay with range polygon 

pero para el tercer archivo de la fijación no funcionaba. R se congelaría hasta que finalmente presioné Esc, después de lo cual me gustaría tener el mismo mensaje de error al intentar hacer la superposición espacial:

Error in createPolygonsComment(p) : 
    rgeos_PolyCreateComment: orphaned hole, cannot find containing polygon for hole at index 13 
Cuestiones relacionadas