2009年12月12日

調査地のGISデータベース構築に挑戦(8) GPSデータのとりこみに苦戦

前回からしばらく更新がとどこおっている。GPSデータのとりこみに苦戦しているからだ。

僕が使っているGPSは、GARMIN(ガーミン) GPSMAP 60CSxだ(リンク先は日本語版だが、安いので英語版を使っている)。外部アンテナなしで、ポケットに入れた状態でガボンの森林の中でもストレスなく測位できる。

この機種は、microSDカードにトラックログを保存できる。microSDを使用する設定にすると、自動的にアクティブログを日ごとにgpx形式で保存してくれる。とても便利だ。

ウェイポイントは、1回の調査旅行が終わるときに、まとめてgpsbabelを用いてgpxファイルとしてPCに取り込んでいる。

だから、GPSデータをGRASSデータベースにとりこむ作業とは、実際にはgpxファイルのデータを読みこむ作業になる。

GRASSには、gpsbabelを用いてgpsデータをとりこむコマンド、v.in.gpsbabel が備わっているので、これを使う。

単にインポートするだけなら簡単だ。まず、GPSデータの受け皿として、WGS84測地系、投影なし(つまり、緯度経度)でロケーションを作成する。

そして、GUIの File → import vector map → GPSBabel GPS import。元データファイルと、GRASSでの地図名を記し、いくつかオプションを指定して Run。

これで、一応インポートできたのだが、問題はその中身だ。とりこんだwaypointデータの中身はどうなっているのだろう。v.info コマンドでたしかめてみる。

v.info -c WPT2009
Displaying column types/names for database connection of layer 1:
INTEGER|cat
DOUBLE PRECISION|x
DOUBLE PRECISION|y
DOUBLE PRECISION|altitude
CHARACTER|gmt_date
CHARACTER|gmt_time
CHARACTER|comments

ポイントデータの属性として、以下のものが作られていることがわかる。
  • cat (整数値)
  • x (浮動小数点数値)
  • y (浮動小数点値)
  • altitude (浮動小数点値)
  • gmt_date (文字列)
  • gmt_time (文字列)
  • comments (文字列)
常識的に考えれば、catにはGPSのポイント名、x, yが緯度経度、altitudeは標高、gmt_dateはグリニッジ標準時の日付、gmt_timeは同じく時刻、commentsがコメント、だろう。

では実際のデータはどう格納されているか、それを確かめるには、v.db.select コマンドを使う。

GRASS 6.4.0RC5 (GPS):~ > v.db.select WPT2009
cat|x|y|altitude|gmt_date|gmt_time|comments
1|136.9424|35.398232|57.564209|||09-JUN-09 9:49:05
2|10.571023|-2.330072|79.434082|||23-AUG-09 8:16:54
3|10.570365|-2.325331|82.317993|||23-AUG-09 8:28:18
4|10.569605|-2.323328|90.248779|||23-AUG-09 8:33:47
5|10.569756|-2.323125|88.806763|||23-AUG-09 8:38:25
6|10.569804|-2.322428|87.845459|||23-AUG-09 9:05:56
...

x, y, altitudeには、期待された値が格納されている。しかし、そのほかがだめだ。

catはGPSのポイント名と対応しない。gpxファイルに書かれている順番に連番が振られている。gmt_date, gmt_timeは空欄で、測位日時はcomments欄に格納されている。

しかも、位置データの精度が落ちている。gpxファイルでは小数点以下9桁まで記されていたのが、4〜6桁に落ちている。

この原因を探るため、gpxファイルそのものを見てみよう。すると、こうなっている。

<?xml version="1.0" encoding="UTF-8"?>
<gpx
  version="1.0"
  creator="GPSBabel - http://www.gpsbabel.org"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://www.topografix.com/GPX/1/0"
  xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
<time>2009-09-25T03:43:30Z</time>
<bounds minlat="-2.920034621" minlon="-1.270407932" maxlat="51.753171729" maxlon="136.946681673"/>
<wpt lat="35.398232108" lon="136.942400113">
  <ele>57.564209</ele>
  <name>003</name>
  <cmt>09-JUN-09 9:49:05</cmt>
  <desc>09-JUN-09 9:49:05</desc>
  <sym>Toll Booth</sym>
</wpt>
<wpt lat="-2.330071935" lon="10.571023263">
  <ele>79.434082</ele>
  <name>004</name>
  <cmt>23-AUG-09 8:16:54</cmt>
  <desc>23-AUG-09 8:16:54</desc>
  <sym>Fishing Hot Spot Facility</sym>
</wpt>
<wpt lat="-2.325330712" lon="10.570364613">
  <ele>82.317993</ele>
  <name>005</name>
  <cmt>23-AUG-09 8:28:18</cmt>
  <desc>23-AUG-09 8:28:18</desc>
  <sym>City (Small)</sym>
</wpt>
<wpt lat="-2.323327772" lon="10.569604794">
  <ele>90.248779</ele>
  <name>006</name>
  <cmt>23-AUG-09 8:33:47</cmt>
  <desc>23-AUG-09 8:33:47</desc>
  <sym>City (Small)</sym>
</wpt>
...

ここから、以下のようなことがわかる。
  • GPSBabelでgpx形式で読みこんだwaypointファイルには、idという概念がない。ポイント名は"name"タグに格納される。
  • 日時は、"cmt"タグと"desc"タグの両方に格納される。cmtはcomment、descはdescriptionの意であろう。
  • 標高は"ele"タグに格納される。
  • 緯度経度は、"wptタグの属性値lat, lonとして格納される。

日時がcomments欄に格納されたのは、それがまさにgpxファイルのcmt欄に格納されているからだろう。そしてcat欄に連番が振られたのは、idがないからで、nameタグには文字列が許されるからそれを使うわけにゆかないのだろう。

というわけで、gpsデータの読みこみは難儀だ。困ったこまった。