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 ( "다각형 개체")를 "인스턴스화"하는 방법은 무엇입니까? (이러한 데이터로 shapefile을 작성하고 새로 작성된 shapefile에서 읽는 원형 교차로없이)

답변:


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

그런 다음 다각형을 만들어 다각형 개체로 래핑 한 다음 SpatialPolygons 개체로 래핑합니다.

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

이 수준의 복잡성에 대한 이유는 다각형이 단순한 고리이고 다각형 개체는 ID (여기서는 1로 설정 됨)를 갖는 여러 개의 고리 일 수 있으며 (GIS의 단일 기능과 유사) SpatialPolygon은 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 아주 좋고 명확한 박람회. 모 놀리 식 블록으로 제공되는 것이 아니라 설명으로 코드가 깨진 것을 보는 것이 좋습니다!
whuber

훌륭합니다 ...이 물체가 어떻게 구성되어 있는지 보는 것이 좋습니다! 이와 같이 명확하게 작성된 R 도움말 페이지를 더 볼 필요가 있습니다.
Simbamangu

그것을하고 싶을 때마다 스스로를 다시 가르쳐야하므로 다른 사람들을 가르 칠 기회가 있습니다!
Spacedman

1
훌륭합니다 ... 데이터 프레임에 여러 개의 고유 ID (f) 다각형을 추가하는 방법은 무엇입니까?
mga

2
이 답변이 더 일반적인 타당성을 갖기 위해 여러 다각형의 경우 어떻게 수행 할 수 있습니까? 조금 까다 롭습니다.
Tomas

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)}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.