Rを使用して空間ポイントデータを複数のポリゴンデータと結合する


8

SpatialPolygonsDataFrameとSpatialPointsDataFrameを空間結合したいのですが。

コードの下で、複数のポリゴン内の1つのポイントデータのみを取得します。

sp::over(meuse, srdf)

一部のデータは複数のポリゴンにポイントされます。ポイントデータを取得したいのですが、すべてのポリゴンデータを保持します。

例: ポリゴンaとb内のポイントA。

今得ることができます:

| point | polygon |
-------------------
| A     | a       |

私はこのようになります:

| point | polygon |
-------------------
| A     | a       |
| A     | b       |

データを使用:

    coordinates(meuse) = ~x+y
    sr1=Polygons(list(Polygon(cbind(c(180114, 180553, 181127, 181477, 181294, 181007, 180409,
                                      180162, 180114), c(332349, 332057, 332342, 333250, 333558, 333676,
                                                         332618, 332413, 332349)))),'1')
    sr2=Polygons(list(Polygon(cbind(c(180042, 180545, 180553, 180314, 179955, 179142, 179437,
                                      179524, 179979, 180042), c(332373, 332026, 331426, 330889, 330683,
                                                                 331133, 331623, 332152, 332357, 332373)))),'2')
    sr3=Polygons(list(Polygon(cbind(c(179110, 179907, 180433, 180712, 180752, 180329, 179875,
                                      179668, 179572, 179269, 178879, 178600, 178544, 179046, 179110),
                                    c(331086, 330620, 330494, 330265, 330075, 330233, 330336, 330004,
                                      329783, 329665, 329720, 329933, 330478, 331062, 331086)))),'3')
    sr4=Polygons(list(Polygon(cbind(c(180304, 180403,179632,179420,180304),
                                    c(332791, 333204, 333635, 333058, 332791)))),'4')
    sr5=Polygons(list(Polygon(cbind(c(179500, 180000, 180000, 179500),
                                    c(331000, 331000, 331500, 331500)))), '5')
    sr=SpatialPolygons(list(sr1,sr2,sr3,sr4, sr5))
    srdf=SpatialPolygonsDataFrame(sr, data.frame(row.names=c('1','2','3','4', '5'), PIDS=1:5, y=runif(5)))

回答:


5

パッケージst_join内の関数sf開発バージョン)は、シンプルで直感的なソリューションを提供します。空間結合をとして返し、data.frame簡単にに戻すことができますSpatial*

# Convert to sf-objects
srdf.sf <- st_as_sf(srdf)
meuse.sf <- st_as_sf(meuse)

# Keep all "meuse.sf", sort by row.names(meuse.sf). Default overlay is "intersects".
meuse_srdf <- st_join(meuse.sf, srdf.sf) 

# Keeps all "srdf.sf", sort by row.names(srdf.sf)
srdf_meuse <- st_join(srdf.sf, meuse.sf)

# Convert back to Spatial*
meuse_srdf <- as(meuse_srdf, "Spatial")
srdf_meuse <- as(srdf_meuse, "Spatial")

編集:

st_join以前にSymbolixAUが指摘したように、は現在、のCRANバージョンですsf


1
st_joinがリリースされたCRANバージョンになりました
SymbolixAU、2018

4

使用する over(meuse, srdf, returnList=TRUE)

 if ‘returnList’ is TRUE, a list of length
 ‘length(x), with list element ‘i’ the vector of all indices of
 the geometries in ‘y’ that correspond to the $i$-th geometry in
 ‘x’.

最初のポイントは1つのポリゴンをオーバーレイし、135番目のポイントは2つのポリゴンをオーバーレイします。

> rr = over(meuse,srdf,returnList=TRUE)
> rr[[1]]
  PIDS         y
1    1 0.2069365
> rr[[135]]
  PIDS          y
2    2 0.34809708
5    5 0.08942346

すべての属性ではなく、オーバーレイされたポリゴンインデックスのみが必要な場合は、ポリゴンをSpatialPolygonに変換するだけで、すべての属性を持つデータフレームではなく、インデックス番号のリストが返されます。

> rr = over(meuse,as(srdf,"SpatialPolygons"),returnList=TRUE)
> rr[[1]]
[1] 1
> rr[[135]]
[1] 2 5

0

コードの下でdata.frameを取得できます:

library(tidyverse)
sp::over(meuse, srdf, returnList=TRUE) %>%
plyr::ldply(., data.frame) -> tmp

自動で追加される.id列です。
フィルターまたは編集されたmeuseデータを取得する場合は、コードの下で行います。

use_id <- 
  tmp %>% select(`.id`) %>% unlist(., use.names = F)
rownames(meuse) %in% use_id
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.