Разделение карты канадской переписи в R

Я очень новичок в R и в картографировании, и я хотел бы создать карту определенных данных. У меня есть набор данных под названием «D.Montreal», который показывает, из какого отдела переписи населения Канады прибыли посетители в Монреаль в 2010 году. Я хотел бы создать карту, используя эти данные, чтобы показать, сколько людей приехало из разных регионов, возможно, путем раскрашивания карта разного цвета в зависимости от количества людей.

Есть ли пакет, который я могу использовать для разграничения участков переписи в Канаде?

Пока что я сделал набросок Канады:

map("worldHires","Canada", xlim=c(-141,-53), ylim=c(40,85), col="grey90", fill=TRUE)

Большое спасибо!


person K new in R    schedule 27.09.2014    source источник
comment
Вам следует взглянуть на представление пространственной задачи. sp пакеты связывают их все.   -  person Roman Luštrik    schedule 27.09.2014
comment
Одна нота. По соглашению, когда вы получаете полезные ответы, вы можете принять лучший ответ. есть галочка под кнопкой upvote/downvote. Вот как вы оцениваете работы пользователей SO. У вас такой отличный ответ от hrbrmstr. :)   -  person jazzurro    schedule 31.10.2014


Ответы (1)


Определенно широкий вопрос, и работа с пространственным представлением задач (как предложил Роман) является отличной отправной точкой. Я предпочитаю работать с ggplot, когда дело доходит до отображения, хотя это и требует некоторого усилия. Некоторые из следующих действий не будут иметь смысла, пока вы не наткнетесь на некоторые темы пространственных задач, но, по сути, они берут шейп-файл из Statistics Canada, упрощает его (поэтому многоугольники не загружаются/вычерчиваются вечно), а затем раскрашивает их по площади:

library(rgeos)
library(rgdal)
library(maptools)
library(sp)
library(ggplot2)

# decent, uncluttered map theme (needs devtools package tho)
devtools::source_gist("https://gist.github.com/hrbrmstr/33baa3a79c5cfef0f6df")

# grab the file from "Statistics Canada"
download.file("http://www12.statcan.gc.ca/census-recensement/2011/geo/bound-limit/files-fichiers/gcd_000b11a_e.zip",
              destfile="gcd_000b11a_e.zip")

unzip("gcd_000b11a_e.zip")

# this simplifies the polygons so they load/plot faster
system("ogr2ogr canada.shp gcd_000b11a_e.shp -simplify 0.01")

# what layers do we have? you can use this to check
#   ogrListLayers("gcd_000b11a_e/canada.shp")
# but there are none, so the shapefile is the layer

canada <- readOGR("gcd_000b11a_e/","canada")

# do this to see what's available from an "identifier" standpoint
# "CDNAME" seems to be the census district name
# "PRNAME" seems to be the province name
# str(canada@data)

# rig up  some data
# make a data frame of census division areas
# you can assign as many value columns as you like
# they get merged in later and can be used as the fill level
# we'll use the area as the fill level
map_areas <- data.frame(id=canada@data$CDNAME,
                        area=sapply(slot(canada, "polygons"), slot, "area") )

# this takes a while, but it makes a data frame for use with
# ggplot and lets us use the census division name for doing things
# like applying colors
canada_map <- fortify(canada, region="CDNAME")

# merge in areas
canada_map <- merge(canada_map, map_areas, by="id")

gg <- ggplot()
gg <- gg + geom_map(data=canada_map, map=canada_map,
                    aes(map_id=id, x=long, y=lat, group=group, fill=log1p(area)),
                    color="white", size=0.1)
gg <- gg + coord_map() # can choose other projections
gg <- gg + theme_map()
gg

введите здесь описание изображения

Работать с чем-то вроде данных о населении очень похоже. Я нашел некоторые данные о населении провинций, и ниже приведена схема для них (которая может быть чрезмерно упрощена, но я стремился упростить построение переписных районов) на основе населения.

province_pop <- data.frame(
  id=c("Newfoundland and Labrador / Terre-Neuve-et-Labrador",
       "Prince Edward Island / Île-du-Prince-Édouard",
       "Nova Scotia / Nouvelle-Écosse", "New Brunswick / Nouveau-Brunswick",
       "Quebec / Québec", "Ontario", "Manitoba", "Saskatchewan",
       "Alberta", "British Columbia / Colombie-Britannique", "Yukon",
       "Northwest Territories / Territoires du Nord-Ouest", "Nunavut"),
  population=c(526977.0, 146283.0, 942668.0, 753914.0, 8214672.0, 13678740.0, 
               1282043.0, 1125410.0, 4121692.0, 4631302.0, 36510.0, 43623.0, 36585.0))

canada_map <- fortify(canada, region="PRNAME")
canada_map <- merge(canada_map, province_pop, by="id")

gg <- ggplot()
gg <- gg + geom_map(data=canada_map, map=canada_map,
                    aes(map_id=id, x=long, y=lat, group=group, fill=population),
                    color="white", size=0.5)
gg <- gg + scale_fill_continuous(low="#ccebc5", high="#084081")
gg <- gg + coord_map()
gg <- gg + theme_map()
gg

введите здесь описание изображения

Вы определенно захотите взглянуть на значения столбцов в canada@data, поскольку, как вы можете видеть из названий провинций, они могут содержать как французскую, так и английскую версии.

Я могу подделать некоторые данные переписи населения, чтобы показать, что это та же методология:

fake_census_pop <- data.frame(
  id=unique(as.character(canada@data$CDNAME)),
  fake_pop=sample(500000:30000000, length(unique(as.character(canada@data$CDNAME)))))

canada_map <- fortify(canada, region="CDNAME")
canada_map <- merge(canada_map, fake_census_pop, by="id")

gg <- ggplot()
gg <- gg + geom_map(data=canada_map, map=canada_map,
                    aes(map_id=id, x=long, y=lat, group=group, fill=fake_pop),
                    color="white", size=0.1)
gg <- gg + scale_fill_continuous(low="#ccebc5", high="#084081")
gg <- gg + coord_map()
gg <- gg + theme_map()
gg

введите здесь описание изображения

person hrbrmstr    schedule 27.09.2014
comment
расчет площади слишком упрощен, так как он не учитывает дыры, но это было просто для демонстрации - person hrbrmstr; 28.09.2014
comment
Спасибо, это было очень полезно. Однако у меня возникли проблемы с некоторыми командами. «Система (ogr2ogr canada.shp gcd_000b11a_e.shp -simplify 0.01)» отправляет мне ошибку (system (ogr2ogr canada.shp gcd_000b11a_e.shp -simplify 0.01)). Я все еще могу загрузить остальные, но мне также пришлось изменить «canada ‹- readOGR (gcd_000b11a_e/,canada)» на «canada ‹- readShapeSpatial (gcd_000b11a_e)». Поскольку я не упростил полигоны, остальное очень медленно , но я получаю карту! Я постараюсь выяснить, как поместить туда свои данные в ближайшие несколько дней. Спасибо еще раз. - person K new in R; 04.10.2014
comment
@hrbrmstr Очень добрая и приятная демонстрация. Я всегда нахожу ваши ответы ГИС полезными. +1 :) - person jazzurro; 31.10.2014