2022年7月8日金曜日

オルソ画像(GeoTif)にプロットを打ちたい

午前
・データ解析

午後
・個人ゼミ×2
・卒論手伝い(学生ピックアップ)
・データ解析

1年ほど前から悩み、ここ数日、本格的に取り組み、挫折した問題。

鳥取砂丘のオルソ画像(GeoTif)にプロットを打ちたいのだが、航空写真が砂地部分を含むように撮影しているため、左上の海の部分が欠けている。
このままだとカッコ悪いので、海岸線が水平になるように時計周りに回転させて、海の部分を削除した図を作成したい。

そこで、案1として、GeoTifを回転させることを試みた。

GeoTifを任意の角度回すことはできないのか、私の技術がないのか、分からないが結果的に案1は失敗に終わった。

とりあえず、QGISのプラグイン「Freehand Raster Georeferencer」を使うと、GeoTifを任意に回転させることができる。一応、地理情報も付加して保存ができるので、本日の昼ごろ、これでイケる!と確信を得た。

個人ゼミを経て、早速、プロットを打ってみると、実際の地点からズレることが判明(プロットは基本的に砂地に配置される)。
ここに達するまでに数日かかっていたので、一気に諦めモードになった。

ということで、カッコ悪い気がするが、案2で進めることにした。

案2は、空白のあるGeoTifデータにプロットをうち画像ファイル(.png)として保存したのち、画像ファイルを回転させ、トリミングする、というもの。
library(raster)
library(ggplot2)
library(RStoolbox)

#ラスタデータ(GioTif)の読み込み
r <- stack("TottoriSundDune_scale1-4_rotate0.tif")

#プロットデータの読み込み
data <- read.csv("distribution.csv")

#作図
ggRGB(r, r = 1, g = 2, b = 3) +
  geom_point(data=data, aes(x=lon, y=lat), size=15, pch=21, fill="red")
すると、プロット位置は正しいのだが、空白(黒)があるカッコ悪い図ができる。
そこで、これを時計回りに15度回転させて、砂地を中心に必要なところだけを残すようにトリミングをする。

Rには、画像処理をするパッケージが色々とある(みたい)。今回は、「magick」を使った。
#上記の図をmap.pngとして保存しておく

library(magick)

#画像ファイルの読み込み
map <- image_read('map.png', density=300)

#画像の回転;時計周りに15度回転
rotate <- image_rotate(map, 15)

#画像のトリミング;「1500x800」=「幅x高さ」;「+400」x軸の開始位置;
「+1000」y軸の開始位置;軸の開始位置は「-」も使えるらしい(基準が良く分からない)
photo <- image_crop(rotate, geometry = "1500x800+400+1000")

#描画;普通の画像データとして扱える
plot(photo)
こんな感じで、余計な空白(黒)が無くなった。
画像ファイルをトリミングするという流れは悔しいが、Rのみで完結できたので納得することにした。

参照
magick パッケージの紹介
Rで解析:画像操作の進化「magick」パッケージ