&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]]です。このページは書きかけです。順次整備します。~