2014-10-21 25 views
5

Sto cercando di fare alcune mappe della città, e mi piacerebbe distorcerle un po 'in modo che le parti più dense (manhattan in questo caso) sembrano essere un po' più larghe nella mappa finale. Sto avendo difficoltà a trovare buoni esempi di proiezione a livello di città.Quali proiezioni in r faranno ingrassare una mappa della città?

Mi piacerebbe una proiezione che rende una mappa più bella di New York, ma potrebbe essere troppo soggettiva, quindi diciamo che voglio fatten Manhattan. Codice riproducibile di quello che ho provato qui di seguito:

library(ggplot2) 
library(maptools) 

shpny.tf <- tempfile() 

download.file(
    "http://www2.census.gov/geo/tiger/TIGER2010/COUNTY/2010/tl_2010_36_county10.zip" , 
    shpny.tf , 
    mode = 'wb' 
) 

shpny.uz <- unzip(shpny.tf , exdir = tempdir()) 

ny.shp <- readShapePoly(shpny.uz[ grep('shp$' , shpny.uz) ]) 

# limit the shapefile to only the five boroughs 
nyc.shp <- subset(ny.shp , as.numeric(as.character(COUNTYFP10)) %in% c(5 , 47 , 61 , 81 , 85)) 

# prepare for plotting 
nyc <- fortify(nyc.shp) 

# make a plot 
p <- qplot(data = nyc , x = long , y = lat) 

# default plot 
p 

# these two seem like good candidates for fattening, 
# but i'm not sure how to make them take up more space on the right and left side 
p + coord_map("ortho", orientation=c(41, -74, -25)) 
p + coord_map("azequalarea",orientation=c(41,-74,-22)) 

# this one's okay but still not ideal 
p + coord_map("lagrange") 

# this one is named for new york yet i can't get it to do anything useful 
p + coord_map("newyorker",r=10) 

idealmente, il risultato ottenuto è più vicino alle proporzioni in questa nuova mappa della metropolitana York. Capisco che questa distorsione non è possibile solo con la proiezione, sono solo curioso di sapere se qualche proiezione potrebbe rendere la mappa più vicina a quella forma ideale. Grazie!

enter image description here

+0

Proprio la scelta di una proiezione appropriato non è in realtà una specifica questione di programmazione e come tale è fuori tema per questo sito. Forse prova [stats.se] per un consiglio generale di visualizzazione o [gis.se] per informazioni sui sistemi di informazione grafica. – MrFlick

+0

Puoi pubblicare un link o un'immagine di una mappa di cinque distretti che assomiglia più a come la vuoi? – hrbrmstr

+0

Inoltre, se stai cercando di realizzare il cartogramma di un povero in questo modo, non è certo il miglior approccio. – hrbrmstr

risposta

0
# this is clearly insane 
p + 
    geom_map(map=nyc, aes(map_id=id, group=group), fill="white", color="black") + 
    coord_map("globular" , orientation = c(40.55 , -74.11 , -24)) 

enter image description here

4

Ho scaricato lo shapefile e conservato da quando il download di un file costantemente 1M ha efficacia discutibile. Poiché ho fatto con curl sulla linea di comando, ero già in un terminale, in modo da pre-estratto cinque distretti con ogr2ogr:

$ ogr2ogr -f "ESRI Shapefile" \ 
      -where 'COUNTYFP10 IN ("005", "047", "061", "081", "085")' \ 
      boroughs.shp tl_2010_36_county10.shp 

successiva, ho letto il nuovo shapefile con readOGR e configurazione Alcune necessario biblioteche:

library(rgdal) 
library(maptools) 
library(ggplot2) 

boroughs.shp <- readOGR("tl_2010_36_county10/", "boroughs") 

Ora, ci separano New York e gli altri quattro borghi:

nyc <- boroughs.shp[boroughs.shp$NAME10 == "New York",] 
other_four <- boroughs.shp[boroughs.shp$NAME10 != "New York",] 

leggere su ?elide in quanto consente di ridimensionare i poligoni e spostarli, e in questo esempio dovrai fare più di quanto non mostri. Qui, scala nyc per 1.1 (arbitrariamente) ma mantieni la scala 1: 1 per gli altri. Sto prendendo un po 'di una scorciatoia qui e facendo entrambi dal elide cambia il CRS per SpatialPolygonsDataFrames.

nyc <- elide(nyc, scale=1.1) 
other_four <- elide(other_four, scale=1) 

Successivamente, abbiamo ri-combinare:

boroughs.shp <- spRbind(nyc, other_four) 

e fare il lavoro necessario per ggplot:

boroughs <- fortify(boroughs.shp, region="NAME10") 

preferisco geom_map e questo vi diamo poligoni contigui vs vostro diagramma punto :

gg <- ggplot(data=boroughs, aes(x=long, y=lat)) 
gg <- gg + geom_map(map=boroughs, aes(map_id=id, group=group), fill="white", color="black") 
gg <- gg + coord_map() 
gg 

enter image description here

Questo, ovviamente, non è la fine-stato che si desidera, ma ora che hai avuto gli strumenti necessari per costruire un cartogram corretta (anche se io non sono personalmente un fan di mappe poligono distorta).

È possibile eseguire l'effetto finale su read up more on making cartograms, ma sarà necessario uno sforzo maggiore. I veri cartogrammi sono la strada da percorrere qui, IMO, se vuoi fare l'ingrasso/il ridimensionamento per mostrare la densità.

MODIFICA O, forse accontentarsi di globular?

gg_globular <- gg + coord_map("globular", orientation=c(41,-74,-22)) + ggtitle("globular") 

enter image description here

+0

grazie per questo! ho passato un po 'di tempo con 'elide', ma non è chiaro come si manterrebbero le relazioni di confine come fa un cartogramma qui? se fai manhattan due volte più grande, i pezzi del puzzle non si adattano più. implementare [questo (defunct) pacchetto] (http://www.omegahat.org/Rcartogram/demo/synthetic.R) potrebbe essere possibile ma solo riprogettarlo sembra invece come una grande scorciatoia dato che non mi interessa molto sul ridimensionamento basato su popolazione o conteggio –

+0

mi piace 'globular' molto. manhattan island è ancora un po 'magra, ma questa è sicuramente l'opzione migliore presentata :) grazie! –

1

Ancora in vena di cartogrammi, è possibile combinare R con il programma Java multipiattaforma, ScapeToad. Chiaramente questo non è desiderabile come una soluzione pura-R, ma è comunque un'opzione.

Ad esempio:

# Create a field that will be used to distort polygons. 
# In our case, the second polygon corresponds to New York County (i.e. Manhattan) 
ny.shp$size <- c(1, 1.5, 1, 1, 1) 

Ora anatra verso ScapeGoat e generare il cartogram, utilizzando il campo size come attributo cartogram, e l'esportazione come .shp.

Questo produce il seguente:

enter image description here

Chiaramente questo approccio è meno appropriato se avete bisogno di linee di griglia precise.

+0

grazie per questo! ma ho bisogno di linee di griglia .. e sto cercando di mantenere molti strati/sovrapposizioni 'ggplot2' in sincronia. sto facendo kriging roba;) –

+0

@Anthony Fair abbastanza - ho pensato che potrebbe essere il caso. Buona fortuna: è una domanda interessante! – jbaums

1

Pseudocodice per una soluzione in qualsiasi lingua tu stia meglio scrivendo. Questo approccio ti consentirebbe di applicare diversi livelli di distorsione a diverse parti della mappa preservando le topologie dei bordi comuni.

Ho il sospetto che ci sia qualche scherzo con proiezioni diverse che non produrranno alcuna distorsione evidente su un'area geografica così piccola.

Ad ogni modo, questo è il modo in cui mi piacerebbe affrontarlo.

  1. punti dump di ciascun poligono, insieme poly_id e posizione di indice.
  2. Selezionare un punto di riferimento. Ad esempio, centroide del poligono più denso
  3. Calcola l'azimut e la distanza tra ciascun punto poligonale (passaggio 1) e il punto di riferimento (passaggio 3).
  4. Crea una funzione di traduzione con qualsiasi parametro desideri. Potrebbe essere semplicemente una funzione della distanza che mantiene costante l'azimuth o la distanza e il peccato dell'azimuth ecc. Se vuoi distorcere di più in un piano particolare.
  5. Calcolare la nuova x, y di ogni punto poligonale
  6. Rifare i poligoni.

Posso già pensare ad una grande animazione dei dati che mostra le forme che si trasformano nel tempo. Quando avrò un po 'di tempo, avrò il codice della soluzione e condividerò. HTH

+0

grazie per questo, mark! Sto sperando in una soluzione di sola proiezione perché ho a che fare con un sacco di livelli così come una griglia di punti di krigged. tutto ciò che distorce le singole forme in tutti i livelli con cui sto lavorando complicherà le cose di 10 volte. : / –

0

http://kartoweb.itc.nl/geometrics/coordinate%20transformations/coordtrans.html

fare riferimento alla teoria. : -.. (((

Il mio consiglio sarebbe quello di fare tutto il vostro analisi utilizzando i CRS attuali

Vorrei quindi deformare i risultati per vettorizzare ogni livello tra cui i raster (ad esempio centroidi discarica pixel) Poi ho' d applicare una funzione di traduzione di falsare le caratteristiche di ogni oggetto vettore nella stessa maniera. poi vorrei il vostro ri-rasterizzare tuoi stime puntuali Krigged.

il mio strumento preferito per questo sarebbe PostGIS usando ST_translate. avevo allora reinserire i dati in R per creare nuove superfici raster ai fini della visualizzazione.