R에서 GPS NMEA 형식의 데이터로 놀이 (1)
절차
geo_position_from_nmealog
사용. 마지막에 개행이 없으면 화나거나 한다. 잘 대응한다. 하는 일은 $ GPGGA를 필터링하고 lat과 lng을 잘 변환하고 반환합니다.> rt = geo_position_from_nmealog("C:/gps/gps1234.log")
3. 가볍게 plot 해 본다
* 실행 예 1 :
> plot(rt$Latitude, rt$Longitude)
*실행예 2: > plot(rt$Longitude-rt$Longitude[1], rt$Latitude-rt$Latitude[1])
//최초의 위치로부터의 상대 좌표4.
library(rgl)
라는 패키지로 plot3d 해보자. (마우스로 이동할 수 있음)* 실행 예 3 :
> plot3d(rt$Longitude-rt$Longitude[1], rt$Latitude-rt$Latitude[1], rt$Altitude)
geo_position_from_nmealog
geo_position_from_nmealog <- function(log_filename, is0000 = TRUE) {
# ファイルを読む
lines = readLines(log_filename)
# フィルタ: $GPGGAのラインを取得
rexp_str = ifelse(is0000 == TRUE, "^\\$GPGGA,.*0000\\*[0-9A-F][0-9A-F]$", "^\\$GPGGA,.*\\*[0-9A-F][0-9A-F]$")
lines_GPGGA = lines[grep(rexp_str, lines)]
# tableへ
tbl_GPGGA = read.table( text =lines_GPGGA, sep=",", header=FALSE)
# カラムに名前をつける
colnames(tbl_GPGGA) <- (c("SentenceId","TimeUTC", "Latitude", "LatitudeHemisphere", "Longitude", "LongitudeHemisphere", "PositionFixQuality", "NumOfSatelites", "HDOP", "Altitude", "AltitudeUnit", "GeoidalHeight","GeoidalHeightUnit", "TimeSeinceLastDGPSUpdate", "_CheckSum"))
# フィルタ: 取得できたデータのみ
tbl_GPGGA =tbl_GPGGA [!(tbl_GPGGA $PositionFixQuality == 0), ]
# 緯度Latitudeと経度Longitudeを変換
rt <- data.frame(
Latitude = ifelse(tbl_GPGGA$LatitudeHemisphere == "N", 1, -1) * (as.integer(tbl_GPGGA$Latitude /100) + (tbl_GPGGA$Latitude /100 - as.integer(tbl_GPGGA$Latitude /100)) * 100/60),
Longitude = ifelse(tbl_GPGGA$LongitudeHemisphere == "E", 1, -1) * (as.integer(tbl_GPGGA$Longitude/100) + (tbl_GPGGA$Longitude/100 - as.integer(tbl_GPGGA$Longitude/100)) * 100/60),
Altitude = tbl_GPGGA$Altitude
)
return(rt)
}
Google 지도에 투영 ( RgoogleMaps 사용)
test.R
install.packages("RgoogleMaps") # 入れてなければインストール
library(RgoogleMaps)
setwd("C:/gps/") #作業フォルダ指定
rt = geo_position_from_nmealog("gps1234.log")
lat <- as.vector(rt[,1])
lon <- as.vector(rt[,2])
# センター位置。 maxとminの間
center = c ((max(lat)+min(lat))/2, (max(lon)+min(lon))/2)
# zoom値計算: サンプルコードから... 自分で、zoom <- 13とかでも、おk
zoom <- min(MaxZoom(range(lat), range(lon)))
# グーぐる先生から地図画像を頂戴する。 日本語でおk
MyMap <- GetMap(center=center, zoom=zoom, size=c(640, 640), destfile = "./dest.png")
#色指定。
col <- rep(3, length(lat))
# プロット
tmp <- PlotOnStaticMap(
MyMap,
lat = lat,
lon = lon,
destfile = "./dest.png",
cex=1.0,
pch=20,
col=col,
add=FALSE,
NEWMAP = FALSE
);
# PNG 保存
dev.print(bmp, width = 640,height=640, file = "./output.png")
예
여기 을 무단으로 빌렸습니다.
> rt = geo_position_from_nmealog("http://www.oiccam.com/reno/gps/tahoe/nmea/2005-09-25-north-tahoe_nmea.txt", is0000=FALSE)
Reference
이 문제에 관하여(R에서 GPS NMEA 형식의 데이터로 놀이 (1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mt08/items/22882a9c5d68e31d8168텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)