[R-sig-Geo] convert a PBSmapping grid to shapefile
Armelle ROUYER
Armelle.Rouyer at ifremer.fr
Fri Feb 18 16:00:10 CET 2011
Thank you very much for your help Roger, it really helps and explains me
how the functions work and generate polygons.
Regards.
Armelle
Roger Bivand a écrit :
> On Fri, 18 Feb 2011, Armelle ROUYER wrote:
>
>> Thanks for your answer Roger but it still doesn't work...
>> The problem is with mo, has you said it needs more study and I don't
>> how to solve the problem.
>>
>> Here is the problem :
>>
>> library(PBSmapping)
>>
>> PS0=makeGrid(x=seq(-5,-1,.2),y=seq(43,49,.2),projection="LL")
>> PD=read.table("pdata.txt",header=T) # text file attach
>>
>> brks=c(fivenum(PD$Z))
>> cols=c("white","yellow","orange","red","darkred")
>> PD0=makeProps(PD,breaks=brks,"col",cols)
>>
>> plotPolys(PS0, polyProps=as.PolyData(PD0),
>> projection="LL",bg="lightblue")
>> sp1 <- PolySet2SpatialPolygons(PS0)
>> mo <- match(as.character(PD0$PID), row.names(sp1))
>> sp2 <- SpatialPolygonsDataFrame(sp1, data=data.frame(col=PD0$col[mo],
>> stringsAsFactors=FALSE))
>> plot(sp2, col=sp2$col, axes=TRUE)
>>
>>
>> Many thanks in advance if you find a solution.
>
> The underlying problem is that makeGrid() understands PolySet objects in
> its own way, with the interaction of PID and SID being a top level
> identifier. In ?PolySet, it looks as though the PID is the top level
> identifier, and SIDs within a given PID are its component parts, not
> independent top-level objects. This is how PolySet2SpatialPolygons()
> sees things too, so the multiple SIDs in a single PID are treated as
> member component polygons of a multipolygon (Polygons) object. So we
> need to disambiguate:
>
> library(PBSmapping)
> PS0=makeGrid(x=seq(-5,-1,.2),y=seq(43,49,.2),projection="LL")
> PS1 <- as.PolySet(data.frame(PID=as.integer((PS0$PID*100)+PS0$SID),
> SID=1L, POS=PS0$POS, X=PS0$X, Y=PS0$Y), projection="LL")
> # Be careful to ensure uniqueness in the new PID!!
> PD=read.table("pdata.txt",header=T)
> # text file attach
> PD1 <- data.frame(PID=as.integer((PD$PID*100)+PD$SID), Z=PD$Z)
> # Be careful to ensure uniqueness in the new PID!!
> brks=c(fivenum(PD$Z))
> cols=c("white","yellow","orange","red","darkred")
> PD0=makeProps(PD1,breaks=brks,"col",cols)
> plotPolys(PS1, polyProps=as.PolyData(PD0), projection="LL",bg="lightblue")
> library(maptools)
> sp1 <- PolySet2SpatialPolygons(PS1)
> mo <- match(as.character(PD0$PID), row.names(sp1))
> Z <- rep(as.numeric(NA), length(row.names(sp1)))
> Z[mo] <- PD0$Z
> col <- rep(as.character(NA), length(row.names(sp1)))
> col[mo] <- PD0$col
> df <- data.frame(Z=Z, col=col, stringsAsFactors=FALSE,
> row.names=row.names(sp1))
> sp2 <- SpatialPolygonsDataFrame(sp1, data=df)
> sp3 <- sp2[!is.na(sp2$Z),]
> plot(sp3, col=sp3$col, bg="lightblue", axes=TRUE)
>
>> And if it is not possible I will do the same using only the sp package...
>
> You are right that for this data set, representation as a
> SpatialPixelDataFrame object might be best.
>
> Roger
>
>>
>> Regards.
>> Armelle Rouyer
>>
>>
>>
>> Roger Bivand a écrit :
>>> On Thu, 17 Feb 2011, Armelle ROUYER wrote:
>>>
>>>> Dear all,
>>>>
>>>> I used the PBSmapping package to make a grid with the abundance of
>>>> fishes. Each cell has an allocated value. I want to convert this
>>>> grid into a shapefile in order to export it on ArcGIS.
>>>>
>>>> So I tried the function "PolySet2SpatialPolygons". The grid is
>>>> correctly transformed into polygons but the allocated value is
>>>> ignored. Then I tried the function "SpatialPolygonsDataFrame" but it
>>>> didn't work properly (only 13 values are associated with the 50 cells).
>>>>
>>>> I am not sure that I am using the right functions. So if you have
>>>> any idea or suggestion thank you for your help.
>>>
>>> library(PBSmapping)
>>> library(maptools)
>>> gt <- GridTopology(c(0.5, 0.5), c(1, 1), c(5, 10))
>>> sp <- as(gt, "SpatialPolygons")
>>> proj4string(sp) <- CRS("+proj=longlat")
>>> PS0 <- SpatialPolygons2PolySet(sp)
>>> PD0 <- as.PolyData(data.frame(PID=1:50, col=rep(rainbow(10), each=5),
>>> stringsAsFactors=FALSE))
>>> plotPolys(PS0, polyProps=PD0, projection="LL")
>>> # the above to set up a PolySet opject, PolyData object, and plot them
>>> sp1 <- PolySet2SpatialPolygons(PS0)
>>> mo <- match(as.character(PD0$PID), row.names(sp1))
>>> # check mo - this is an easy match, in practice it may need more study
>>> sp2 <- SpatialPolygonsDataFrame(sp1, data=data.frame(col=PD0$col[mo],
>>> stringsAsFactors=FALSE))
>>> plot(sp2, col=sp2$col, axes=TRUE)
>>>
>>> seems to work. You match on the PolyData PID column and the
>>> row.names() of the SpatialPolygons object, which are the unique
>>> PolySet PID values. In this case, and probably in general, the PIDs
>>> in the PolyData and PolySet match by design. If there isn't an exact
>>> match, you'll need to construct an object of the correct length
>>> manually.
>>>
>>> Roger
>>>
>>>>
>>>> Regards.
>>>>
>>>>
>>>>
>>>
>>
>>
>
--
Armelle Rouyer
IFREMER - Station de Lorient
Laboratoire Biologie Halieutique
8 rue Francois Toullec
56100 LORIENT
FRANCE
02 97 87 38 23
More information about the R-sig-Geo
mailing list