LINK:[GoogleEarthとR][ShapeFileライブラリ][kmlラボ][空間的なデータの分析][Rでジオコーディング][RでGPS]


目次


RでGPS&LBS

 最近は色々なものにGPS機能が付いてきています。その中にはGPSデータをログとして取得できるものもあります。
またRのmaptoolsでもreadGPS()という関数が利用できるようになっています。(GPSbabelというソフトを利用します)
 それ意外にも、PlaceEngineというWiFiを用いて位置情報を取得するツールが出現しており、GPS機能のないマシンでも無線LANの機能を利用して位置情報を取得できるようになってきました。
 ここでは、Rで利用可能なGPS関連の情報を集約・活用することを目的とします。

Cool Applications

SONY GPS-CS1K to Google Earth & Maps converter:
http://www3.plala.or.jp/takayuki/gps/

コメント欄


GPS関連機器&ツール

SONY GPS-CS1K

SONYの携帯用GPSログ機器。デジカメのExif情報にGPSログを埋め込むソフトが付属する。
CyberShot向けに発売されているが、他機種でも利用可能。GPSログとExif情報はタイムスタンプでマッチングさせているらしい。
SONY GPS-CS1K
SONY GPS-CS1KSP

GPSbabel

GPSデータの変換を行うツール。非常に高機能。変換フォーマットの中にはKMLも含まれるため、GPSログ情報からKML(ルートトレース)を作成できる。
MacOSX,Win,Linux版あり。maptoolsのreadGPS()はこのアプリとの連携で作動する。

GPSbabel

PlaceEngine

ソニーと東京大学が共同で研究している新技術。ちまたにあふれる無線LAN(Wifi)のビーコン情報を利用することで、現在の位置を推定する。GPSと比較して都市部に有効。
PlaceEngineHomePage
PlaceEngineAPI

SONY GPS-CS1KからmaptoolsのreadGPS()を使ってデータを取得する。

実はmaptoolsの関数を調べていたら、readGPS()というものがあることがわかった。
これはなんだ?と調べていくうちに、この関数がGPSからデータを取得する関数だとわかったので、使ってみることにした。
ただ、GPS機器は結構高いのでどうしたものかと思っていたが、SONYのGPS-CS1Kは比較的安価で、デジカメとの連動もできるという優れものだった。
(我が財務省の許可を得るためにも家族サービスにも応用できるものでないと導入が非常に難しいのだ)


対応状況:
(1)MacOSX10.5.3 O 正常にマウントされるようになりました。
(2)Ubuntu7.10(IntelMac) O
(3)WindowsXPSP2 O
(4)VMwareFusion&Windows2000 X
(5)VMwareFusion&Ubuntu7.10 O


WinXPSP2の場合

 事前準備
(1)Rにmaptoolsパッケージをインストール
(2)GPS-CS1Kを作動させ、ログを取っておく
(3)GPSbabel-1.3.4をC:\Program Files\直下にインストール
(4)GPSbabelまでのpathを設定(環境変数のPATH内に"C:\Program Files\gpsbabel-1.3.4\;"を追加
(5)必要ならばGoogleEarthを入れておく

 GPS-CS1Kに付属のUSBケーブルをさして、PCにつなぐ。すると、[リムーバブルディスク(*:)]とマウントされる。
 それを開くと[GPS]フォルダがありその中にWG****.logファイルが作成され、その中にGPSデータが保存されている。
 ここではF:ドライブにマウントされたことにして話を進める。

> library(maptools)
要求されたパッケージ foreign をロード中です
要求されたパッケージ sp をロード中です
> readGPS(i="nmea",f="F:/GPS/WG20080108112159.log")
   V1 V2       V3       V4         V5         V6         V7          V8
1   0 NA 26.25103 127.7356 1927274074 1075960148 26.251027N 127.735555E
2   1 NA 26.25172 127.7348 1927268244 1075966146 26.251722N 127.734840E
3   2 NA 26.25198 127.7348 1927266091 1075966607 26.251978N 127.734785E
4   3 NA 26.25204 127.7347 1927265602 1075966915 26.252037N 127.734748E
5   4 NA 26.25210 127.7347 1927265084 1075967362 26.252098N 127.734695E
6   5 NA 26.25210 127.7347 1927265070 1075967404 26.252100N 127.734690E
<中略>
           V9         V10 V11 V12         V13         V14      V15        V16
1  N26.251027 E127.735555   N   E   0.000000F   0.000000M 39455.47 1199791319
2  N26.251722 E127.734840   N   E   0.000000F   0.000000M 39455.47 1199791334
3  N26.251978 E127.734785   N   E   0.000000F   0.000000M 39455.47 1199791349
4  N26.252037 E127.734748   N   E   0.000000F   0.000000M 39455.47 1199791364
5  N26.252098 E127.734695   N   E   0.000000F   0.000000M 39455.47 1199791379
6  N26.252100 E127.734690   N   E   0.000000F   0.000000M 39455.47 1199791394
<中略>
   V17 V18     V19     V20      V21      V22      V23      V24
1    0   0 Unknown Unknown 0.000000 0.000000 20080108 19700101
2    0   0 Unknown Unknown 0.065411 0.105268 20080108 19700101
3    0   0 Unknown Unknown 0.083489 0.134363 20080108 19700101
4    0   0 Unknown Unknown 0.088121 0.141817 20080108 19700101
5    0   0 Unknown Unknown 0.093520 0.150505 20080108 19700101
6    0   0 Unknown Unknown 0.093850 0.151038 20080108 19700101
<中略>
64   0   0 Unknown Unknown 1.203728 1.937212 20080108 19700101
65   0   0 Unknown Unknown 1.211737 1.950102 20080108 19700101
66   0   0 Unknown Unknown 1.220836 1.964745 20080108 19700101
67   0   0 Unknown Unknown 1.268393 2.041281 20080108 19700101
68   0   0 Unknown Unknown 1.279296 2.058828 20080108 19700101
69   0   0 Unknown Unknown 1.286990 2.071210 20080108 19700101

 nmeaは米国海洋電子機器協会(National Marine Electronics Association)が定めた規格で、GPS-CS1Kに使用されているものはNMEA-0183というフォーマットになっています。
 readGPSの中身ですが、

> readGPS
function (i = "garmin", f = "usb:", type = "w", invisible = TRUE) 
{
   if (.Platform$OS.type == "windows") 
       gpsdata <- system(paste("gpsbabel -", type, " -i ", i, 
           " -f ", f, " -o tabsep -F -", sep = ""), intern = TRUE, 
           invisible = invisible)
   else gpsdata <- system(paste("gpsbabel -", type, " -i ", 
       i, " -f ", f, " -o tabsep -F -", sep = ""), intern = TRUE)
   if (any(grep("Can't init", gpsdata))) 
       stop("Cannot read GPS: check connexion")
   gpsdf <- read.table(con <- textConnection(gpsdata), fill = TRUE)
   close(con)
   gpsdf
}
<environment: namespace:maptools>

 となっており、とりたててたいしたことをしているわけではありません。
 なので例えば、

> system("gpsbabel -i nmea -f F:/GPS/WG20080108112159.log -o KML -F C:/output.kml")

 とすると、ログデータがKMLに変換されて出力されます。
 GoogleEarthで起動すると、

GPS1.jpg

こんな感じになります。(わたしのお散歩コースです)

***(注)以下の距離計算の記事には大きな間違いがありますので、利用しないでください。***
また、Rに取り込んだログデータの緯度・経度情報(V3,V4)からspパッケージのspDistsN1()で移動距離が計算できますので、自分のおおまかな歩幅を設定すれば、簡易万歩計になります。

library(maptools)
library(sp)
x<-readGPS(i="nmea",f="F:/GPS/WG20080108112159.log")
number<-nrow(x)-1
distance<-0
for (i in 1:number){
ll<-matrix(c(x$V3[i],x$V3[i+1],x$V4[i],x$V4[i+1]),ncol=2)
km <- spDistsN1(ll, ll[1,], longlat=TRUE)
distance<-sum(zapsmall(km))+distance
#print(distance)
}
distance #km
distance/0.0004#1歩40cm
> library(maptools)
> library(sp)
> x<-readGPS(i="nmea",f="F:/GPS/WG20080108112159.log")
> number<-nrow(x)-1
> distance<-0
> for (i in 1:number){
+ ll<-matrix(c(x$V3[i],x$V3[i+1],x$V4[i],x$V4[i+1]),ncol=2)
+ km <- spDistsN1(ll, ll[1,], longlat=TRUE)
+ distance<-sum(zapsmall(km))+distance
+ #print(distance)
+ }
> distance #km
[1] 1.760347
> distance/0.0004#1歩40cm
[1] 4400.866

4400歩くらい歩いてますね。
また、距離に体重のデータを組合わせると簡易に消費カロリーが計算できます。

#消費カロリー(kcal)=体重(kg)×距離(km)×0.8
weight<-70
(cal<-weight*distance*0.8)
[1] 98.5794

うわ〜。100kcalしか消費してない。

RとPlaceEngineを用いた位置情報の取得(Mac&Win)

 事前準備
(1)無線LAN機能のついたMac/PCを用意(USB等の外付けでも可能だと思われる)
(2)PlaceEngineクライアントをダウンロードしてインストールする。
(3)RおよびPlaceEngineを起動させる

 解説
 PlaceEngineクライアントは単体でWebServerの機能を持っている。そのためWebAPI(REST)を用いることで、外部からのコントロールが可能となる。
 また、設定で定時的な位置情報の取得が可能で、ログも保存されるため、ログから位置情報を取得することもできる。
 (Macでは/ユーザ/username/ライブラリ/PlaceEngine内にpelog_日付.txtで保存される。)

PlaceEngineクライアントの確認

param<-"http://localhost:5448/ackjs?"
savefile<-"/placedata.txt"
download.file(param,savefile)

 でMacintoshHD直下にplacedata.txtが落ちてくる。この中身は

ackRTAG("o070531","");

 と出力される。
 データをとりだすだけだと

param<-"http://localhost:5448/ackjs?"
readLines(param)
[1] "ackRTAG(\"o070531\",\"\");"

 となる。

WiFi電測

param<-"http://localhost:5448/rtagjs?"
savefile<-"/placedata.txt"
download.file(param,savefile)

 実行するとPlaceEngineが起動し電測が開始される。電測されたデータは、placedata.txtに落ちてくる。

recvRTAG("tZhvkNzOacKIYwNkaZvQwlWZunW3L7meIJi5eSUBoig0wtVO4pH1WWKChiFy25
AoxX0bQqk99LaPGtuZVr9SqC2iU2EgUM3fXDAhUijOrnIBanIFtFXPSQUozTCQVxcltQHhqO
SPT8F7e7qcIQ1YkhiEhQRexECOJvy1nGYuJskV5K4An1-ZToch-Ep-MEloc0nU6RJkw5UHML
TNpvUGYR4ZzbV7dTmoJPA00D2hXFSx0o3f9YF5mXMgCzdi6sOb4cjZuOo4S3tJedI7PuSgEM
ar7Yr8ysir3EMuK6.HC9JEfksYFv-TcMdwSS4aDSuHH33dS6ERt0z2-46DX4DS5Q**S5Q==",
2,1200464672);

 こんな感じ。
 データを取り出すだけだと、

param<-"http://localhost:5448/rtagjs?"
readLines(param)
[1] "recvRTAG(\"cGPyyK1TqPdx-SXpDYhdduTjXv9t7AZCkrqMmlS.iZ4ec86nR4QF4T7xOiOc4
FoW514MCZkp2ECjjw1wQYGNbj8khK.Y.EEimQeIN7jKu9QIKbC1YhpEVACB79G8KbSCZ..cJRQupee
QO9JFV5xt87V4gpW.kuyGDeXxJONJjHYggBQq0atqECs2h5pSdjwatD2cjPWYnOWpEOkoCRAfisu18
qfhtmqIMTK4UdzWNNn7YZrRhPPZFYPEvVRH78PRh4ScvUjVK-m9GEQmWbPxDDK2CFPWVmuKL7OTPz7
0lOFUug9od9WhJQYsn49XopAu.gKAYjJkDE3.GnKuQ084Xw**\",5,1200464878);"

 となる。

PlaceEngineServerへの接続して位置情報を取得

 さて、電測で得られたRTAGデータをPlaceEngineServerへ投げることによって、現在自分がいる位置の情報(緯度/経度/住所)を取得することができる。

param<-"http://localhost:5448/rtagjs?"
densoku<-readLines(param)
densoku2<-strsplit(densoku,'\"')
rtag<-densoku2[[1]][2]
time<-as.numeric(unlist(strsplit(strsplit(densoku2[[1]][3],",")[[1]][3],");")))
server<-"http://www.placeengine.com/api/loc?"
key<-"ovTwwQNZMyrNCXc1IjA2wzz-cJ4TcENVgn60nn-a.RbmHDXknPHM68kRt0vbG3Y4W93kWNU593oru6Bc6Wqlgqh-286qDf5W4MjbigFjoy3ab9WZzUA5clboCzmbyBdnT26rHrPYnJnlhtHtZbreZpJt.R2IyPFmGsjq0MCKoJujN4VaH4IFpBARkisn1offIr6yV3Tqzv3xp2TTHam.FOOHIEju329Y6ohJOODizKpMZ3z76yZtocFEDrws53c4NZhDoc7CWFAl7HMHENCh-oYCtkGwI84QqNjlXKMm8kts4MSz44ZCBjip2LNdGpIv5ki1217HXDjaktvTh9TeqA__,aHR0cDovL3d3dy5kYXRhY3ViZS5jby5qcC90ZXN0,aHR0cDovL3d3dy5kYXRhY3ViZS5jby5qcC90ZXN0"
param2<-paste(server,"t=",time,"&rtag=",rtag,"&appk=",key,sep="")
(placedata<-readLines(param2,encoding="UTF-8"))#Macの場合はencoding以下が不要
[1] "recvLoc(127.678157,26.215759,11,{'addr':'沖縄県那覇市久米二丁目','msg':'位置が取得できました','floor':'8F','t':1200468960});"

 位置情報が取得できた。

 (注)keyは個別に登録してもらっておくこと。

ローカルから直接位置情報を取得する場合(PlaceEngineServerへのリアルタイム接続はしない)

 これはローカルDBから位置情報を取得する方法である。

PlaceEngineクライアントインタフェース (LocalDB機能)

param<-"http://localhost:5448/listdb"
readLines(param)
> param<-"http://localhost:5448/listdb" 
> readLines(param)
[1] "[\"all\",\"tokyo\"]"

ローカルDBから情報取得

server<-"http://localhost:5448/locdb?"
key<-"jcRc542S3ofz-ONSVPkH8vsf4y4m1SpOhKjvYEYM4TL1R0GpZxUX1zGOVgZM3qa.wLYQf20ftAV1JELNS3HMBVcjPBcg9b5PDZHfFEQYAI2Y8X5K7SVqb.f9y-USfvZuJq4EZu5Ns7d.y7lQaS7NoQ-STcV1HS2mWYtlIN5ko5YkuzeVM.vPhNlxaomtsrWJiSLSIWl.9nTWRGjmAbZMqC4lAAbBoC6a80fwHUnt8ymW0vAzRa7n3Bhgvm6OLgd.N09JD9FhS.GrQQg.SLyeM3pAAdMK9H2aMkfiP0A0g3dPFWnavvEueeYRjq53IygfcIGWQHp7OZrzwSgQY2VESw__,aHR0cDovL2xvY2FsaG9zdDo1NDQ4Lw__,Umd1aS5leGU_"
param<-paste(server,"t=","&appk=",key,sep="")
(placedata<-readLines(param,encoding="UTF-8"))
> server<-"http://localhost:5448/locdb?"
> key<-"jcRc542S3ofz-ONSVPkH8vsf4y4m1SpOhKjvYEYM4TL1R0GpZxUX1zGOVgZM3qa.wLYQf20ftAV1JELNS3HMBVcjPBcg9b5PDZHfFEQYAI2Y8X5K7SVqb.f9y-USfvZuJq4EZu5Ns7d.y7lQaS7NoQ-STcV1HS2mWYtlIN5ko5YkuzeVM.vPhNlxaomtsrWJiSLSIWl.9nTWRGjmAbZMqC4lAAbBoC6a80fwHUnt8ymW0vAzRa7n3Bhgvm6OLgd.N09JD9FhS.GrQQg.SLyeM3pAAdMK9H2aMkfiP0A0g3dPFWnavvEueeYRjq53IygfcIGWQHp7OZrzwSgQY2VESw__,aHR0cDovL2xvY2FsaG9zdDo1NDQ4Lw__,Umd1aS5leGU_"
> param<-paste(server,"t=","&appk=",key,sep="")
> (placedata<-readLines(param,encoding="UTF-8"))
[1] "[127.67804145813,26.2157935649157,0,{}]"
Warning message:
In readLines(param, encoding = "UTF-8") :
  'http://localhost:5448/locdb?t=&appk=ovTwwQNZMyrNCXc1IjA2wzz-cJ4TcENVgn60nn-a.RbmHDXknPHM68kRt0vbG3Y4W93kWNU593oru6Bc6Wqlgqh-286qDf5W4MjbigFjoy3ab9WZzUA5clboCzmbyBdnT26rHrPYnJnlhtHtZbreZpJt.R2IyPFmGsjq0MCKoJujN4VaH4IFpBARkisn1offIr6yV3Tqzv3xp2TTHam.FOOHIEju329Y6ohJOODizKpMZ3z76yZtocFEDrws53c4NZhDoc7CWFAl7HMHENCh-oYCtkGwI84QqNjlXKMm8kts4MSz44ZCBjip2LNdGpIv5ki1217HXDjaktvTh9TeqA__,aHR0cDovL3d3dy5kYXRhY3ViZS5jby5qcC90ZXN0,aHR0cDovL3d3dy5kYXRhY3ViZS5jby5qcC90ZXN0' で不完全な最終行が見つかりました 

この機能はPlaceEngineクライアントw070606,m070606,o080131以降で導入された LocalDB機能 に関するものです。それ以前のクライアントでは利用できません。
LocalDBによる位置推定は、単純に緯度経度のみを求めるもので、以下の情報は提供されません:
(1)住所
(2)フロア情報
(3)推定精度
(4)推定に利用されたアクセスポイント数
LocalDBによる位置推定は、ローカルアプリケーションからのみ利用可能です。
Webアプリケーションでは従来通り PlaceEngineサーバーの機能をご利用下さい。

ローカルのログから直接データを取得する方法

(1)C:\Documents and Settings\****\My Documents\PlaceEngine
内にpelog_2008-00-00.txtとdblog_2008-00-00.txtが貯まっていますので、これを使います。

x<-scan("C:/Documents and Settings/****/My Documents/PlaceEngine/pelog_2008-00-00.txt",what="character",encoding="UTF-8")
y<-ifelse(match(substr(x,1,1),"[")==1,x)
z<-as.vector(na.omit(y))
z2<-gsub("[]'addr':'msg位置が取得できましたfloort]","",gsub("[[{}]","",z))
read.csv(textConnection(z2),header=F)
        V1       V2  V3                     V4 V5 V6         V7
1  127.6780 26.21579   1 沖縄県那覇市久米二丁目 NA 8F 1227656139
2  127.6780 26.21579   1 沖縄県那覇市久米二丁目 NA 8F 1227656446
3  127.6780 26.21579   1 沖縄県那覇市久米二丁目 NA 8F 1227656748
4  127.6780 26.21579   1 沖縄県那覇市久米二丁目 NA 8F 1227657050

これで取り込めた。

アクセス数:

15770 人
okinawaです。このページは書きかけです。順次整備します。


添付ファイル: fileoutput.kml 2998件 [詳細] fileGPS1.jpg 2374件 [詳細] fileWG20080108112159.log 2541件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-03-25 (土) 11:19:16