使用公共标签 ID 合并形状文件中的多边形:unionSpatialPolygons
Merging Polygons in Shape Files with Common Tag IDs: unionSpatialPolygons
我正在尝试从形状文件中读取并将多边形与公共标签 ID 合并。
library(rgdal)
library(maptools)
if (!require(gpclib)) install.packages("gpclib", type="source")
gpclibPermit()
usa <- readOGR(dsn = "./path_to_data/", layer="the_name_of_shape_file")
usaIDs <- usa$segment_ID
isTRUE(gpclibPermitStatus())
usaUnion <- unionSpatialPolygons(usa, usaIDs)
当我尝试绘制合并的多边形时:
for(i in c(1:length(names(usaUnion)))){
print(i)
myPol <- usaUnion@polygons[[i]]@Polygons[[1]]@coords
polygon(myPol, pch = 2, cex = 0.3, col = i)
}
所有合并的线段看起来都很好,除了密歇根周围的线段,合并以一种非常奇怪的方式发生,因此该特定线段的结果区域仅给出如下所示的小多边形。
i = 10
usaUnion@polygons[[i]]@Polygons[[1]]@coords
输出:
[,1] [,2]
[1,] -88.62533 48.03317
[2,] -88.90155 47.96025
[3,] -89.02862 47.85066
[4,] -89.13988 47.82408
[5,] -89.19292 47.84461
[6,] -89.20179 47.88386
[7,] -89.15610 47.93923
[8,] -88.49753 48.17380
[9,] -88.62533 48.03317
原来是北方小岛:
我怀疑问题是由于某种原因 unionSpatialPolygons
函数不喜欢地理上分离的多边形 [密歇根州的左右两侧],但我还没有找到解决方案。
这是您可以重现的 link to input data。
我认为问题不在于 unionSpatialPolygons
而在于你的情节。具体来说,您只为每个 ID 绘制第一个 'sub-polygon'。 运行 下面验证哪里出了问题:
for(i in 1:length(names(usaUnion))){
print(length(usaUnion@polygons[[i]]@Polygons))
}
对于每一个,你只拿了第一个。
我使用以下代码得到了正确的多边形 join/plot:
library(rgdal)
library(maptools)
library(plyr)
usa <- readOGR(dsn = "INSERT_YOUR_PATH", layer="light_shape")
# remove NAs
usa <- usa[!is.na(usa$segment_ID), ]
usaIDs <- usa$segment_ID
#get unique colors
set.seed(666)
unique_colors <- sample(grDevices::colors()[grep('gr(a|e)y|white', grDevices::colors(), invert = T)], 15)
colors <- plyr::mapvalues(
usaIDs,
from = as.numeric(sort(as.character(unique(usaIDs)))), #workaround to get correct color order
to = unique_colors
)
plot(usa, col = colors, main = "Original Map")
usaUnion <- unionSpatialPolygons(usa, usaIDs)
plot(usaUnion, col = unique_colors, main = "Joined Polygons")
这是一个使用 sf
来绘制此图的示例,它突出显示了包如何与 dplyr
和 summarise
一起工作,特别是如何使此操作极具表现力和简洁性。我 filter
找出丢失的 ID,group_by
ID,summarise
(默认情况下并集),并使用 geom_sf
.
轻松绘制
library(tidyverse)
library(sf)
# Substitute wherever you are reading the file from
light_shape <- read_sf(here::here("data", "light_shape.shp"))
light_shape %>%
filter(!is.na(segment_ID)) %>%
group_by(segment_ID) %>%
summarise() %>%
ggplot() +
geom_sf(aes(fill = factor(segment_ID)))
我正在尝试从形状文件中读取并将多边形与公共标签 ID 合并。
library(rgdal)
library(maptools)
if (!require(gpclib)) install.packages("gpclib", type="source")
gpclibPermit()
usa <- readOGR(dsn = "./path_to_data/", layer="the_name_of_shape_file")
usaIDs <- usa$segment_ID
isTRUE(gpclibPermitStatus())
usaUnion <- unionSpatialPolygons(usa, usaIDs)
当我尝试绘制合并的多边形时:
for(i in c(1:length(names(usaUnion)))){
print(i)
myPol <- usaUnion@polygons[[i]]@Polygons[[1]]@coords
polygon(myPol, pch = 2, cex = 0.3, col = i)
}
所有合并的线段看起来都很好,除了密歇根周围的线段,合并以一种非常奇怪的方式发生,因此该特定线段的结果区域仅给出如下所示的小多边形。
i = 10
usaUnion@polygons[[i]]@Polygons[[1]]@coords
输出:
[,1] [,2]
[1,] -88.62533 48.03317
[2,] -88.90155 47.96025
[3,] -89.02862 47.85066
[4,] -89.13988 47.82408
[5,] -89.19292 47.84461
[6,] -89.20179 47.88386
[7,] -89.15610 47.93923
[8,] -88.49753 48.17380
[9,] -88.62533 48.03317
原来是北方小岛:
我怀疑问题是由于某种原因 unionSpatialPolygons
函数不喜欢地理上分离的多边形 [密歇根州的左右两侧],但我还没有找到解决方案。
这是您可以重现的 link to input data。
我认为问题不在于 unionSpatialPolygons
而在于你的情节。具体来说,您只为每个 ID 绘制第一个 'sub-polygon'。 运行 下面验证哪里出了问题:
for(i in 1:length(names(usaUnion))){
print(length(usaUnion@polygons[[i]]@Polygons))
}
对于每一个,你只拿了第一个。
我使用以下代码得到了正确的多边形 join/plot:
library(rgdal)
library(maptools)
library(plyr)
usa <- readOGR(dsn = "INSERT_YOUR_PATH", layer="light_shape")
# remove NAs
usa <- usa[!is.na(usa$segment_ID), ]
usaIDs <- usa$segment_ID
#get unique colors
set.seed(666)
unique_colors <- sample(grDevices::colors()[grep('gr(a|e)y|white', grDevices::colors(), invert = T)], 15)
colors <- plyr::mapvalues(
usaIDs,
from = as.numeric(sort(as.character(unique(usaIDs)))), #workaround to get correct color order
to = unique_colors
)
plot(usa, col = colors, main = "Original Map")
usaUnion <- unionSpatialPolygons(usa, usaIDs)
plot(usaUnion, col = unique_colors, main = "Joined Polygons")
这是一个使用 sf
来绘制此图的示例,它突出显示了包如何与 dplyr
和 summarise
一起工作,特别是如何使此操作极具表现力和简洁性。我 filter
找出丢失的 ID,group_by
ID,summarise
(默认情况下并集),并使用 geom_sf
.
library(tidyverse)
library(sf)
# Substitute wherever you are reading the file from
light_shape <- read_sf(here::here("data", "light_shape.shp"))
light_shape %>%
filter(!is.na(segment_ID)) %>%
group_by(segment_ID) %>%
summarise() %>%
ggplot() +
geom_sf(aes(fill = factor(segment_ID)))