2017-09-14 15 views
1

マップ上のポイントのデータフレームがあり、ポイントのポリゴンとして説明されている対象エリアがあります。理想的にはsfパッケージを使用して、各点とポリゴンとの距離を計算したいと思います。ポイントとポリゴンとの間の距離R

library("tidyverse") 
library("sf") 

# area of interest 
area <- 
    "POLYGON ((121863.900623145 486546.136633659, 121830.369032584 486624.24942906, 121742.202408334 486680.476675484, 121626.493982203 486692.384434804, 121415.359596921 486693.816446951, 121116.219703244 486773.748535465, 120965.69439283 486674.642759986, 121168.798757601 486495.217550029, 121542.879304342 486414.780364836, 121870.487595417 486512.71203006, 121863.900623145 486546.136633659))" 

# convert to sf and project on a projected coord system 
area <- st_as_sfc(area, crs = 7415L) 

# points with long/lat coords 
pnts <- 
    data.frame(
    id = 1:3, 
    long = c(4.85558, 4.89904, 4.91073), 
    lat = c(52.39707, 52.36612, 52.36255) 
    ) 

# convert to sf with the same crs 
pnts_sf <- st_as_sf(pnts, crs = 7415L, coords = c("long", "lat")) 

# check if crs are equal 
all.equal(st_crs(pnts_sf),st_crs(area)) 

私は、以下のアプローチが私に正しい答えを与えない理由が不思議です。

1.Simply st_distance楽しいdoesn't仕事、間違った答えに

st_distance(pnts_sf, area) 

2.Inのmutate呼び出しを使用して -

pnts_sf %>% 
    mutate(
    distance = st_distance(area, by_element = TRUE), 
    distance2 = st_distance(area, by_element = FALSE), 
    distance3 = st_distance(geometry, area, by_element = TRUE) 
) 

しかし、このアプローチが動作しているようです、すべての間違った答えと正しい距離を与える。長い/緯度オーバー

3. mapは - 私は、空間データへの新たなんだと私は私が間違ってここに何が起こっているか思ったんだけどようsfパッケージを学ぶためにしようとしている

pnts_geoms <- 
    map2(
    pnts$long, 
    pnts$lat, 
    ~ st_sfc(st_point(c(.x, .y)) , crs = 4326L) 
) %>% 
    map(st_transform, crs = 7415L) 

map_dbl(pnts_geoms, st_distance, y = area) 

正常に動作します。限り、私が言うことができる限り、最初の2つのアプローチはどうにかして "全体として"ポイントを考慮して終わる(ポイントの1つは、エリアポリゴンの内側にあるので、間違った答えの1つが0です)。第3のアプローチは、私の意図である時点を考慮しています。
どのようにすればmutateコールを受け取ることができますか?

> packageVersion("dplyr") 
[1] ‘0.7.3’ 
> packageVersion("sf") 
[1] ‘0.5.5’ 
+1

必要がありますか?また、再現可能な例のための+1 – Phil

+0

@Phil aghh私はそれを理解しました - それは非常に新人ミスです! 'epsg 4326's crsを使った別のソースを使って' long '/' lat 'ポイントを取得しました。この部分は私の不思議を逃れました。データフレームを作成した後、 'sf'オブジェクトへの変換は' pnts_sf < - st_as_sf(pnts、crs = 4326L、coords = c( "long"、 "lat")) 'でなければなりません。 !)そして 'area 'と同じcrsに変換するもう一つの呼び出しは - ' pnts_sf < - st_transform(crs = 7415L) 'を持ちます。そして、 'st_distance()'コールが正しい結果を返します。物語の道徳的な= *常に*あなたのcrsを追跡してください! – davidski

+1

非常に便利な道徳です。あなたの解決策を答えとして書くように気をつけて、人々は解決したと見ることができますか? – Phil

答えて

1

と私はR 3.4.1によ

だから、全体混乱が私の部分に小さな愚かな監督によって引き起こされたことが判明しました。 (!)

  • pointsデータフレームは、異なるソースから来てareaポリゴンより:ここ内訳です。
  • これを監督し続けると、私はそれらをcrs 7415に設定しようとしていましたが、それは合法ですが間違った動きであり、最終的に間違った答えにつながりました。
  • 適切な方法は、それらを元のcrsのオブジェクトsfに変換し、areaオブジェクトが入っているものに変換してから、距離を計算します。

はすべて一緒にそれを置く:あなたは `ST_DISTANCE()`を呼び出すには `by_element = true`を設定する

# this part was wrong, crs was supposed to be the one they were 
# originally coded in 
pnts_sf <- st_as_sf(pnts, crs = 4326L, coords = c("long", "lat")) 

# then apply the transfromation to another crs 
pnts_sf <- st_transform(crs = 7415L) 

st_distance(pnts_sf, area) 

-------------------------- 
Units: m 
      [,1] 
[1,] 3998.5701 
[2,] 0.0000 
[3,] 751.8097 
関連する問題