&color(black,#CCFFCC){LINK:[[[GoogleEarthとR]]][[[ShapeFileライブラリ]]][[[kmlラボ]]][[[空間的なデータの分析]]][[[Rでジオコーディング]]][[[RでGPS]]]};~
----
目次
#contents
----
*RでGPS&LBS [#x1d7712d]
 最近は色々なものにGPS機能が付いてきています。その中にはGPSデータをログとして取得できるものもあります。~
またRのmaptoolsでもreadGPS()という関数が利用できるようになっています。(GPSbabelというソフトを利用します)~
 それ意外にも、PlaceEngineというWiFiを用いて位置情報を取得するツールが出現しており、GPS機能のないマシンでも無線LANの機能を利用して位置情報を取得できるようになってきました。~
 ここでは、Rで利用可能なGPS関連の情報を集約・活用することを目的とします。~
*Cool Applications [#xd5697f2]
SONY GPS-CS1K to Google Earth & Maps converter:~
http://www3.plala.or.jp/takayuki/gps/
*コメント欄 [#i178bfb8]
#comment(below)
- お知らせ>spDistsN1()の引数が逆になっている件は、確認次第訂正いたします。ご迷惑をおかけしました。 -- [[okinawa]] &new{2011-01-12 (水) 08:48:33};
- Cools Applications 追加 -- [[okinawa]] &new{2009-04-20 (月) 09:25:54};
- EveryTrail, with GPS-CS1K also iPhone! EveryTrailというサイトにはGPS-CS1KからもIPhoneからもGPSデータをUpして共有できるようです。 試しにRで作ったkmlファイルをUploadしたらGoogleMap上にきれいに表示できました。 http://www.everytrail.com/ -- [[okinawa]] &new{2009-01-26 (月) 17:45:28};
- ローカルのログから直接データを取得する方法 追加。この方法がいちばんめんどくさくなくていい。 -- [[okinawa]] &new{2008-11-26 (水) 17:05:42};
- ローカルDBから直接位置情報を取得する場合(PlaceEngineServer?へのリアルタイム接続はしない)更新。 -- [[okinawa]] &new{2008-11-25 (火) 16:56:59};
- RとPlaceEngineを用いた位置情報の取得(Mac&Win) 更新。 -- [[okinawa]] &new{2008-11-25 (火) 16:01:19};
- RではmaptoolsからreadGPSでGPSbabelを叩けますので、GPXもできるんじゃないでしょうか。 -- [[okinawa]] &new{2008-11-21 (金) 18:53:33};
- 最近、GPXのサポートが増えているような。R はまだかな? --  &new{2008-11-21 (金) 17:52:33};
- SONY GPS-CS1KSP新型がでてたのね。 -- [[okinawa]] &new{2008-09-17 (水) 17:50:54};
- ipod touch 2edにgpsが付いてこなかったのは,不幸中の幸いか?GPS-CS1Kはまだ使える! -- [[okinawa]] &new{2008-09-17 (水) 17:46:42};
- マルチポストですみません。GE(WIN)インストールするとgpsbabelもその中にインストールされています。 -- [[okinawa]] &new{2008-09-17 (水) 17:42:19};
- MacでもGPSbabelとmaptoolsを使ったフォーマット変換ができそうです。うまくいったらUPします。 -- [[okinawa]] &new{2008-07-01 (火) 15:43:42};
- そういえば、iPhone3GではGPS機能がつくとのことで、GPSデータを取り出すツールも出てくることでしょう。(ちょっとお高くて買えそうにないですが・・・) -- [[okinawa]] &new{2008-07-01 (火) 15:42:08};
- いやーひさしぶりの更新ですね。今日の話題は、「ようやくMacOSXでSONY GPS CS1がマウントできるようになっていました。」です。これでめんどくさいことをやらなくてすみますね。 -- [[okinawa]] &new{2008-06-27 (金) 10:59:49};
- 「ログから直接位置情報を取得する場合」は結構めんどくさいですね。Macのログの文字コードってEUCなのかな? -- [[okinawa]] &new{2008-01-17 (木) 10:26:40};
*GPS関連機器&ツール [#od743e22]
**SONY GPS-CS1K [#k6805e76]
SONYの携帯用GPSログ機器。デジカメのExif情報にGPSログを埋め込むソフトが付属する。~
CyberShot向けに発売されているが、他機種でも利用可能。GPSログとExif情報はタイムスタンプでマッチングさせているらしい。~
[[SONY GPS-CS1K:http://www.amazon.co.jp/%E3%82%BD%E3%83%8B%E3%83%BC-GPS-CS1K-SONY-GPS%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88/dp/B000HDR6UW]]~
[[SONY GPS-CS1KSP:http://www.amazon.co.jp/%E3%82%BD%E3%83%8B%E3%83%BC-GPS%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%82%AD%E3%83%83%E3%83%88-GPS-CS1KSP/dp/B0015AX1DW/ref=pd_sbs_e_1]]
**GPSbabel [#kcad8935]
GPSデータの変換を行うツール。非常に高機能。変換フォーマットの中にはKMLも含まれるため、GPSログ情報からKML(ルートトレース)を作成できる。~
MacOSX,Win,Linux版あり。maptoolsのreadGPS()はこのアプリとの連携で作動する。~

[[GPSbabel:http://www.gpsbabel.org/index.html]]~
**PlaceEngine [#b245be77]
ソニーと東京大学が共同で研究している新技術。ちまたにあふれる無線LAN(Wifi)のビーコン情報を利用することで、現在の位置を推定する。GPSと比較して都市部に有効。~
[[PlaceEngineHomePage:http://www.placeengine.com/]]~
[[PlaceEngineAPI:http://www.placeengine.com/doc/tutl]]~



*SONY GPS-CS1KからmaptoolsのreadGPS()を使ってデータを取得する。 [#g94d8c0e]
実は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の場合 [#fb7bd122]
 事前準備~
(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で起動すると、~
#ref(output.kml)
#ref(WG20080108112159.log)
#ref(RでGPS/GPS1.jpg,50%)

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

注)以下の距離計算の記事には大きな間違いがありますので、利用しないでください。~
***(注)以下の距離計算の記事には大きな間違いがありますので、利用しないでください。***~
また、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) [#x71b8f44]
 事前準備~
(1)無線LAN機能のついたMac/PCを用意(USB等の外付けでも可能だと思われる)~
(2)PlaceEngineクライアントをダウンロードしてインストールする。~
(3)RおよびPlaceEngineを起動させる~
~
 解説~
 PlaceEngineクライアントは単体でWebServerの機能を持っている。そのためWebAPI(REST)を用いることで、外部からのコントロールが可能となる。~
 また、設定で定時的な位置情報の取得が可能で、ログも保存されるため、ログから位置情報を取得することもできる。~
 (Macでは/ユーザ/username/ライブラリ/PlaceEngine内にpelog_日付.txtで保存される。)~
**PlaceEngineクライアントの確認 [#eb252a3d]
 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電測 [#rf3ea275]
 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への接続して位置情報を取得 [#u131dd5b]
 さて、電測で得られた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へのリアルタイム接続はしない) [#bbfbbe8b]
 これはローカルDBから位置情報を取得する方法である。~
***PlaceEngineクライアントインタフェース (LocalDB機能) [#i9c3e48b]
 param<-"http://localhost:5448/listdb"
 readLines(param)
 > param<-"http://localhost:5448/listdb" 
 > readLines(param)
 [1] "[\"all\",\"tokyo\"]"

***ローカルDBから情報取得 [#g8e35da0]
 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サーバーの機能をご利用下さい。~

***ローカルのログから直接データを取得する方法 [#l676900f]
(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
これで取り込めた。~

*アクセス数: [#ne674066]
&counter;
人~
[[okinawa]]です。このページは書きかけです。順次整備します。~

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS