RでGPSログ編集:STYLUS TG-3 Toughのログをkml形式で出力する。


STYLUS TG-3 ToughにはOLYMPUS Viewer 3というソフトが添付されていますが、ログの編集ができずGpsPruneというソフトで編集していました。しかし、GpsPruneでTG-3のログを取り込もうとするとGoogleMapに取り込んだり工夫が必要です。

そこで、Rでログを読み込みkml形式で出力するコマンドを作成しました。出力されるkmlファイルはGoogleMapやGpsPruneで使用できます。

なお、STYLUS TG-3 ToughのログはNMEA形式ですので、NMEA形式で記録されているログであればコマンド内のコメントを参考に、データを指定するとkml形式で出力できると思います。画像は出力したkmlをgoogle mapで読み込んだ結果です。

GoogleMap

準備

Rの使い方は下記記事を参考にしてください。
・研究者も、社会人も、おねえさんも。とりあえず、みんなで使ってみませんか?
 https://www.karada-good.net/analyticsr/r-90/

・GpsPruneは下記URLにアクセスし、Runnable codeからダウンロードしてください。
 http://activityworkshop.net/software/gpsprune/download.html

下記コマンドを実行してXMLパッケージを導入してください。

install.packages("XML")

コマンド

コマンドを実行することで、ログファイルがあるフォルダに[ログファイル名.kml]が出力されます。

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

###データの読み込み#####
selectALog <- paste(as.character(tkgetOpenFile(title = "Logファイルを選択", filetypes = '{"logファイル" {".*"}}',initialfile = "*.*")), sep = "", collapse =" ")
LogData <- read.csv(selectALog, header = FALSE, sep = ",", stringsAsFactors=F) #Logファイルの読み込み
########

###データの加工#####
GPSData <- subset(LogData, LogData[, 1] == "$GPGGA") #$GPGGAの抽出
GPSData[is.na(GPSData)] <- 0 #NAを0で置換

#時間の変換,UTCなので日本時間に変換
DayData <- subset(as.character(LogData[, 10]), LogData[, 1] == "$GPRMC") #$GPRMCから日付け抽出
DayData <- formatC(type.convert(DayData), width = 6, flag = "0", format = "fg") #桁数を揃える
DayData <- paste("20", substr(DayData, 5, 6), substr(DayData, 3, 4), substr(DayData, 1, 2), sep = "") #日付け作成
TimeData <- as.character(formatC(floor(GPSData[, 2]), width = 6, flag = "0", format = "fg")) #時間の作成
GPSData[, ncol(GPSData) + 1 ] <- as.character(as.POSIXlt(as.POSIXct(paste(DayData, TimeData, sep = ""),
                                                       format = "%Y%m%d%H%M%S", "GMT"), "Asia/Tokyo")) #日本時間に変換

#グーグルで使用されている緯度数をGPSDataに追加。南緯はマイナスを頭に付け足す
NewLatit <- as.double(substr(GPSData[, 3], 1, 2)) +
            as.double(substr(GPSData[, 3], 3, 4)) / 60 +
            as.double(substr(GPSData[, 3], 5, 9)) / 60
GPSData[, ncol(GPSData) + 1 ] <- ifelse(GPSData[, 4] == "S",
                                       paste("-", NewLatit, sep = ""), NewLatit)

#グーグルで使用されている経度数をGPSDataに追加。西経はマイナスを頭に付け足す
NewLong <- as.double(substr(GPSData[, 5], 1, 3)) +
           as.double(substr(GPSData[, 5], 4, 5)) / 60 +
           as.double(substr(GPSData[, 5], 6, 10)) / 60
GPSData[, ncol(GPSData) + 1 ] <- ifelse(GPSData[, 6] == "W",
                                        paste("-", NewLatit, sep = ""), NewLong)

GPSData[,12] <- ifelse(GPSData[, 12] == "", formatC(0, dig = 1, format = "f"), as.vector(GPSData[, 12])) #NAを0.0で置換
CoordData <- paste(GPSData[, 18], ",", GPSData[, 17], ",", GPSData[,12], sep = "", collapse = "\n") #データの作成
#####

###ファイル名の取得と初期Dirの設定#####
FarstDir <- as.data.frame(strsplit(selectALog, "/")) #初期dirpathの取得準備
FileName <- chartr("LOG", "kml", FarstDir[nrow(FarstDir),]) #ファイル名の取得
FarstDir <- paste(FarstDir[1:(nrow(FarstDir)-1),], sep = " ", collapse = "/" ) #初期dirpathの取得
setwd(FarstDir) #初期dir設定
########

#メインノードを作成
MainKml <- newXMLNode("kml", newXMLNode("Document", addFinalizer = FALSE),
                      namespaceDefinitions = "http://www.opengis.net/kml/2.2")

#地図の名前を設定
newXMLNode("name", "FileName", parent = MainKml[["Document"]])

#線の色と太さを設定
newXMLNode("Style",
           newXMLNode("LineStyle", newXMLNode("color", "ff3644DB"),
           newXMLNode("width", 3)), attrs = c("id" = "myLineStyle"), parent = MainKml[["Document"]])

#GPSデータの設定
newXMLNode("Placemark",newXMLNode("styleUrl", "#myLineStyle"),
           newXMLNode("LineString",
           newXMLNode("coordinates", CoordData)), parent = MainKml[["Document"]])

#ファイルの出力
saveXML(newXMLDoc(node = MainKml), file = FileName)

少しでも、ウェブや実験の解析が楽になりますように!!

スポンサードリンク

おすすめコンテンツ


スポンサードリンク