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で読み込んだ結果です。

準備

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&#12501;&#12449;&#12452;&#12523;&#12434;&#36984;&#25246;", filetypes = '{"log&#12501;&#12449;&#12452;&#12523;" {".*"}}',initialfile = "*.*")), sep = "", collapse =" ")
LogData <- read.csv(selectALog, header = FALSE, sep = ",", stringsAsFactors=F) #Log&#12501;&#12449;&#12452;&#12523;&#12398;&#35501;&#12415;&#36796;&#12415;
########

###&#12487;&#12540;&#12479;&#12398;&#21152;&#24037;#####
GPSData <- subset(LogData, LogData[, 1] == "$GPGGA") #$GPGGA&#12398;&#25277;&#20986;
GPSData[is.na(GPSData)] <- 0 #NA&#12434;0&#12391;&#32622;&#25563;

#&#26178;&#38291;&#12398;&#22793;&#25563;,UTC&#12394;&#12398;&#12391;&#26085;&#26412;&#26178;&#38291;&#12395;&#22793;&#25563;
DayData <- subset(as.character(LogData[, 10]), LogData[, 1] == "$GPRMC") #$GPRMC&#12363;&#12425;&#26085;&#20184;&#12369;&#25277;&#20986;
DayData <- formatC(type.convert(DayData), width = 6, flag = "0", format = "fg") #&#26689;&#25968;&#12434;&#25539;&#12360;&#12427;
DayData <- paste("20", substr(DayData, 5, 6), substr(DayData, 3, 4), substr(DayData, 1, 2), sep = "") #&#26085;&#20184;&#12369;&#20316;&#25104;
TimeData <- as.character(formatC(floor(GPSData[, 2]), width = 6, flag = "0", format = "fg")) #&#26178;&#38291;&#12398;&#20316;&#25104;
GPSData[, ncol(GPSData) + 1 ] <- as.character(as.POSIXlt(as.POSIXct(paste(DayData, TimeData, sep = ""),
                                                                    format = "%Y%m%d%H%M%S", "GMT"), "Asia/Tokyo")) #&#26085;&#26412;&#26178;&#38291;&#12395;&#22793;&#25563;

#&#12464;&#12540;&#12464;&#12523;&#12391;&#20351;&#29992;&#12373;&#12428;&#12390;&#12356;&#12427;&#32239;&#24230;&#25968;&#12434;GPSData&#12395;&#36861;&#21152;&#12290;&#21335;&#32239;&#12399;&#12510;&#12452;&#12490;&#12473;&#12434;&#38957;&#12395;&#20184;&#12369;&#36275;&#12377;
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)

#&#12464;&#12540;&#12464;&#12523;&#12391;&#20351;&#29992;&#12373;&#12428;&#12390;&#12356;&#12427;&#32076;&#24230;&#25968;&#12434;GPSData&#12395;&#36861;&#21152;&#12290;&#35199;&#32076;&#12399;&#12510;&#12452;&#12490;&#12473;&#12434;&#38957;&#12395;&#20184;&#12369;&#36275;&#12377;
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&#12434;0.0&#12391;&#32622;&#25563;
CoordData <- paste(GPSData[, 18], ",", GPSData[, 17], ",", GPSData[,12], sep = "", collapse = "\n") #&#12487;&#12540;&#12479;&#12398;&#20316;&#25104;
#####

###&#12501;&#12449;&#12452;&#12523;&#21517;&#12398;&#21462;&#24471;&#12392;&#21021;&#26399;Dir&#12398;&#35373;&#23450;#####
FarstDir <- as.data.frame(strsplit(selectALog, "/")) #&#21021;&#26399;dirpath&#12398;&#21462;&#24471;&#28310;&#20633;
FileName <- chartr("LOG", "kml", FarstDir[nrow(FarstDir),]) #&#12501;&#12449;&#12452;&#12523;&#21517;&#12398;&#21462;&#24471;
FarstDir <- paste(FarstDir[1:(nrow(FarstDir)-1),], sep = " ", collapse = "/" ) #&#21021;&#26399;dirpath&#12398;&#21462;&#24471;
setwd(FarstDir) #&#21021;&#26399;dir&#35373;&#23450;
########

#&#12513;&#12452;&#12531;&#12494;&#12540;&#12489;&#12434;&#20316;&#25104;
MainKml <- newXMLNode("kml", newXMLNode("Document", addFinalizer = FALSE),
                      namespaceDefinitions = "http://www.opengis.net/kml/2.2")

#&#22320;&#22259;&#12398;&#21517;&#21069;&#12434;&#35373;&#23450;
newXMLNode("name", "FileName", parent = MainKml[["Document"]])

#&#32218;&#12398;&#33394;&#12392;&#22826;&#12373;&#12434;&#35373;&#23450;
newXMLNode("Style",
           newXMLNode("LineStyle", newXMLNode("color", "ff3644DB"),
                      newXMLNode("width", 3)), attrs = c("id" = "myLineStyle"), parent = MainKml[["Document"]])

#GPS&#12487;&#12540;&#12479;&#12398;&#35373;&#23450;
newXMLNode("Placemark",newXMLNode("styleUrl", "#myLineStyle"),
           newXMLNode("LineString",
                      newXMLNode("coordinates", CoordData)), parent = MainKml[["Document"]])

#&#12501;&#12449;&#12452;&#12523;&#12398;&#20986;&#21147;
saveXML(newXMLDoc(node = MainKml), file = FileName)

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

Prices and shipping availability may change. Please refer to the product page at time of purchase.
Content displayed on this site is provided by Amazon and may be updated or removed.
Amazon Associate, karada-good earns income through qualifying sales.
タイトルとURLをコピーしました