2013-08-24 9 views
7

Próbuję zrobić to samo, co zadane w tym pytaniu, Cartogram + choropleth map in R, ale zaczynając od SpatialPolygonsDataFrame i mając nadzieję na skończyć z tym samym typem obiektu.Użyj Rcartogramu na obiekcie SpatialPolygonsDataFrame

Mogę zapisać obiekt jako plik kształtu, użyć scapetoad, ponownie go otworzyć i przekonwertować z powrotem, ale wolałbym mieć wszystko wewnątrz R, aby procedura była w pełni powtarzalna, i dzięki temu mogę automatycznie zakodować dziesiątki odmian .

Rozwidlałem kod Rcartogramu na github i dodałem moje dotychczasowe starania here.

Zasadniczo to, co robi to demo, tworzy mapę przestrzenną na mapie, sprawdza gęstość zaludnienia w każdym punkcie siatki i konwertuje ją na macierz gęstości w formacie wymaganym do pracy nad cartogram(). Jak na razie dobrze.

Ale jak interpolować oryginalne punkty na mapie na podstawie wyników cartogram()?

Występują tutaj dwa problemy. Pierwszym jest uzyskanie mapy i siatki w tych samych jednostkach, aby umożliwić interpolację. Drugi to dostęp do każdego punktu każdego wielokąta, interpolowanie go i utrzymywanie wszystkich we właściwej kolejności.

Siatka znajduje się w jednostkach gridowych, a mapa jest w rzutowanych jednostkach (w przypadku przykładu z długim). Albo siatka musi być rzutowana na longlat, albo mapa na jednostki siatki. Moją myślą jest wykonanie fałszywego CRS i użycie go razem z funkcją spTransform() w package(rgdal), ponieważ obsługuje to każdy punkt obiektu przy minimalnym zamieszaniu.

Dostęp do każdego punktu jest trudny, ponieważ jest kilka warstw w dół do obiektu SpPDF: obiekt> wielokąty> Wielokąty> linie> współrzędne Myślę, że. Wszelkie pomysły, jak uzyskać do nich dostęp przy zachowaniu nienaruszonej struktury całej mapy?

+0

Właśnie natknąłem się na to pytanie po opublikowaniu [moje własne] (http://stackoverflow.com/questions/32406216/population-weighted-polygon-distortion/) i borykałem się z użyciem samego "Rcartogramu". Do tej pory moją rekomendacją jest użycie ScapeToad; Próbuję zdecydować, czy możliwe jest przeniesienie jego prostoty do samego R – MichaelChirico

Odpowiedz

2

Ten problem można rozwiązać, korzystając z pakietu getcartr, dostępnego pod numerem Chris Brunsdon's GitHub, co zostało szczegółowo opisane w poście na blogu this.

Funkcja quick.carto wykonuje dokładnie to, co chcesz - pobiera SpatialPolygonsDataFrame jako dane wejściowe i ma jako wyjście wartość SpatialPolygonsDataFrame.

Kopiowanie istotę przykład w blogu tutaj w przypadku łącza idzie martwy, z własnym stylem zmieszane w & literówek Poprawiono:

(Shapefile; World Bank population data)

library(getcartr) 
library(maptools) 
library(data.table) 

world <- readShapePoly("TM_WORLD_BORDERS-0.3.shp") 
#I use data.table, see blog post if you want a base approach; 
# data.table wonks may be struck by the following step as seeming odd; 
# see here: http://stackoverflow.com/questions/32380338 
# and here: https://github.com/Rdatatable/data.table/issues/1310 
# for some background on what's going on. 
[email protected] <- setDT([email protected]) 

world.pop <- fread("sp.pop.totl_Indicator_en_csv_v2.csv", 
        select = c("Country Code", "2013"), 
        col.names = c("ISO3", "pop")) 

[email protected][world.pop, Population := as.numeric(i.pop), on = "ISO3"] 

#calling quick.carto has internal calls to the 
# necessary functions from Rcartogram 
world.carto <- quick.carto(world, world$Population, blur = 0) 

#plotting with a color scale 
x <- [email protected][!is.na(Population), log10(Population)] 
ramp <- colorRampPalette(c("navy", "deepskyblue"))(21L) 
xseq <- seq(from = min(x), to = max(x), length.out = 21L) 
#annoying to deal with NAs... 
cols <- ramp[sapply(x, function(y) 
    if (length(z <- which.min(abs(xseq - y)))) z else NA)] 

plot(world.carto, col = cols, 
    main = paste0("Cartogram of the World's", 
        " Population by Country (2013)")) 

enter image description here

Powiązane problemy