[R-sig-Geo] split SpatialPolygon after unionSpatialPolygons()

Roger Bivand Roger.Bivand at nhh.no
Thu Jul 16 17:24:15 CEST 2009


On Thu, 16 Jul 2009, Paulo E. Cardoso wrote:

> I think I got it working although without truly understand why some aspects
> seems to be mandatory, such as assigning NA's into the SGDF to get labcon()
> working.

In labcon, you see the lines:

     x[!is.na(x)] <- 1
     x[is.na(x)] <- 0

which will just make one connected component if all the cells are non-NA. 
Otherwise, yes, it looks as though it will work.

Roger

>
>  grelha<-readGDAL(paste("A:\\",i,sep=""))
>  gr.topo <- slot(grelha, "grid")
> #! GridTopology
>
>
>  codcores <- SGDF2PCT(grelha)$idx                            #! Convert RGB
> into a single code ID for each color
>  codcores[codcores==1] <- NA                                 #! Assign NA's
> for ID =1
>  sgdf.gr<-SpatialGridDataFrame(gr.topo,data.frame(codcores)) #! Rebuild
> SGDF with NA's
>  #image(sgdf.gr)
>  asc.gr = as.asc(as.matrix(sgdf.gr),xll = 0.5, yll = 0.5,)   #! Build
> object "asc"
>  grelhaID = labcon(asc.gr)                                   #! Split
> culsters (regions) with same ID's
>  class(grelhaID)                                             #! classe
> "asc"
>  #image(grelhaID)
>  grelhaID[is.na(grelhaID)] <- 0
>  #win.graph()
>  #image(grelhaID)
>  pixID = asc2spixdf(grelhaID)                                #! Build
> SpatialPixelDataFrame from asc object
>  class(pixID)
>  names(pixID) <- "ID"
>  image(pixID)
>
> ____________
> Paulo E. Cardoso
>
>
>> -----Mensagem original-----
>> De: Roger Bivand [mailto:Roger.Bivand at nhh.no]
>> Enviada: quarta-feira, 15 de Julho de 2009 18:04
>> Para: pecardoso
>> Cc: R-sig-Geo
>> Assunto: Re: [R-sig-Geo] split SpatialPolygon after
>> unionSpatialPolygons()
>>
>> On Tue, 14 Jul 2009, pecardoso wrote:
>>
>>> I've used unionSpatialPolygons to dissolve polygons and get a grid as
>> a
>>> spatialpolygon.
>>>
>>> A simple example:
>>> grelha<-readGDAL(paste("C:/...","teste.bmp",sep=""))
>>
>> Please only use examples that refer to a publically available data set.
>>
>>> grd <- slot(grelha, "grid")
>>> pol <- as.SpatialPolygons.GridTopology(grd)
>>> pol <- unionSpatialPolygons(pol, SGDF2PCT(grelha)$idx)
>>>
>>
>> Exactly. This creates a rectangular polygon for each raster cell
>> specified
>> by grd, then removes all internal boundaries between those raster cells
>> with the same value of the index, additionally placing all the separate
>> Polygon objects with the same value of the index in a Polygons object.
>> No-one has given them IDs, all the function has to work on are the
>> index
>> values.
>>
>> I think that this is the same question that you asked recently, to
>> which I
>> replied indicating that you should use labcon() in adehabitat to give a
>> separate index to each disconnected cluster with the same index values.
>>
>> The alternative is to re-format the output SpatialPolygons object to
>> find
>> out how many Polygon objects there are in each Polygons object, and
>> then
>> to flatten those with more than one - that is make each such Polygon
>> object into a singleton Polygons object with a unique ID slot value. It
>> is
>> possible, but you will need some knowledge of the way these objects are
>> constructed. If you can post a sample image, it may not be too hard,
>> either using labcon() or by re-formatting the representation.
>>
>> Roger
>>
>>> When the original image have more than one region or 'islands' of a
>>> single color (imagine a small logo), the unionSpatialPolygons() will
>>> dissolve polygons based on the ID's provided, in such a way that
>>> coordinates(pol) will return N lines, as much as different ID's or
>>> colors retrieved with SGDF2PCT(grelha)$idx.
>>>
>>> It means that one cannot get centroids of each individual regions.
>>> Beside this, if the original image have this pattern, each number is
>> a
>>> pixel of a single color:
>>>
>>> 00100
>>> 02000
>>> 00020
>>> 10000
>>>
>>> coordinates() will give only 3 centroids and only for three of the
>>> polygons (not even a common centroid for 1 and 2 ID's).
>>>
>>> I'd like to split the spatialpolygon object obtained with
>>> unionSpatialPolygons(pol, SGDF2PCT(grelha)$idx) but retaining the
>> ID's
>>> in order to get individual centroids for each region, in this simple
>>> case, two centroids for 1, two for 2 and two for 0.
>>>
>>> Any idea will be welcome
>>>
>>>
>>>
>>> 	[[alternative HTML version deleted]]
>>>
>>> _______________________________________________
>>> R-sig-Geo mailing list
>>> R-sig-Geo at stat.math.ethz.ch
>>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>>
>>
>> --
>> Roger Bivand
>> Economic Geography Section, Department of Economics, Norwegian School
>> of
>> Economics and Business Administration, Helleveien 30, N-5045 Bergen,
>> Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43
>> e-mail: Roger.Bivand at nhh.no
>>
>> Checked by AVG - www.avg.com
>> Version: 8.5.375 / Virus Database: 270.13.16/2241 - Release Date:
>> 07/16/09 05:58:00
>
>

-- 
Roger Bivand
Economic Geography Section, Department of Economics, Norwegian School of
Economics and Business Administration, Helleveien 30, N-5045 Bergen,
Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43
e-mail: Roger.Bivand at nhh.no



More information about the R-sig-Geo mailing list