Rでシェープファイルを使用せずに空間ポリゴンをインスタンス化する


22

したがって、Rでシェープファイルを読み取る通常の方法は、次のように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(「ポリゴンオブジェクト」)を直接「インスタンス化」するにはどうすればよいですか?(これらのデータを使用してシェープファイルを作成し、新しく作成されたシェープファイルから読み取るというラウンドアバウト方法を使用することなく)

回答:


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))

このレベルの複雑さの理由は、Polygonは単純なリングであり、PolygonsオブジェクトはID(ここでは1に設定)を持つ複数のリングにすることができ(GISの単一のフィーチャのように)、SpatialPolygonsはCRSを持つことができるためです。ああ、私はおそらくそれを設定する必要があります:

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

SpatialPolygonsDataFrameに変換する場合(これは、シェープファイルがポリゴンである場合に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ヘルプページをもっと見る必要があります。
シンバマング

私はそれをやりたいと思うたびに自分自身を再教育しなければならないので、他の人に教える機会があれば!
Spacedman

1
すばらしい...データフレームに複数の一意のid(f)ポリゴンを追加するにはどうすればよいですか?
mga

2
この回答がより一般的な妥当性を持つために、複数のポリゴンの場合にそれを行う方法を示していただけますか?これは少し注意が必要です。
トマス14年

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が1つしかないことを前提としていることに注意してください。一部の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.