2013-04-12 16 views
8

Sto provando a creare uno shapefile in R che successivamente verrà importato in Fusion Table o in un'altra applicazione GIS.Creazione di shapefile in R

Per iniziare, ho importato uno shapefile vuoto contenente tutti i tratti del censimento in Canada. Ho allegato altri dati (in formato tabellare) allo shapefile in base all'ID univoco dei CT e ho mappato i miei risultati. Al momento, ho solo bisogno di quelli a Vancouver e vorrei esportare uno shapefile che contenga solo i CT di Vancouver e i miei dati sugli attributi appena allegati.

Ecco il mio codice (alcune parti omesse per motivi di privacy):

shape <- readShapePoly('C:/TEST/blank_ct.shp') #Load blank shapefile 
[email protected] = data.frame([email protected], data2[match([email protected]$CTUID, data2$CTUID),]) #data2 is my created attributes that I'm attaching to blank file 
shape1 <-shape[shape$CMAUID == 933,] #selecting the Vancouver CTs 

Ho visto altri esempi di utilizzare questo: writePolyShape per creare lo shapefile. L'ho provato e ha funzionato in misura Ha creato i file .shp, .dbf e .shx. Mi manca il file .prj e non sono sicuro di come procedere per crearlo. Ci sono metodi migliori là fuori per la creazione di shapefile?

Qualsiasi aiuto in merito sarebbe molto apprezzato.

+1

Questo è il modo in cui scrivo i miei file 'writeOGR (obj = opno.skupaj.mean [[1]], dsn =" q: /path/to/file/spat_odstrel_skupaj.shp ", layer =" spat_odstrel_skupaj ", driver = "ESRI Shapefile") '.Si noti che il livello e il nome del file sono identici (meno il '.shp'). –

risposta

8

Utilizzare rgdal e writeOGR. rgdal manterrà le informazioni di proiezione

qualcosa come

library(rdgal) 

shape <- readOGR(dsn = 'C:/TEST', layer = 'blank_ct') 
# do your processing 
[email protected] = data.frame([email protected], data2[match([email protected]$CTUID, data2$CTUID),]) #data2 is my  created attributes that I'm attaching to blank file 
shape1 <-shape[shape$CMAUID == 933,] 
writeOGR(shape1, dsn = 'C:/TEST', layer ='newstuff', driver = 'ESRI Shapefile') 

Si noti che il dsn è la cartella contenente il file .shp, e il layer è il nome dello shapefile senza l'estensione .shp. Si leggerà (readOGR) e write() writeOGR tutti i file dei componenti (.dbf, .shp, .prj ecc)

+1

Che non funzionerà così com'è, non hai specificato l'oggetto 'shape' o' shape1' nella chiamata 'writeOGR' - come fa a sapere cosa scrivere? – Spacedman

+1

Penso che il percorso dsn per 'writeOGR' debba essere un percorso file completo che termina in' .shp'. –

+0

@Roman non è necessario, può essere writeOGR (x, ".", "Layername", "ESRI Shapefile") o writeOGR (x, "C: /temp/layername.shp", "layername", "ESRI Shapefile ") – mdsumner

4

Problema risolto! Grazie ancora per coloro che aiutano!

Ecco quello che ho finito per fare:

Come ha scritto Mnel, questa linea creerà lo shapefile.

writeOGR(shape1, dsn = 'C:/TEST', layer ='newstuff', driver = 'ESRI Shapefile') 

Tuttavia, quando mi sono imbattuto questa linea, è tornato con questo errore:

Can't convert columns of class: AsIs; column names: ct2,mprop,mlot,mliv 

Questo è perché il mio dati attributo non era numerici, ma erano personaggi. Fortunatamente, i miei dati di attributo sono tutti numeri quindi ho eseguito transform() per risolvere questo problema.

shape2 <-shape1 
[email protected] <- transform([email protected], ct2 = as.numeric(ct2), 
mprop = as.numeric(mprop), 
mlot = as.numeric(mlot), 
mliv = as.numeric(mliv)) 

ho provato il comando writeOGR() di nuovo, ma ancora non ha ottenuto il file .prj che stavo cercando. Il problema era che non avevo specificato i sistemi di coordinate per lo shapefile mentre stavo importando il file. Dato che conosco già il sistema di coordinate, tutto ciò che dovevo fare era definirlo durante l'importazione.

readShapePoly('C:/TEST/blank_ct.shp',proj4string=CRS("+proj=longlat +datum=WGS84") 

Dopo di che, ho ri-corse tutte le cose che volevo fare con lo shapefile, e la linea writeOGR per l'esportazione. E questo è tutto!

+0

Hai letto nel file con 'readOGR'? – mnel

Problemi correlati