R中不同级别的空间多边形着色

时间:2017-03-28 09:08:32

标签: r spatial sp

我的主要目标是将多个空间多边形组合成一个地图,然后根据变量的级别对它们进行着色。

为此,我首先清理并聚合GADM数据:

france <- getData("GADM", country = "FRA", level = 5)    

接下来,我将几个区域合并为:

Normandie_names <- c("Basse-Normandie", "Haute-Normandie")
Normandie_index <- which(france$NAME_1 %in% Normandie_names) 
regionOfInterest_Normandie <- gUnionCascaded(france[Normandie_index, ])
Normandie        <- regionOfInterest_Normandie %>% geometry
Normandie        <- sapply(Normandie@polygons, slot, "area") %>% 
{which(. == max(.))} %>% Normandie[.]
Normandie$Name <- "Normandie"

2)第二个区域以相同的方式:

Bourgogne_Franche_Comte_names <- c("Bourgogne", "Franche-Comté")
Bourgogne_Franche_Comte_index <- which(france$NAME_1 %in%     
Bourgogne_Franche_Comte_names)
regionOfInterest_Bourgogne_Franche_Comte <-   

gUnionCascaded(france[Bourgogne_Franche_Comte_index, ])
Bourgogne_Franche_Comte<-regionOfInterest_Bourgogne_Franche_Comte%>% geometry
Bourgogne_Franche_Comte<- sapply(Bourgogne_Franche_Comte@polygons, slot,   "area") %>% 
{which(. == max(.))} %>% Bourgogne_Franche_Comte[.]
Bourgogne_Franche_Comte$Name <- "Bourgogne_Franche_Comte"

现在,我有2个空间多边形,但我想根据外部值为它们着色: 假设Bourgogne_Franche_Comte值为100,Normandie值为30。 我想用相同颜色但不同级别(即深色或亮绿色)为地图着色。

首先我想合并两个空间多边形:

joined <- union(Normandie, Bourgogne_Franche_Comte)

然后可能使用绘图功能,但

plot(joined, col = joined$Value)

重点在于想要控制颜色和颜色的级别 - 取决于值。

这是帮助!!

1 个答案:

答案 0 :(得分:0)

你的方式,简化

您可以直接在spatialpolygon对象上使用which来简化选择区域的方式 例如:

Normandie_names <- c("Basse-Normandie", "Haute-Normandie")
Normandie <- france[which(france$NAME_1 %in% Normandie_names),]

您可以使用rbind组合两个多边形:

joined <- rbind(Normandie, Bourgogne_Franche_Comte)

使用SpatialPolygonsDataFrame,您可以将外部数据添加到多边形。 您可以使用heat.colors之类的调色板根据您的值为多边形着色 因此,完整的脚本将如下所示:

library(sp)
library(rgdal)
library(raster)
library(rgeos)
library(dplyr)
library(ggplot2)

# Load data
france <- getData("GADM", country = "FRA", level = 5)

# Select features ---------------
# Select Normandie
Normandie_names <- c("Basse-Normandie", "Haute-Normandie")
Normandie <- france[which(france$NAME_1 %in% Normandie_names),]
Normandie.sp.tmp <- gUnaryUnion(Normandie)
# Add external data to Normandie
Normandie.sp <- SpatialPolygonsDataFrame(
  Normandie.sp.tmp, 
  data = data.frame(region = "Normandie", value = 30))

# Select Bourgogne
Bourgogne_Franche_Comte_names <- c("Bourgogne", "Franche-Comté")
Bourgogne <- france[which(france$NAME_1 %in% Bourgogne_Franche_Comte_names),]
Bourgogne.sp.tmp <- gUnaryUnion(Bourgogne)
# Add external data to Bourgogne
Bourgogne.sp <- SpatialPolygonsDataFrame(
  Bourgogne.sp.tmp,
  data = data.frame(region = "Bourgogne_Franche_Comte", value = 100))

# Merge both polygons with their data
Regions.sp <- rbind(Normandie.sp, Bourgogne.sp)

plot(Regions.sp, col = rev(heat.colors(50))[Regions.sp$value/2])

一种更清洁的方式,它保持完整的法国多边形

我建议将gUnaryUnion与向量一起使用,指定哪些多边形只合并一次。然后,您可以添加外部数据。

# Create vector to define which regions will be united
Union.vector <- rep(0, length(france))
Union.vector[which(france$NAME_1 %in% Normandie_names)] <- 1
Union.vector[which(france$NAME_1 %in% Bourgogne_Franche_Comte_names)] <- 2

# Unite regions
Region.union.sp <- gUnaryUnion(france, id = Union.vector)

# Add external dataset
Region.union.sp.data <- SpatialPolygonsDataFrame(
  Region.union.sp, 
  data = data.frame(
    value = c(0, 30, 100), 
    region = c("all", "Normandie", "Bourgogne_Franche_Comte")),
  match.ID = FALSE)

plot(Region.union.sp.data,
     col = rev(heat.colors(51))[1 + Region.union.sp.data$value/2])