在R中不使用shapefile的情况下实例化空间多边形


22

因此,我们在R中读取shapefile的通常方法是通过maptools包,如下所示:

sfdata <- readShapeSpatial("/path/to/my/shapefile.shp", proj4string=CRS("+proj=longlat"))

但是,我有一个用例,其中没有shapefile.shp,而是有一系列多边形坐标

16.484375 59.736328125,17.4951171875 55.1220703125,24.74609375 55.0341796875,22.5927734375 61.142578125,16.484375 59.736328125

及其对应的投影

coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 

如何直接从该数据“实例化” sfdata(将是“多边形对象”)?(无需以round回的方式使用这些数据创建shapefile,然后从新创建的shapefile中读取)

Answers:


35

首先将坐标放入2列矩阵中:

> xym
         [,1]     [,2]
[1,] 16.48438 59.73633
[2,] 17.49512 55.12207
[3,] 24.74609 55.03418
[4,] 22.59277 61.14258
[5,] 16.48438 59.73633

然后创建一个Polygon,将其包装到Polygons对象中,然后将其包装到SpatialPolygons对象中:

> library(sp)
> p = Polygon(xym)
> ps = Polygons(list(p),1)
> sps = SpatialPolygons(list(ps))

之所以如此复杂,是因为多边形是一个简单的环,一个多边形对象可以是多个具有ID(此处设为1)的环(就像GIS中的单个要素一样),而SpatialPolygons可以具有CRS 。哦,我应该设置一下:

> proj4string(sps) = CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")

如果要将其转换为SpatialPolygonsDataFrame(当shapefile是多边形时,这就是readShapeSpatial的功能),请执行以下操作:

> data = data.frame(f=99.9)
> spdf = SpatialPolygonsDataFrame(sps,data)
> spdf

给这个:

> summary(spdf)
Object of class SpatialPolygonsDataFrame
Coordinates:
       min      max
x 16.48438 24.74609
y 55.03418 61.14258
Is projected: FALSE 
proj4string :
[+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0]
Data attributes:
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   99.9    99.9    99.9    99.9    99.9    99.9 

+1非常好,清晰的论述。很高兴看到代码被解释打乱了,而不是作为一个整体提供!
ub

很棒...很高兴看到这些物体是如何组合在一起的!需要查看更多这样清晰地编写的R帮助页面。
Simbamangu 2011年

每当我想做的时候,我都必须重新自学,所以我有机会教别人!
Spacedman 2011年

1
太好了...我将如何向数据框中添加多个唯一的id(f)多边形?
mga 2013年

2
为了使该答案具有更一般的有效性,您能否说明在出现多个多边形的情况下该如何做?这有点棘手。
2014年

2

要在数据包含多个多边形的情况下完成Spacedman的出色回答,请使用dplyr以下代码:

library(dplyr)
library(ggplot2)
library(sp)
## use data from ggplot2:::geom_polygon example:
positions <- data.frame(id = rep(factor(c("1.1", "2.1", "1.2", "2.2", "1.3", "2.3")), each = 4),
                    x = c(2, 1, 1.1, 2.2, 1, 0, 0.3, 1.1, 2.2, 1.1, 1.2, 2.5, 1.1, 0.3,
                          0.5, 1.2, 2.5, 1.2, 1.3, 2.7, 1.2, 0.5, 0.6, 1.3),
                    y = c(-0.5, 0, 1, 0.5, 0, 0.5, 1.5, 1, 0.5, 1, 2.1, 1.7, 1, 1.5,
                          2.2, 2.1, 1.7, 2.1, 3.2, 2.8, 2.1, 2.2, 3.3, 3.2)) %>% as.tbl


df_to_spp <- positions %>%
  group_by(id) %>%
  do(poly=select(., x, y) %>%Polygon()) %>%
  rowwise() %>%
  do(polys=Polygons(list(.$poly),.$id)) %>%
  {SpatialPolygons(.$polys)}

## plot it
plot(df_to_spp)

只是为了好玩,您可以与ggplot2使用初始数据帧获得的图进行比较:

ggplot(positions) + 
  geom_polygon(aes(x=x, y=y, group=id), colour="black", fill=NA)

请注意,上面的代码假定每个id仅包含一个polyogn。如果某些ID具有不相交的多边形,我想应该在数据集中添加另一列,首先group_by是子ID,然后使用group_by(upper-id)代替rowwise

使用该purrr::map功能的相同代码:

df_to_spp <- positions %>%
  nest(-id) %>%
  mutate(Poly=purrr::map(data, ~select(., x, y)  %>% Polygon()),
         polys=map2(Poly, id, ~Polygons(list(.x),.y))) %>%
  {SpatialPolygons(.$polys)}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.