2011-02-14 8 views
13

Recentemente ho scoperto quanto fosse facile utilizzare un'immagine di sfondo e dati cartografici su di essa utilizzando Tableau Public. Ecco il processo dal loro website. Come puoi vedere, è abbastanza semplice, e devi semplicemente dire al software quale immagine vuoi usare e come definire le coordinate.Sovrapposizione di dati sull'immagine di sfondo

Il processo è semplice in R? Quale sarebbe l'approccio migliore?

risposta

21

JPEG

per le immagini JPEG, è possibile utilizzare read.jpeg() dal pacchetto rimage.

esempio:

anImage <- read.jpeg("anImage.jpeg") 
plot(anImage) 
points(my.x,my.y,col="red") 
... 

Impostando il par (nuovo = T) prima del prossimo comando plot, è possibile costruire trame complete su un'immagine di sfondo. (Vedi ?par e più in basso)

PNG

immagini PNG è possibile caricare utilizzando readPNG dal pacchetto png. Con readPNG, è necessario il comando rasterImage per tracciare (vedere anche i file della guida). Su Windows, è necessario sbarazzarsi del canale alfa, poiché Windows non è in grado di gestire alpha per pixel fino ad ora. Simon Urbanek è stato così gentile da sottolineare questa soluzione:

img <- readPNG(system.file("img", "Rlogo.png", package="png")) 
r = as.raster(img[,,1:3]) 
r[img[,,4] == 0] = "white" 

plot(1:2,type="n") 
rasterImage(r,1,1,2,2) 

GIF

per i file GIF, è possibile utilizzare read.gif da caTools. Il problema è che questo è in rotazione la matrice, quindi bisogna regolarlo:

Gif <- read.gif("http://www.openbsd.org/art/puffy/ppuf600X544.gif") 

n <- dim(Gif$image) 
image(t(Gif$image)[n[2]:1,n[1]:1],col=Gif$col,axes=F) 

Per tracciare su questa immagine, è necessario impostare correttamente il pari, ad esempio:

image(t(Gif$image)[n[2]:1,n[1]:1],col=Gif$col,axes=F) 
op <- par(new=T) 
plot(1:100,new=T) 
par(op) 
+1

ho provato ad installare il pacchetto Rimage su 2.10 e 2.12.1, e di ho avuto lo stesso errore entrambe le volte. Sto usando Windows XP: Avviso: impossibile accedere all'indice per il repository http://www.stats.ox.ac.uk/pub/RWin/bin/windows/contrib/2.10 Messaggio di avviso: In getDependencies (pkgs, dipendencies , disponibile, lib): pacchetto 'rimage' non disponibile – Btibert3

+0

@ Btibert3: Posso installare entrambi senza problemi da www.freestatistics.org/cran. Cerca comunque di ottenere un altro repository, uno dei mirror di cran menzionato su http://cran.r-project.org/mirrors.html. –

+0

Il mio laptop di lavoro presenta problemi per qualche motivo. Ho appena provato il mio portatile personale e l'ho installato senza problemi. Infine, avrei dovuto dichiarare che si tratta di un file GIF. – Btibert3

5

io non sono certo che parte di ciò che vuoi fare è ciò che viene chiamato "geo-referencing": l'atto di prendere un'immagine senza informazioni di coordinate e definire precisamente come si mappa nel mondo reale.

Per questo vorrei usare Quantum GIS, un pacchetto GIS libero e Open Source. Carica l'immagine come livello raster, quindi attiva il plug-in di georeferenziazione. Fai clic su alcuni punti noti dell'immagine e inserisci le coordinate lat-long del mondo reale di quei punti. Una volta che ne hai abbastanza, il georeferenziatore lavorerà su come allungare e spostare l'immagine sul suo vero luogo sul pianeta e scrivere un "file del mondo".

Quindi con tale R dovrebbe essere in grado di leggerlo utilizzando readGDAL dal pacchetto rgdal, e possibilmente anche il pacchetto raster.

+1

Grazie per l'aiuto. L'immagine in realtà non ha alcuna proprietà geografica; è una pista di hockey dove ho x/y coordine che vorrei mappare su di esso. E la mia immagine è un file GIF. – Btibert3

2

Per un'immagine JPEG è possibile utilizzare jpeg library e ggplot2 library.

Di solito ho trovato utile avere l'asse graduato in pixel e l'asse verticale andando positivo nella direzione verso il basso e l'immagine mantenendo il suo rapporto aspetto originale.Quindi posso alimentare R direttamente con l'output prodotto dall'algoritmo di visione del computer, ad esempio l'algoritmo può rilevare il foro di proiettile ed estrarre le coordinate del foro da un'immagine di ripresa e quindi R può tracciare un istogramma 2D usando l'immagine di destinazione come sfondo.

Il mio codice è basato sul codice di baptiste trovato alla https://stackoverflow.com/a/16418186/15485

library(ggplot2) 
library(jpeg) 

img <- readJPEG("bersaglio.jpg") # http://www.tiropratico.com/bersagli/forme/avancarica.jpg 

h<-dim(img)[1] # image height 
w<-dim(img)[2] # image width 

df<-data.frame(x=rnorm(100000,w/1.99,w/100),y=rnorm(100000,h/2.01,h/97)) 
plot(ggplot(df, aes(x,y)) + 
     annotation_custom(grid::rasterGrob(img, width=unit(1,"npc"), height=unit(1,"npc")), 0, w, 0, -h) + # The minus is needed to get the y scale reversed 
     scale_x_continuous(expand=c(0,0),limits=c(0,w)) + 
     scale_y_reverse(expand=c(0,0),limits=c(h,0)) + # The y scale is reversed because in image the vertical positive direction is typically downward 
                 # Also note the limits where h>0 is the first parameter. 
     coord_equal() + # To keep the aspect ratio of the image. 

     stat_bin2d(binwidth=2,aes(fill = ..density..)) + 
     scale_fill_gradient(low = "dark red", high = "red") 
    ) 

enter image description here

df<-data.frame(x=rnorm(100000,100,w/70),y=rnorm(100000,400,h/100)) 
plot(ggplot(df, aes(x,y)) + 
     annotation_custom(grid::rasterGrob(img, width=unit(1,"npc"), height=unit(1,"npc")), 0, w, 0, -h) + # The minus is needed to get the y scale reversed 
     scale_x_continuous(expand=c(0,0),limits=c(0,w)) + 
     scale_y_reverse(expand=c(0,0),limits=c(h,0)) + # The y scale is reversed because in image the vertical positive direction is typically downward 
     # Also note the limits where h>0 is the first parameter. 
     coord_equal() + # To keep the aspect ratio of the image. 

     stat_bin2d(binwidth=2,aes(fill = ..density..)) + 
     scale_fill_gradient(low = "dark red", high = "red") 
) 

enter image description here