2017-05-05 25 views
15

は、ここで私は最後の行は私が行うことができますどのように私はSFパッケージ使用st_join()

Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : 
    cannot coerce class "c("sfc_MULTIPOINT", "sfc")" to a data.frame 

を生成

# Make points 
point1 <- c(.5, .5) 
point2 <- c(.6, .6) 
point3 <- c(3, 3) 
mpt <- st_multipoint(rbind(point1, point2, point3)) # create multipoint 

# Make polygons 
square1 <- rbind(c(0, 0), c(1, 0), c(1,1), c(0, 1), c(0, 0)) 
square2 <- rbind(c(0, 0), c(2, 0), c(2,2), c(0, 2), c(0, 0)) 
square3 <- rbind(c(0, 0), c(-1, 0), c(-1,-1), c(0, -1), c(0, 0)) 
mpol <- st_multipolygon(list(list(square1), list(square2), list(square2))) # create multipolygon 

# Convert to class' sf' 
pts <- st_sf(st_sfc(mpt)) 
polys <- st_sf(st_sfc(mpol)) 

# Determine which points fall inside which polygons 
st_join(pts, polys, join = st_contains) 

と格闘してきたおもちゃの例だと空間結合を行うことができますどのようにどの点がどのポリゴンに入るかを決定する空間結合?

+0

あなたは「参加空間的」によって何を意味するのか明確にもらえますか?期待される結果は何でしょうか? – lbusett

+0

ポリゴンのセットとポイントのセットが与えられたら、どのポイントがどのポリゴンに含まれているかを示すマッピング(PointId、PolygonId)を作成します。 – Ben

+0

私は最近[sfパッケージ](https://github.com/r-spatial/sf)用に[このチュートリアル](https://gormanalysis.com/spatial-data-analysis-in-r/)を書きました。自分自身と他の人が基本概念を理解するのを助けます。私がここにあったような特定の問題を解決するためには、基本を理解することが重要です。 – Ben

答えて

10

sfパッケージの機能を回避する作業もしていますので、が正しくない場合はご迷惑をおかけください。か、より良い方法があります。私はここで一つの問題は、あなたの例のように幾何学的構造を構築する場合は、あなたが何を考えて取得されていないということだと思う:あなたはptsにしてpolysの両方で唯一の「機能」を持っていることがわかります

> pts 
Simple feature collection with 1 feature and 0 fields 
geometry type: MULTIPOINT 
dimension:  XY 
bbox:   xmin: 0.5 ymin: 0.5 xmax: 3 ymax: 3 
epsg (SRID): NA 
proj4string: NA 
        st_sfc.mpt. 
1 MULTIPOINT(0.5 0.5, 0.6 0.6... 

> polys 
Simple feature collection with 1 feature and 0 fields 
geometry type: MULTIPOLYGON 
dimension:  XY 
bbox:   xmin: 0 ymin: 0 xmax: 2 ymax: 2 
epsg (SRID): NA 
proj4string: NA 
        st_sfc.mpol. 
1 MULTIPOLYGON(((0 0, 1 0, 1 ... 

。これは、3つの異なるポリゴンではなく、1つの「マルチポリゴン」フィーチャー(つまり、3つの部分で構成されるポリゴン)を構築することを意味します。ポイントについても同じことが言えます。

ビットを掘り後、私はWKT表記を使用して、ジオメトリを構築するために、この異なる(と簡単に私の意見では)方法を見つけた:

polys <- st_as_sfc(c("POLYGON((0 0 , 0 1 , 1 1 , 1 0, 0 0))", 
        "POLYGON((0 0 , 0 2 , 2 2 , 2 0, 0 0))", 
        "POLYGON((0 0 , 0 -1 , -1 -1 , -1 0, 0 0))")) %>% 
    st_sf(ID = paste0("poly", 1:3))  

pts <- st_as_sfc(c("POINT(0.5 0.5)", 
        "POINT(0.6 0.6)", 
        "POINT(3 3)")) %>% 
    st_sf(ID = paste0("point", 1:3)) 

> polys 
Simple feature collection with 3 features and 1 field 
geometry type: POLYGON 
dimension:  XY 
bbox:   xmin: -1 ymin: -1 xmax: 2 ymax: 2 
epsg (SRID): NA 
proj4string: NA 
    ID        . 
1 poly1 POLYGON((0 0, 0 1, 1 1, 1 0... 
2 poly2 POLYGON((0 0, 0 2, 2 2, 2 0... 
3 poly3 POLYGON((0 0, 0 -1, -1 -1, ... 

> pts 
Simple feature collection with 3 features and 1 field 
geometry type: POINT 
dimension:  XY 
bbox:   xmin: 0.5 ymin: 0.5 xmax: 3 ymax: 3 
epsg (SRID): NA 
proj4string: NA 
     ID    . 
1 point1 POINT(0.5 0.5) 
2 point2 POINT(0.6 0.6) 
3 point3  POINT(3 3) 

あなたが今両方polysptsは3つの特徴を持っていることがわかります。

現在使用して「交差点マトリックス」を見つけることができます:

# Determine which points fall inside which polygons 
pi <- st_contains(polys,pts, sparse = F) %>% 
    as.data.frame() %>% 
    mutate(polys = polys$ID) %>% 
    select(dim(pi)[2],1:dim(pi)[1]) 
colnames(pi)[2:dim(pi)[2]] = levels(pts$ID) 

> pi 
    polys point1 point2 point3 
1 poly1 TRUE TRUE FALSE 
2 poly2 TRUE TRUE FALSE 
3 poly3 FALSE FALSE FALSE 

意味を(コメントで@symbolixauを指摘したように)、ポリゴン1と2は、ポイント1と2が含まれていることを、ポリゴン3はそうではありません任意の点を含む。代わりにポイント3はポリゴンに含まれていません。

HTH。

+1

非常に興味深い。うまくいけば、これにチャイムを持つ他の人たち。私は 'sf'文書に' st_join'の良い例があり、シンプルな機能を最初から構築したいと思っています。 – Ben

+0

私はあまりにも面倒なリストのリストとして機能を "構築"しています。しかし、最初から「ジオメトリ」を作成する必要はほとんどなく、 'sp'に関するスピードの向上は本当に素晴らしいです。 – lbusett

+3

I ** think **結果はポイント1と2がポリゴン1と2の両方にあり(重複している)、ポイント3はポリゴンにはなく、ポリゴン3にはポイントが含まれていないと言っています。 (結果を解釈するために 'sf'以外の別のアプローチを使って同じ質問を試みました) – SymbolixAU

1

私は別の出力を参照してください。

> # Determine which points fall inside which polygons 
> st_join(pts, polys, join = st_contains) 
Simple feature collection with 1 feature and 0 fields 
geometry type: MULTIPOINT 
dimension:  XY 
bbox:   xmin: 0.5 ymin: 0.5 xmax: 3 ymax: 3 
epsg (SRID): NA 
proj4string: NA 
         geometry 
1 MULTIPOINT(0.5 0.5, 0.6 0.6... 

sfの最新CRANのバージョンでこのでしたか?

+0

返信と素晴らしいパッケージをお寄せいただきありがとうございます。私はこの質問を書いた時点で、それはCRANの最新バージョンでした。今、私は0.4から3になっていますが、私はまだ同じ場所でエラーを受け取ります(別のメッセージですが)。この単純な機能はジオメトリを持つことができないだけでなく、データも持っている必要があるため、この呼び出しは 'pts Ben

+1

ありがとうございます。これはしばらく前の開発版で修正されています。 –

0

は注意、マルチポイントおよびマルチポリゴンの元のセットは、新しいオブジェクトを作成せずに、ポイントやポリゴンに「キャスト」することができます。

st_contains(polys %>% st_cast("POLYGON"), pts %>% st_cast("POINT"), sparse = F) 
#  [,1] [,2] [,3] 
#[1,] TRUE TRUE FALSE 
#[2,] TRUE TRUE FALSE 
#[3,] FALSE FALSE FALSE 
関連する問題