如何从以列表数据类型给出的空间多边形在 R 中创建地图
How to create map in R from spatial polygon given as list data type
我有一个列表(从 Stata dta 文件导入),其中包含为地图定义空间多边形的条目,以提供一个想法:
> typeof(aux3)
[1] "list"
> mode(aux3)
[1] "list"
> head(aux3)
_ID _X _Y
1 1 NA NA
2 1 -22.23933 64.56315
3 1 -22.25667 64.56053
4 1 -22.25026 64.56653
5 1 -22.27167 64.57319
6 1 -22.30311 64.55409
> tail(head(aux3,20000))
_ID _X _Y
19995 2 21.21593 60.24696
19996 2 21.21650 60.24337
19997 2 21.23972 60.24913
19998 2 21.22203 60.23304
19999 2 21.21618 60.23332
20000 2 21.22092 60.23930
> #etc.
我想将它转换成一个数据结构,我可以用它在 R 中创建地图(没有更大的困难,也不需要广泛的专业知识,以前从未做过)。我推断 SpacialPolygons 类型sp 包是最简单的选择。此外,从定义来看,似乎 SpacialPolygons 方法(在此包中定义,参见 package's documentation,第 79 页)是从列表转换为该数据类型的正确方法。
不幸的是,该方法不是那么容易使用,我需要一些帮助。我的(天真)尝试产生了一个我不理解的错误,并且在 google 搜索中没有出现任何有趣的结果:
> library(maptools)
Loading required package: sp
Checking rgeos availability: FALSE
Note: when rgeos is not available, polygon geometry computations in maptools depend on gpclib,
which has a restricted licence. It is disabled by default;
to enable gpclib, type gpclibPermit()
> SP<-SpatialPolygons(aux3)
Error in SpatialPolygons(aux3) :
cannot get a slot ("area") from an object of type "integer"
上面的列表可以转换成SpacialPolygon吗?如果是这样,如何?如果不是,我应该选择什么格式?谢谢
如果你只是想画地图,你可以使用ggplot。我无法测试这个,因为我没有你的数据,但应该可以。
library(ggplot2)
aux_df <- data.frame(aux3)
# as per comment: the list-to-dataframe conversion prepends the column names with X
ggplot(aux_df, aes(x=X_X, y=X_Y, group=X_ID) +
geom_polygon(color='black', fill=NA) +
coord_map() +
theme_classic()
以上假定列表 aux3
在 _X
和 _Y
中具有经度和纬度,并且多边形由 _ID
定义。它默认应用墨卡托投影,但您可以使用 coord_map()
.
的不同参数更改此投影
这是一个使用俄亥俄县地图的工作示例(任意选择)。
library(ggplot2)
ohio_poly <- map_data('county', region='ohio')
ggplot(ohio_poly, aes(x=long, y=lat, group=group)) +
geom_polygon(color='black', fill=NA) +
coord_map() +
theme_classic()
我有一个列表(从 Stata dta 文件导入),其中包含为地图定义空间多边形的条目,以提供一个想法:
> typeof(aux3)
[1] "list"
> mode(aux3)
[1] "list"
> head(aux3)
_ID _X _Y
1 1 NA NA
2 1 -22.23933 64.56315
3 1 -22.25667 64.56053
4 1 -22.25026 64.56653
5 1 -22.27167 64.57319
6 1 -22.30311 64.55409
> tail(head(aux3,20000))
_ID _X _Y
19995 2 21.21593 60.24696
19996 2 21.21650 60.24337
19997 2 21.23972 60.24913
19998 2 21.22203 60.23304
19999 2 21.21618 60.23332
20000 2 21.22092 60.23930
> #etc.
我想将它转换成一个数据结构,我可以用它在 R 中创建地图(没有更大的困难,也不需要广泛的专业知识,以前从未做过)。我推断 SpacialPolygons 类型sp 包是最简单的选择。此外,从定义来看,似乎 SpacialPolygons 方法(在此包中定义,参见 package's documentation,第 79 页)是从列表转换为该数据类型的正确方法。
不幸的是,该方法不是那么容易使用,我需要一些帮助。我的(天真)尝试产生了一个我不理解的错误,并且在 google 搜索中没有出现任何有趣的结果:
> library(maptools)
Loading required package: sp
Checking rgeos availability: FALSE
Note: when rgeos is not available, polygon geometry computations in maptools depend on gpclib,
which has a restricted licence. It is disabled by default;
to enable gpclib, type gpclibPermit()
> SP<-SpatialPolygons(aux3)
Error in SpatialPolygons(aux3) :
cannot get a slot ("area") from an object of type "integer"
上面的列表可以转换成SpacialPolygon吗?如果是这样,如何?如果不是,我应该选择什么格式?谢谢
如果你只是想画地图,你可以使用ggplot。我无法测试这个,因为我没有你的数据,但应该可以。
library(ggplot2)
aux_df <- data.frame(aux3)
# as per comment: the list-to-dataframe conversion prepends the column names with X
ggplot(aux_df, aes(x=X_X, y=X_Y, group=X_ID) +
geom_polygon(color='black', fill=NA) +
coord_map() +
theme_classic()
以上假定列表 aux3
在 _X
和 _Y
中具有经度和纬度,并且多边形由 _ID
定义。它默认应用墨卡托投影,但您可以使用 coord_map()
.
这是一个使用俄亥俄县地图的工作示例(任意选择)。
library(ggplot2)
ohio_poly <- map_data('county', region='ohio')
ggplot(ohio_poly, aes(x=long, y=lat, group=group)) +
geom_polygon(color='black', fill=NA) +
coord_map() +
theme_classic()