2012-01-12 11 views
5

Dato uno shapefile, come modellare e utilizzare un file di dati per poter tracciare mappe tematiche utilizzando identificatori che corrispondono a regioni di forma nello shapefile?Tracciamento di mappe tematiche in R Uso di Shapefile e file di dati da sorgenti differenti

#Download English Government Office Network Regions (GOR) from: 
#http://www.sharegeo.ac.uk/handle/10672/50 
tmp_dir = tempdir() 
url_data = "http://www.sharegeo.ac.uk/download/10672/50/English%20Government%20Office%20Network%20Regions%20(GOR).zip" 
zip_file = sprintf("%s/shpfile.zip", tmp_dir) 
download.file(url_data, zip_file) 
unzip(zip_file, exdir = tmp_dir) 

library(maptools) 

#Load in the data file (could this be done from the downloaded zip file directly? 
gor=readShapeSpatial(sprintf('%s/Regions.shp', tmp_dir)) 

#I can plot the shapefile okay... 
plot(gor) 

#and I can use these commands to get a feel for the data... 
summary(gor) 
attributes([email protected]) 
[email protected]$NAME 
#[1] North East    North West    
#[3] Greater London Authority West Midlands   
#[5] Yorkshire and The Humber South West    
#[7] East Midlands   South East    
#[9] East of England   
#9 Levels: East Midlands East of England ... Yorkshire and The Humber 

#download data from http://www.justice.gov.uk/downloads/publications/statistics-and-data/courts-and-sentencing/csq-q3-2011-insolvency-tables.csv 
#insolvency<- read.csv("~/Downloads/csq-q3-2011-insolvency-tables.csv") 
insolvency=read.csv("http://www.justice.gov.uk/downloads/publications/statistics-and-data/courts-and-sentencing/csq-q3-2011-insolvency-tables.csv") 
insolvencygor.2011Q3=subset(insolvency,Time.Period=='2011 Q3' & Geography.Type=='Government office region') 
#tidy the data 
require(gdata) 
insolvencygor.2011Q3=drop.levels(insolvencygor.2011Q3) 

names(insolvencygor.2011Q3) 
#[1] "Time.Period"     "Geography"     
#[3] "Geography.Type"    "Company.Winding.up.Petition" 
#[5] "Creditors.Petition"   "Debtors.Petition" 

levels(insolvencygor.2011Q3$Geography) 
#[1] "East"      "East Midlands"   
#[3] "London"     "North East"    
#[5] "North West"    "South East"    
#[7] "South West"    "Wales"     
#[9] "West Midlands"   "Yorkshire and the Humber" 

#So what next? 

avendo ottenuto così lontano, come faccio a fare il passo successivo nella creazione di una mappa tematica/choropleth, che i colori ogni regione in base al valore Debtors.Petition, per esempio?

(ho anche appena notato una possibile Gotcha - v'è un disallineamento della capitalizzazione livelli GOR: "Yorkshire e Humber" e "Yorkshire e Humber")

+0

Sembra [questo post SO] (http://stackoverflow.com/questions/1260965/developing-geographic-thematic-maps-with-r) (il primo nell'elenco "Correlato" nella barra laterale destra) potrebbe aiutarti a ottenere il resto del percorso. –

+0

L'ho visto, ma ho mancato la correzione il primo paio di volte ... Quindi quello che devo fare è qualcosa come: \t gor @ data = merge (insolvencygor.2011Q3, gor @ data, by.x = ' Geografia ", by.y =" NAME ") trama (gor, col = levels ([email protected]$Creditors.Petition)) con una mappatura dei colori appropriata e mappe dei nomi di regioni appropriate (noto che non è solo York e Humberside che non corrispondono ...) – psychemedia

+0

Potresti ridurre il set di dati a un piccolo esempio che illustra il tuo problema? Potresti salvarli usando il comando save e caricarli su SO o su un server e pubblicare il link qui. Questo renderebbe la riduzione della grande quantità di codice che hai molto più facile. –

risposta

1

non aver visto il legno per gli alberi, per rispondere alla mia domanda, ecco un modo (codice sulla scia codice nella questione):

#Convert factors to numeric [ http://stackoverflow.com/questions/4798343/convert-factor-to-integer ] 
#There's probably a much better formulaic way of doing this/automating this? 
insolvencygor.2011Q3$Creditors.Petition=as.numeric(levels(insolvencygor.2011Q3$Creditors.Petition))[insolvencygor.2011Q3$Creditors.Petition] 
insolvencygor.2011Q3$Company.Winding.up.Petition=as.numeric(levels(insolvencygor.2011Q3$Company.Winding.up.Petition))[insolvencygor.2011Q3$Company.Winding.up.Petition] 
insolvencygor.2011Q3$Debtors.Petition=as.numeric(levels(insolvencygor.2011Q3$Debtors.Petition))[insolvencygor.2011Q3$Debtors.Petition] 

#Tweak the levels so they match exactly (really should do this via a lookup table of some sort?) 
i2=insolvencygor.2011Q3 
i2c=c('East of England','East Midlands','Greater London Authority','North East','North West','South East','South West','Wales','West Midlands','Yorkshire and The Humber') 
i2$Geography=factor(i2$Geography,labels=i2c) 

#Merge the data with the shapefile 
[email protected]=merge([email protected],i2,by.x='NAME',by.y='Geography') 

#Plot the data using a greyscale 
plot(gor,col=gray([email protected]$Creditors.Petition/max([email protected]$Creditors.Petition))) 

Così che questo approccio non fa altro che unire i dati numerici nel shapefile, e poi trama direttamente.

Detto questo, non sarebbe un modo più pulito tenere il file di dati e lo shapefile separati? (Non sono ancora sicuro di come farlo?)

+0

Non penso che sarebbe più pulito, ed è necessario combinare i dati "normali" e spaziali per creare la trama. –

+0

E condivido la tua sensazione che il codice potrebbe essere più breve e più preciso, ma senza un esempio riproducibile è difficile dimostrarlo. –

+0

Riproducibile in che senso? Aggiungendo il codice di risposta sopra al codice nella domanda si genera la mappa tematica, anche se è ovvio che le fasi di download sono richieste come un intervento manuale, piuttosto che essere gestite dallo script. – psychemedia