2013-08-24 53 views
7

Tôi đang cố gắng làm điều tương tự được hỏi trong câu hỏi này, Cartogram + choropleth map in R, nhưng bắt đầu từ một SpatialPolygonsDataFrame và hy vọng sẽ kết thúc với cùng một loại đối tượng.Sử dụng Rcartogram trên đối tượng SpatialPolygonsDataFrame

Tôi có thể lưu đối tượng dưới dạng shapefile, sử dụng scapetoad, mở lại và chuyển đổi lại, nhưng tôi muốn có tất cả trong R để quy trình hoàn toàn có thể tái sản xuất và tôi có thể tự động mã hàng chục biến thể .

Tôi đã chia nhỏ mã Rcartogram trên github và thêm nỗ lực của tôi cho đến nay here.

Thực chất bản demo này tạo SpatialGrid trên bản đồ, tìm mật độ dân số tại mỗi điểm lưới và chuyển đổi thành ma trận mật độ theo định dạng yêu cầu cho cartogram() để làm việc. Càng xa càng tốt.

Nhưng, làm cách nào để nội suy các điểm bản đồ gốc dựa trên đầu ra của cartogram()?

Có hai vấn đề ở đây. Đầu tiên là lấy bản đồ và lưới vào cùng một đơn vị để cho phép nội suy. Thứ hai là truy cập mọi điểm của mọi đa giác, nội suy nó, và giữ chúng theo thứ tự đúng.

Lưới nằm trong các đơn vị lưới và bản đồ nằm trong các đơn vị dự kiến ​​(trong trường hợp của longlat mẫu). Một trong hai lưới phải được chiếu thành longlat hoặc bản đồ thành các đơn vị lưới. Suy nghĩ của tôi là tạo một CRS giả và sử dụng hàm này cùng với hàm spTransform() trong package(rgdal), vì điều này xử lý mọi điểm trong đối tượng với ít phiền phức.

Việc truy cập mọi điểm rất khó bởi vì chúng là một vài lớp trong đối tượng SpPDF: đối tượng> đa giác> Đa giác> đường> coords mà tôi nghĩ. Bất kỳ ý tưởng làm thế nào để truy cập vào trong khi vẫn giữ cấu trúc của bản đồ tổng thể nguyên vẹn?

+0

Tôi đã vấp phải câu hỏi này sau khi đăng [của riêng tôi] (http://stackoverflow.com/questions/32406216/population-weighted-polygon-distortion/) và đấu tranh với việc sử dụng 'Rcartogram'. Cho đến nay đề nghị của tôi là sử dụng ScapeToad; Tôi đang cố gắng quyết định liệu tôi có thể chuyển sự đơn giản của nó thành R – MichaelChirico

Trả lời

2

Sự cố này có thể được giải quyết với gói getcartr, có sẵn trên Chris Brunsdon's GitHub, được khám phá đẹp mắt trong this bài đăng trên blog.

Chức năng quick.carto thực hiện chính xác những gì bạn muốn - lấy SpatialPolygonsDataFrame làm đầu vào và có SpatialPolygonsDataFrame làm đầu ra.

Tái bản chất của các ví dụ trong bài viết trên blog đây trong trường hợp các liên kết đi chết, với phong cách của riêng tôi trộn lẫn trong & lỗi chính tả cố định:

(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