0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Перед тем как приступить к самому главному - рисованию карт, хочу обратить внимание, что чем детальнее границы регионов, тем "сложнее" полигоны и больше необходимо времени для отрисовки. Поэтому все регионы РФ без предварительного упрощения границ лучше не изображать. Предлагаю оставить только Центральный федеральный округ.</p>
1
<p>Перед тем как приступить к самому главному - рисованию карт, хочу обратить внимание, что чем детальнее границы регионов, тем "сложнее" полигоны и больше необходимо времени для отрисовки. Поэтому все регионы РФ без предварительного упрощения границ лучше не изображать. Предлагаю оставить только Центральный федеральный округ.</p>
2
cfo_map <- map_shp[str_detect(map_shp$ADM3_NAME, "Центральный"), ]<h2>Наконец-то, рисуем!</h2>
2
cfo_map <- map_shp[str_detect(map_shp$ADM3_NAME, "Центральный"), ]<h2>Наконец-то, рисуем!</h2>
3
<p>Добавим цвет, чтобы не было слишком грустно:</p>
3
<p>Добавим цвет, чтобы не было слишком грустно:</p>
4
plot(cfo_map, main = "Центральный федеральный округ", col = colorRampPalette(brewer.pal(8, "Dark2"))(nrow(cfo_map)))<p>То же можно проделать и в<strong>ggplot</strong>. Тут понадобится сделать одно дополнительное действие с помощью функции fortify() (из списка полигонов она сделает единый<strong>датафрейм</strong>).</p>
4
plot(cfo_map, main = "Центральный федеральный округ", col = colorRampPalette(brewer.pal(8, "Dark2"))(nrow(cfo_map)))<p>То же можно проделать и в<strong>ggplot</strong>. Тут понадобится сделать одно дополнительное действие с помощью функции fortify() (из списка полигонов она сделает единый<strong>датафрейм</strong>).</p>
5
<h3>Перевод проекции карты в dataframe:</h3>
5
<h3>Перевод проекции карты в dataframe:</h3>
6
map.df <- fortify(cfo_map, region = "NAME")<h3>Создание объекта карты:</h3>
6
map.df <- fortify(cfo_map, region = "NAME")<h3>Создание объекта карты:</h3>
7
cfo.map <- ggplot(map.df, aes(long, lat, group = group, fill = id)) +<h3>Добавим alpha = 0.7, чтобы полигоны слегка просвечивали:</h3>
7
cfo.map <- ggplot(map.df, aes(long, lat, group = group, fill = id)) +<h3>Добавим alpha = 0.7, чтобы полигоны слегка просвечивали:</h3>
8
geom_polygon(color = "white", alpha = 0.7) + coord_map() + labs(x = "Долгота", y = "Широта", fill = "") + ggtitle("Центральный фед. округ")<h3>Выведем полученный объект:</h3>
8
geom_polygon(color = "white", alpha = 0.7) + coord_map() + labs(x = "Долгота", y = "Широта", fill = "") + ggtitle("Центральный фед. округ")<h3>Выведем полученный объект:</h3>
9
<p>Здорово, но как-то скучно, правда? Было бы проще ориентироваться, если бы регионы на карте были подписаны. Не беда, надо лишь рассчитать<strong>центроиды</strong>(координаты, куда поместим надпись).</p>
9
<p>Здорово, но как-то скучно, правда? Было бы проще ориентироваться, если бы регионы на карте были подписаны. Не беда, надо лишь рассчитать<strong>центроиды</strong>(координаты, куда поместим надпись).</p>
10
centroid <- aggregate(cbind(long, lat) ~ id, data = map.df, FUN = mean) cfo.map <- ggplot(map.df, aes(long, lat, group = group, fill = id)) + geom_polygon(color = "white", alpha = 0.7) + geom_text(data = centroid, mapping = aes(x = long, y = lat, label = id), inherit.aes = F, cex = 1.5) + coord_map() + labs(x = "Долгота", y = "Широта") + ggtitle("Центральный фед. округ") + theme(legend.position = "none") cfo.map<p><strong>Так уже лучше!</strong>Для разнообразия рассмотрим очень простую прикладную задачу: заливка с зависимости от свойств региона. В нашем случае это будет логарифм количества филиалов банков из других регионов в 2014 г. (данные GISGeo).</p>
10
centroid <- aggregate(cbind(long, lat) ~ id, data = map.df, FUN = mean) cfo.map <- ggplot(map.df, aes(long, lat, group = group, fill = id)) + geom_polygon(color = "white", alpha = 0.7) + geom_text(data = centroid, mapping = aes(x = long, y = lat, label = id), inherit.aes = F, cex = 1.5) + coord_map() + labs(x = "Долгота", y = "Широта") + ggtitle("Центральный фед. округ") + theme(legend.position = "none") cfo.map<p><strong>Так уже лучше!</strong>Для разнообразия рассмотрим очень простую прикладную задачу: заливка с зависимости от свойств региона. В нашем случае это будет логарифм количества филиалов банков из других регионов в 2014 г. (данные GISGeo).</p>
11
banks <- readOGR("~/Banks/banks.shp", encoding = "cp1251") ## OGR data source with driver: ESRI Shapefile ## Source: "/Users/akondrashov/Banks/banks.shp", layer: "banks" ## with 83 features ## It has 12 fields banks_cfo <- banks[str_detect(banks$FEDERAL_DI, "Центральный"), ] bank.df <- merge(map.df, banks_cfo@data[, c("NAME", "N2014_BAN2")], by.x = "id", by.y = "NAME") cfo.map_banks <- ggplot(bank.df, aes(long, lat, group = group, fill = log(N2014_BAN2))) + geom_polygon(color = "white", alpha = 0.7) + geom_text(data = centroid, mapping = aes(x = long, y = lat, label = id), inherit.aes = F, cex = 1.5) + coord_map() + labs(x = "Долгота", y = "Широта", fill = "Логарифм кол-ва банков") + ggtitle("Центральный фед. округ") + theme(legend.position = "bottom") cfo.map_banks<h2>Дополнительно</h2>
11
banks <- readOGR("~/Banks/banks.shp", encoding = "cp1251") ## OGR data source with driver: ESRI Shapefile ## Source: "/Users/akondrashov/Banks/banks.shp", layer: "banks" ## with 83 features ## It has 12 fields banks_cfo <- banks[str_detect(banks$FEDERAL_DI, "Центральный"), ] bank.df <- merge(map.df, banks_cfo@data[, c("NAME", "N2014_BAN2")], by.x = "id", by.y = "NAME") cfo.map_banks <- ggplot(bank.df, aes(long, lat, group = group, fill = log(N2014_BAN2))) + geom_polygon(color = "white", alpha = 0.7) + geom_text(data = centroid, mapping = aes(x = long, y = lat, label = id), inherit.aes = F, cex = 1.5) + coord_map() + labs(x = "Долгота", y = "Широта", fill = "Логарифм кол-ва банков") + ggtitle("Центральный фед. округ") + theme(legend.position = "bottom") cfo.map_banks<h2>Дополнительно</h2>
12
<p>В данной заметке приведён далеко не весь функционал, доступный при рисовании карт. Рекомендую обратить внимание на следующее: • Пакет<strong>ggmap</strong>- с недавних (относительно даты этой заметки) работает только по подписке google (требуется API-ключ), позволяет изображать полигоны на фоне реальных гугл-карт.<a>Гитхаб</a>. • С помощью leaflet и plotly можно построить интерактивные картограммы. • Собственные карты также можно экспортировать из различного ПО для GIS. Из свободно распространяемых подойдёт QGIS. • Проекции: не секрет, что изображение земли на карте и на глобусе сильно отличаются друг от друга. Так, например, большинство современных карт изображают северные и южные регионы гораздо бо́льшими, чем они есть на самом деле. Разными проекциями карт можно подчеркнуть какой-нибудь интересный факт. Советую почитать<a>данную статью</a>, чтобы лучше понять, в чем дело.</p>
12
<p>В данной заметке приведён далеко не весь функционал, доступный при рисовании карт. Рекомендую обратить внимание на следующее: • Пакет<strong>ggmap</strong>- с недавних (относительно даты этой заметки) работает только по подписке google (требуется API-ключ), позволяет изображать полигоны на фоне реальных гугл-карт.<a>Гитхаб</a>. • С помощью leaflet и plotly можно построить интерактивные картограммы. • Собственные карты также можно экспортировать из различного ПО для GIS. Из свободно распространяемых подойдёт QGIS. • Проекции: не секрет, что изображение земли на карте и на глобусе сильно отличаются друг от друга. Так, например, большинство современных карт изображают северные и южные регионы гораздо бо́льшими, чем они есть на самом деле. Разными проекциями карт можно подчеркнуть какой-нибудь интересный факт. Советую почитать<a>данную статью</a>, чтобы лучше понять, в чем дело.</p>
13
<p><em>На этом всё! Если есть вопросы - пишите в комментариях.</em></p>
13
<p><em>На этом всё! Если есть вопросы - пишите в комментариях.</em></p>
14
14