見出し画像

【R】2点のポイントデータのうち,重複している点を抽出したい

概要

2つのポイントデータのうち,重なっているポイントを抽出したい場合,いくつか処理が考えられますが,なかなかうまくいかないことが多いです.

やり方としては,座標が一致している点を重複点として捉え,各点の座標座標が一致しているところをduplicated()などで取り出す,というのが考えられますが,浮動小数点等の都合上うまくいかないことが多いです.そこで代替法として,2点間の距離を計測する方法が考えられます.具体的には下記のコードの通り,2点間同士の座標を抽出し,総当たりで各点間の距離を計算し,任意の距離以下(例えば0.1m以下)であれば,2点は同じ点とみなす,のような処理が有効です.

# パッケージの読み込み
library(sf)

# ポイントデータの読み込み
points1 <- st_read("path/to/points1.shp")
points2 <- st_read("path/to/points2.shp")

rowid <- NULL 

# ポイント2の数を抽出    
length <- length(st_coordinates(points2)[,1])

# ポイント1について,ポイント2と一致するポイント以外の場所を抽出
  
  for(i in 1:length){
    

# 各ポイント間のX座標の距離を計算  
a <- abs(st_coordinates(points1)[,1]-  st_coordinates(points2)[i,1])
# 各ポイント間のY座標の距離を計算
b <- abs(st_coordinates(points1)[,2]-  st_coordinates(points2)[i,2])
# 各ポイント間の距離を計算   
dist <- (a^2+b^2)^(1/2)
      
# 点間の距離が0.1m未満のものを抽出 
tmp <- which(dist < 0.1)
rowid <- c(rowid, tmp)
   
 }
    
   
 # ポイント1のうち,ポイント2との距離が0.1m未満のものを除外
 
points <- points1[-sort(rowid), ]  
   

 






この記事が気に入ったらサポートをしてみませんか?