共通の列に基づいて 2 つのデータセットをマージしたいと考えています。データセット A は、領域の RGB 値を表す geoTIFF 画像です。データセット B は、同じ領域の xyz 値を持つ点群です。
画像の RGB 情報を 3D データにマージしたい。2 つのデータセット (同じ座標系にある) の xy 座標を使用することにしました。stackoverflow にあるコード スニペットに触発されたスクリプトを作成しましたが、コード全体を実装する必要があります (ソースは1、2、および3です)。
問題は、2 つのファイルの xy 座標の精度 (10 進数) が異なることです。データセット A は 0 ~ 2 桁です。データセット B には他にもたくさんあります。データセット B の桁数を 2 に丸めました。ここで、データセット A の桁数が 2 未満の場合はゼロを埋めて、最終的なマージがうまくいくようにします。
データセットの行が 280000 行を超えていることを考えると、単純な if ステートメントで問題ないでしょうか? それともインデックスに行くべきですか?とにかく、私は R の使用にかなり慣れていないので、可能性のあるポスターがコード例で役立つことを願っています。以下は私のコードです:
require(raster)
require(rgl)
setwd("C:/my/folder")
# Read tiff file
img <- stack("image.tif")
vals <- extract(img, 1:ncell(img))
coord <- xyFromCell(img, 1:ncell(img))
combine <- cbind(coord, vals)
remove(vals)
remove(coord)
# read POINTCLOUD and assign names
lidar <- read.table("lidardata.txt")
names(lidar) <- c("x","y","z")
decimalplaces <- function(x) {
if ((x %% 1) != 0) {
nchar(strsplit(sub('0+$', '', as.character(x)), ".", fixed=TRUE)[[1]][[2]])
} else {
return(0)
}
}
# HERE I SHOULD PAD THE LIDAR VARIABLE WITH ZEROS IN DECIMAL POSITIONS WHEN THE DIGITS ARE LESS THAN 2!!!
lidar$xy <- do.call(paste0,lidar[,1:2])
combine$x <- round(combine$x, digits = 2)
combine$y <- round(combine$y, digits = 2)
combine$xy <- do.call(paste0,combine[1:2])
finaldata <- merge(combine,lidar,by = 'xy', all = FALSE)
編集1
@Heroka で提案されているように、これはライダー (データセット A) がどのように見えるか、およびゼロでパディングした後にどのようになるかの例でもあります。
LIDAR(オリジナル)
x y z
12 9 87
11 23.4 100
LIDAR (変更され、結合用に「xy」列が追加されています)
x y z xy
12.00 9.00 87 12.009.00
11.00 23.40 100 11.0023.40
編集2
上記の例 ( LIDARcounting <- sapply(lidar$x, decimalplaces)
のオリジナル) では、最初の (x) 列に [0 0] が与えられます。 [0 1] は 2 番目の列 (y) です。上記の LIDAR で変更されたように、数字 (2 ではなく) 0 または 1 の値を持つ xy データセットの各行を見つけ、0 でパディングできるはずです。