【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), ]
この記事が気に入ったらサポートをしてみませんか?