[R] spatstat => owin + image

Rolf Turner rolf.turner at xtra.co.nz
Sat Sep 24 07:30:24 CEST 2011

On 24/09/11 02:32, tkdweber wrote:
> Dear Community
> I am at my wits end and seek advice.
> My wish is to plot coordinates (x,y in WGS84_UMTS for the ones interested)
> of sampling points.
> This I can do by the standard spatstat prodcedure via owin.

     You appear to  be rather confused from the very start.

     The function owin() does not *plot* anything; it is used to
     create an *observation window* for a spatial point pattern.
     In spatstat every spatial point pattern object must include
     such a window.
> I then try to
> add an image, which is
> a map/satellite photo in the background.
     You would probably do better by plotting the image first
     and then adding the points on top of the image.  In general,
     in my experience, plotting an image on top of points obscures
     the points (hides them completely).

     To avoid this you have to mess around with the value of ``alpha''
     somehow, and the game is not worth the candle.
> Firstly
> Problem: With the current code, I can not get the edges of the image to
> match the boarders of the plot
> itself (not the entire plot window, solely the coordinate system)
> The size of the image I have (from GPS work)

     I have absolutely no idea what you are asking here.
> Any ideas?
> Secondly, I am confused of how to get coordinates into an owin plot. It
> doesnt want to work.

     Likewise.  This is far too vague for me (or anyone else) to be able
     to give a reasonable answer.
> Thirdly, is with spatstat only always one mark possible? Or can I
> differentiate further?
     I am again not sure what you are asking here, but I think
     the answer is ``No.''  That is, more than one mark is ``possible''.
     The marks component of a spatial point pattern (an object of
     class "ppp") can be a *data frame*.  See ?ppp.

     Currently the tools available in spatstat don't do much with data
     frame marks, but such mark structures are allowed, and you can
     write your own code to deal with such structures in any manner
     you wish.
> Code, for reference purposes
> ~~~~~~~~~~~~~~~~  CODE ~~~~~~~~~~~~~~
> data data = read.xls("name.xls")
> x1=floor(min( data[,2],na.rm=T )*(1-b))
> x2=ceiling(max(data[,2],na.rm=T )*(1+b))
> y1=floor(min(data[,3],na.rm=T )*(1-c))
> y2=ceiling(max(data[,3],na.rm=T )*(1+c))
> x1
> x2
> y1
> y2
     What (WTF) are b and c???
> w = owin(c(x1,x2),c(y1,y2))
> w
> dat1 = as.ppp(data[,2:4],w)
> is.ppp(dat1)
> str(dat1)
> #Get the plot information so the image will fill the plot box, and draw it
> ima = readPNG("file.png")
> lim = par()
> rasterImage(ima, lim$usr[1], lim$usr[3], lim$usr[2], lim$usr[4])
> par(new=T)
> plot(dat1, use.marks=T)
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

     This code is not really much use to anyone since we don't have
     access to "name.xls" or "file.png".  (Or, as indicated above, to
     the values of "b" and "c".)

     Read the posting guide.  Examples given should be that ``people
     can actually run.''
> Thank you for any advice.

     I don't have any experience with readPNG() (*from the png package*, 
     you might have mentioned!) nor with rasterImage().

     However, after some thrashing around and experimenting with a toy 
     I have come to the conclusion that the problem arises from the fact 
     readPNG() creates a large border of white space around the image.

     To fix this, I cobbled together the function:

raster2im <- function (A,xrange,yrange) {
     B <- apply(A,c(1,2),function(x){rgb(x[1],x[2],x[3])})
     B <- B[nrow(B):1,]
         i1 <- min(apply(B,2,function(x){min(which(x!="#FFFFFF"))}))
         i2 <- max(apply(B,2,function(x){max(which(x!="#FFFFFF"))}))
         j1 <- min(apply(B,1,function(x){min(which(x!="#FFFFFF"))}))
         j2 <- max(apply(B,1,function(x){max(which(x!="#FFFFFF"))}))
     C <- B[i1:i2,j1:j2]

I suggest that you try something like the following:

data <- read.xls("name.xls")
X <- as.ppp(data[,2:3],window=ripras(data[,2:3],shape="rectangle"))
R <- readPNG("file.png")
IM <- raster2im(R,xrange=X$window$xrange,yrange=X$window$yrange)

Note that raster2im() strips away any white edges from an image.  If you
actually *want* this ``white space'' (or part of it) you'll have to do 


         Rolf Turner

More information about the R-help mailing list