ragps/gps_preanalyse.r

293 lines
11 KiB
R
Executable File

#!/usr/bin/r
library(foreach)
#library(RSQLite)
library(doParallel)
library(parallel)
library(RMySQL)
library(int64)
source("lib_gps.r")
cores<-max(c(1,detectCores()-1),na.rm=TRUE)
if(is.infinite(cores))cores<-1
registerDoParallel(cores)
cl<-makeCluster(cores)
con = dbConnect(MySQL(), user='gps', password='gps', dbname='gps', host='localhost')
dbSendStatement(con,"update gpsin set raw=1;")
rmcin<-dbGetQuery(con,"select uid,cast(id as char) as id,cast(epoch as char) as epoch,telegram,payload from gpsin where telegram like '%RMC' and raw=1;")
if(nrow(rmcin)>0){
rmcin$id<-as.int64(rmcin$id)
rmcin$epoch<-as.int64(rmcin$epoch)
sid<-strsplit(rmcin$payload,",")
maxcol<-max(sapply(sid,length))
clusterExport(cl,c("maxcol"))
inrmc<-as.data.frame(matrix(unlist(lapply(sid,function(i){out<-i;if(length(i)<maxcol){out<-c(i,rep(NA,maxcol-length(i)));};return(out)})),ncol=maxcol,nrow=length(sid),byrow=TRUE),stringsAsFactors=FALSE)
inrmc$id<-rmcin$id
inrmc$uid<-rmcin$uid
inrmc$epoch<-rmcin$epoch
inrmc$telegram<-rmcin$telegram
inrmc<-inrmc[!is.na(inrmc[,9])&!is.na(inrmc[,1]),]
clusterExport(cl,c("inrmc"))
rmcdf<-data.frame(uid=inrmc$uid,epoch=inrmc$epoch,id=inrmc$id,
breite=txt2bl(inrmc[,3]),laenge=txt2bl(inrmc[,5]),velocity=round(as.numeric(inrmc[,7])*1000),
fix=as.numeric(inrmc[,1]),system=substr(inrmc$telegram,2,2),
fix_epoch=parSapply(cl,1:nrow(inrmc),function(i){
rmct<-inrmc[i,1]
if(nchar(rmct)<6)rmct<-paste0(paste0(rep(0,6-nchar(rmct)),collapse=""),rmct)
rmcd<-inrmc[i,9]
if(nchar(rmcd)<6)rmcd<-paste0(paste0(rep(0,6-nchar(rmcd)),collapse=""),rmcd)
return(as.numeric(strptime(paste(rmcd,rmct,sep=""),format="%d%m%y%H%M%S",tz="GMT")))
})
,stringsAsFactors=FALSE)
rmcdf<-rmcdf[(rmcdf$breite<=5400000000)&(rmcdf$laenge<=10800000000),]
dbCatchWriteTable(con,"gpsrmc",rmcdf,nfr=1000)
rm(rmcdf,inrmc,rmcin)
gc()
}
rmcin<-dbGetQuery(con,"select uid,cast(id as char) as id,cast(epoch as char) as epoch,telegram,payload from gpsin where telegram like '%GGA' and raw=1;")
if(nrow(rmcin)>0){
rmcin$id<-as.int64(rmcin$id)
rmcin$epoch<-as.int64(rmcin$epoch)
sid<-strsplit(rmcin$payload,",")
maxcol<-max(sapply(sid,length))
clusterExport(cl,c("maxcol"))
inrmc<-as.data.frame(matrix(unlist(lapply(sid,function(i){out<-i;if(length(i)<maxcol){out<-c(i,rep(NA,maxcol-length(i)));};return(out)})),ncol=maxcol,nrow=length(sid),byrow=TRUE),stringsAsFactors=FALSE)
inrmc$id<-rmcin$id
inrmc$uid<-rmcin$uid
inrmc$epoch<-rmcin$epoch
inrmc$telegram<-rmcin$telegram
inrmc<-inrmc[(inrmc[,10]=="M")&(inrmc[,3]%in%c("N","S"))&(inrmc[,5]%in%c("E","W"))&!is.na(inrmc[,1])&!is.na(inrmc[,6]),]
if(nrow(inrmc)>0){
clusterExport(cl,c("inrmc"))
ggadf<-data.frame(uid=inrmc$uid,epoch=inrmc$epoch,id=inrmc$id,
fix=as.numeric(inrmc[,1]),breite=txt2bl(inrmc[,2]),laenge=txt2bl(inrmc[,4]),
sats=as.numeric(inrmc[,7]),hdop=as.numeric(inrmc[,8]),hoehe=as.numeric(inrmc[,9])*1000,
hoehe_datum=as.numeric(inrmc[,11])*1000,
fix_epoch=parSapply(cl,1:nrow(inrmc),function(i){
rmct<-inrmc[i,1]
if(nchar(rmct)<6)rmct<-paste0(paste0(rep(0,6-nchar(rmct)),collapse=""),rmct)
rmcd<-format(strptime(inrmc[i,"epoch"],format="%s"),"%d%m%y")
if(nchar(rmcd)<6)rmcd<-c(rep(0,6-nchar(rmcd)),rmcd)
fixdat<-NA
try(fixdat<-strptime(paste(rmcd,rmct,sep=""),format="%d%m%y%H%M%S",tz="GMT"))
return(as.numeric(fixdat))
})
,stringsAsFactors=FALSE)
ggadf<-ggadf[(ggadf$breite<=5400000000)&(ggadf$laenge<=10800000000),]
dbCatchWriteTable(con,"gpsgga",ggadf,nfr=1000)
rm(inrmc,ggadf,rmcin)
gc()
}
}
rmcin<-dbGetQuery(con,"select uid,cast(id as char) as id,cast(epoch as char) as epoch,telegram,payload from gpsin where telegram like '%GSV' and raw=1;")
if(nrow(rmcin)>0){
# rmcin$id<-as.int64(rmcin$id)
# rmcin$epoch<-as.int64(rmcin$epoch)
sid<-strsplit(rmcin$payload,",")
maxcol<-max(sapply(sid,length))
clusterExport(cl,c("maxcol"))
inrmc<-as.data.frame(matrix(unlist(lapply(sid,function(i){out<-i;if(length(i)<maxcol){out<-c(i,rep(NA,maxcol-length(i)));};return(out)})),ncol=maxcol,nrow=length(sid),byrow=TRUE),stringsAsFactors=FALSE)
inrmc$id<-rmcin$id
inrmc$uid<-rmcin$uid
inrmc$epoch<-rmcin$epoch
inrmc$telegram<-rmcin$telegram
col_tel<-0
for(i in col_tel+1:3)inrmc[,i]<-as.numeric(inrmc[,i])
inrmc<-inrmc[!is.na(inrmc[,col_tel+1])&!is.na(inrmc[,col_tel+2])&!is.na(inrmc[,col_tel+3]),]
inrmc<-inrmc[(inrmc[,col_tel+1]<=6)&(inrmc[,col_tel+2]<=6)&(inrmc[,col_tel+3]>0),]
inrmc<-inrmc[rowSums(!is.na(inrmc[,col_tel+4:16]))>0,]
if(nrow(inrmc)>0){
inrmc$system<-substr(inrmc$telegram,2,2)
gsvdf<-foreach(i=0:3,.combine=rbind,.inorder=FALSE,.multicombine=TRUE)%dopar%{
out<-inrmc[,i*4+0:3+4]
names(out)<-c("prn","elevation","azimuth","snr")
out<-cbind(out,inrmc[,c("uid","id","epoch","telegram","system")])
out$folge<-i+1
out$row<-inrmc[,2]-1
return(out)
}
gsvdf<-gsvdf[!is.na(gsvdf$prn),]
gsvdf$folge<-gsvdf$folge+gsvdf$row*4
gsvdf$id<-as.int64(gsvdf$id)
gsvdf$epoch<-as.int64(gsvdf$epoch)
gsvdf<-gsvdf[,c("uid","id","epoch","system","folge","prn","elevation","azimuth","snr")]
dbCatchWriteTable(con,"gpsgsv",gsvdf,nfr=1000)
rm(inrmc,rmcin,gsvdf)
gc()
}
}
rmcin<-dbGetQuery(con,"select uid,cast(id as char) as id,cast(epoch as char) as epoch,telegram,payload from gpsin where telegram like '%GSA' and raw=1;")
if(nrow(rmcin)>0){
rmcin$id<-as.int64(rmcin$id)
rmcin$epoch<-as.int64(rmcin$epoch)
sid<-strsplit(rmcin$payload,",")
maxcol<-max(sapply(sid,length))
clusterExport(cl,c("maxcol"))
inrmc<-as.data.frame(matrix(unlist(lapply(sid,function(i){out<-i;if(length(i)<maxcol){out<-c(i,rep(NA,maxcol-length(i)));};return(out)})),ncol=maxcol,nrow=length(sid),byrow=TRUE),stringsAsFactors=FALSE)
inrmc$id<-rmcin$id
inrmc$uid<-rmcin$uid
inrmc$epoch<-rmcin$epoch
inrmc$telegram<-rmcin$telegram
col_tel<-0
if(nrow(inrmc)>0){
gsadf<-data.frame(uid=inrmc$uid,epoch=inrmc$epoch,id=inrmc$id,
pdop=as.numeric(inrmc[,col_tel+15]),hdop=as.numeric(inrmc[,col_tel+16]),vdop=as.numeric(inrmc[,col_tel+17]),
system=substr(inrmc$telegram,2,2),
sats=sapply(1:nrow(inrmc),function(i){
tg<-inrmc[i,col_tel+3:14]
tg<-as.numeric(tg[(nchar(tg)>0)&!is.na(tg)])
tg<-tg[!is.na(tg)]
tg<-sort(tg)
return(paste(tg,collapse="_"))
})
,stringsAsFactors=FALSE)
gsadf<-gsadf[nchar(gsadf$sats)>0,]
dbCatchWriteTable(con,"gpsgsa",gsadf)
rm(inrmc,rmcin,gsadf)
gc()
}
}
rmcin<-dbGetQuery(con,"select uid,cast(id as char) as id,cast(epoch as char) as epoch,telegram,payload from gpsin where telegram like '%GBS' and raw=1;")
if(nrow(rmcin)>0){
rmcin$id<-as.int64(rmcin$id)
rmcin$epoch<-as.int64(rmcin$epoch)
sid<-strsplit(rmcin$payload,",")
maxcol<-max(sapply(sid,length))
clusterExport(cl,c("maxcol"))
inrmc<-as.data.frame(matrix(unlist(lapply(sid,function(i){out<-i;if(length(i)<maxcol){out<-c(i,rep(NA,maxcol-length(i)));};return(out)})),ncol=maxcol,nrow=length(sid),byrow=TRUE),stringsAsFactors=FALSE)
inrmc$id<-rmcin$id
inrmc$uid<-rmcin$uid
inrmc$epoch<-rmcin$epoch
inrmc$telegram<-rmcin$telegram
col_tel<-0
gbsdf<-data.frame(uid=inrmc$uid,epoch=inrmc$epoch,id=inrmc$id,
system=substr(inrmc$telegram,2,2),lat_err=as.numeric(inrmc[,col_tel+2]),lon_err=as.numeric(inrmc[,col_tel+3]),
alt_err=as.numeric(inrmc[,col_tel+4]),stringsAsFactors=FALSE)
gbsdf<-gbsdf[rowSums(is.na(gbsdf),na.rm=TRUE)<4,]
dbCatchWriteTable(con,"gpsgbs",gbsdf)
rm(gbsdf,inrmc,rmcin)
gc()
}
rmcin<-dbGetQuery(con,"select uid,cast(id as char) as id,cast(epoch as char) as epoch,telegram,payload from gpsin where telegram like '%GRS' and raw=1;")
if(nrow(rmcin)>0){
rmcin$id<-as.int64(rmcin$id)
rmcin$epoch<-as.int64(rmcin$epoch)
sid<-strsplit(rmcin$payload,",")
maxcol<-max(sapply(sid,length))
clusterExport(cl,c("maxcol"))
inrmc<-as.data.frame(matrix(unlist(lapply(sid,function(i){out<-i;if(length(i)<maxcol){out<-c(i,rep(NA,maxcol-length(i)));};return(out)})),ncol=maxcol,nrow=length(sid),byrow=TRUE),stringsAsFactors=FALSE)
inrmc$id<-rmcin$id
inrmc$uid<-rmcin$uid
inrmc$epoch<-rmcin$epoch
inrmc$telegram<-rmcin$telegram
col_tel<-0
if(nrow(inrmc)>0){
grsdf<-data.frame(uid=inrmc$uid,epoch=inrmc$epoch,id=inrmc$id,
system=substr(inrmc$telegram,2,2),fix=as.numeric(inrmc[,col_tel+2]),fgga=as.numeric(inrmc[,col_tel+1]),stringsAsFactors=FALSE)
for(ig in 1:12)grsdf[,paste("S",ig,sep="")]<-as.numeric(inrmc[,2+ig])
grsdf<-grsdf[rowSums(is.na(grsdf),na.rm=TRUE)<10,]
dbCatchWriteTable(con,"gpsgrs",grsdf)
rm(grsdf,inrmc,rmcin)
gc()
}
}
rmcin<-dbGetQuery(con,"select uid,cast(id as char) as id,cast(epoch as char) as epoch,telegram,payload from gpsin where telegram like '%GST' and raw=1;")
if(nrow(rmcin)>0){
rmcin$id<-as.int64(rmcin$id)
rmcin$epoch<-as.int64(rmcin$epoch)
sid<-strsplit(rmcin$payload,",")
maxcol<-max(sapply(sid,length))
clusterExport(cl,c("maxcol"))
inrmc<-as.data.frame(matrix(unlist(lapply(sid,function(i){out<-i;if(length(i)<maxcol){out<-c(i,rep(NA,maxcol-length(i)));};return(out)})),ncol=maxcol,nrow=length(sid),byrow=TRUE),stringsAsFactors=FALSE)
inrmc$id<-rmcin$id
inrmc$uid<-rmcin$uid
inrmc$epoch<-rmcin$epoch
inrmc$telegram<-rmcin$telegram
col_tel<-0
gstdf<-data.frame(uid=inrmc$uid,epoch=inrmc$epoch,id=inrmc$id,
system=substr(inrmc$telegram,2,2),
rms=as.numeric(inrmc[,col_tel+2]),lat_sigma=as.numeric(inrmc[,col_tel+6]),lon_sigma=as.numeric(inrmc[,col_tel+7]),
height_sigma=as.numeric(inrmc[,col_tel+8])
,stringsAsFactors=FALSE)
gstdf<-gstdf[!is.na(gstdf$rms),]
dbCatchWriteTable(con,"gpsgst",gstdf)
rm(gstdf,inrmc,rmcin)
gc()
}
rmcin<-dbGetQuery(con,"select uid,cast(id as char) as id,cast(epoch as char) as epoch,telegram,payload from gpsin where telegram like '%VTG' and raw=1;")
if(nrow(rmcin)>0){
rmcin$id<-as.int64(rmcin$id)
rmcin$epoch<-as.int64(rmcin$epoch)
sid<-strsplit(rmcin$payload,",")
maxcol<-max(sapply(sid,length))
clusterExport(cl,c("maxcol"))
inrmc<-as.data.frame(matrix(unlist(lapply(sid,function(i){out<-i;if(length(i)<maxcol){out<-c(i,rep(NA,maxcol-length(i)));};return(out)})),ncol=maxcol,nrow=length(sid),byrow=TRUE),stringsAsFactors=FALSE)
inrmc$id<-rmcin$id
inrmc$uid<-rmcin$uid
inrmc$epoch<-rmcin$epoch
inrmc$telegram<-rmcin$telegram
col_tel<-0
vtgdf<-data.frame(uid=inrmc$uid,epoch=inrmc$epoch,id=inrmc$id,
system=substr(inrmc$telegram,2,2),
course_true=as.numeric(inrmc[,col_tel+1]),course_mag=as.numeric(inrmc[,col_tel+3]),speed_kn=as.numeric(inrmc[,col_tel+5])*1000,
speed_kmh=as.numeric(inrmc[,col_tel+7])*1000
,stringsAsFactors=FALSE)
dbCatchWriteTable(con,"gpsvtg",vtgdf)
rm(vtgdf,inrmc,rmcin)
gc()
}
rmcin<-dbGetQuery(con,"select uid,cast(id as char) as id,cast(epoch as char) as epoch,telegram,payload from gpsin where telegram like '%GNS' and raw=1;")
if(nrow(rmcin)>0){
rmcin$id<-as.int64(rmcin$id)
rmcin$epoch<-as.int64(rmcin$epoch)
sid<-strsplit(rmcin$payload,",")
maxcol<-max(sapply(sid,length))
clusterExport(cl,c("maxcol"))
inrmc<-as.data.frame(matrix(unlist(lapply(sid,function(i){out<-i;if(length(i)<maxcol){out<-c(i,rep(NA,maxcol-length(i)));};return(out)})),ncol=maxcol,nrow=length(sid),byrow=TRUE),stringsAsFactors=FALSE)
inrmc$id<-rmcin$id
inrmc$uid<-rmcin$uid
inrmc$epoch<-rmcin$epoch
inrmc$telegram<-rmcin$telegram
col_tel<-0
gnsdf<-data.frame(uid=inrmc$uid,epoch=inrmc$epoch,id=inrmc$id,
breite=txt2bl(inrmc[,col_tel+2]),laenge=txt2bl(inrmc[,col_tel+4]),mode=inrmc[,col_tel+6],sats=inrmc[,col_tel+7],hdop=as.numeric(inrmc[,col_tel+8]),
hoehe=as.numeric(inrmc[,col_tel+9])*1000,hoehe_datum=as.numeric(inrmc[,col_tel+10])*1000
,stringsAsFactors=FALSE)
dbCatchWriteTable(con,"gpsgns",gnsdf,nfr=1000)
rm(gnsdf,inrmc,rmcin)
gc()
}
dbSendStatement(con,"delete from gpsin where raw=1;")
dbDisconnect(con)