RでGPS
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
&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]]です。このページは書きかけです。順次整備します。~
終了行:
&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]]です。このページは書きかけです。順次整備します。~
ページ名: