カシミール3D: アメリカの州境データの軽量化

州境データとして、以前の記事に書いた通りhttp://www.npms.rspa.dot.gov/data/data_base.htmを使っていたが、あまりにも詳細なため、カシミール3Dの起動に毎回10秒以上かかっていた。当初これでもよいかと思っていたが、そのうち遅さに耐えられなくなったので、元のデータを間引いて軽量化することにした。

e00データのフォーマットについては、http://avce00.maptools.org/docs/v7_e00_cover.htmlを参照した。

ARCの説明のうち、from_node, to_nodeというのが分かりにくいので補足。e00 データ上でまとまって記録はされていないものの、IDがついたnode(座標値)が多数存在する。それぞれの線分は、これらのnodeを始点・終点として間をIDなしのnodeで結んだ形になっている。この始点・終点のIDを保持しているのが、from_node, to_node という項目である。

カシミール3DGISツールプラグインは、線分データのみしか扱わないと記載されているので、ARCの部分だけ加工することにした。複数の線分を組み合わせて処理するのは大変そうなので、線分単位で以下の処理を行う。

  • 線分の始点と終点は必ず残す(これにより、from_node, to_nodeの情報を加工しなくて済む)
  • 線分の間に入っている点は、前の点から1マイル以上離れているときに限り残す。

なお、1マイルというのは、普段使っている地形データであるSRTM-30と同程度の粗さになる距離を適当に選んで決めた。

Perlでの実装

Perlで適当に実装する。なお、Cygwin上でperl5.8.7を使用した。

探してみたらGeo::Distanceというモジュールがあったので、インストール。このモジュールがDBIというモジュールを必要とするらしいので、それもインストール。

作成したコードは末尾の通り。自分が使っているe00データを軽量化するためだけに作ったものなので、他のデータに使えるかどうかはほとんど考えていない。また、1度しか実行しないものなので、速度向上の努力もしていない。

これを使って、130MB程度の元データが8MBぐらいに軽量化できた。カシミール3Dの起動時間もまったく気にならないレベルに短縮された。精度もSRTM-30と併用するには十分である(4倍ぐらいまでの拡大ならまったく違いが分からないレベル)。

#!/bin/perl

# e00-simplify: simplify e00 ARC, considering distance between points
# Usage: ./e00-simplify < state.e00 > state_sm.e00

use Geo::Distance;
$geo = new Geo::Distance;
$geo->formula('hsin');

$minimum_dist = 1.0; # in mile

sub distance_between_lines {
    ($line_from, $line_to) = @_;
    $line_from =~ s/^\s*//;
    ($lon1, $lat1) = split(/\s+/, $line_from);
    $line_to =~ s/^\s*//;
    ($lon2, $lat2) = split(/\s+/, $line_to);
    $geo->distance('mile', $lon1, $lat1 => $lon2, $lat2);
}

# process input upto "ARC"
while (<>) {
    last if /ARC/;
    print;
}

print;

# Process ARC part
while (<>) {
    # Search for arc header
    if (/(-*\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+/) {
        $coverage_num = $1;
        $coverage_id  = $2;
        $from_node    = $3;
        $to_node      = $4;
        $left_polygon = $5;
        $right_poligon= $6;
        $num_coordinates = $7;
        last if ($coverage_num == -1 && $coverage_id == 0);
        # process one (1) arc (set of coordinates preceded by header
        @output_lines = ();
        for ($i = 0; $i < $num_coordinates; $i++) {
            $line[$i] = <>;
        }
        push(@output_lines, $line[0]);
        for ($i = 0; $i < $num_coordinates -1; $i++) {
            $line_from = pop(@output_lines);
            push(@output_lines, $line_from);
            if (distance_between_lines($line_from, $line[$i])
                > $minimum_dist) {
                push(@output_lines, $line[$i]);
            }
        }
        push(@output_lines, $line[$num_coordinates-1]);
        # output one (1) arc
        printf "%8d%8d%8d%8d%8d%8d%8d\n", $coverage_num, $coverage_id,
        $from_node, $to_node, $left_polygon, $right_poligon, $#output_lines+1;
        foreach (@output_lines) {
            print;
        }
    }
}

printf "%8d%8d%8d%8d%8d%8d%8d\n", $coverage_num, $coverage_id,
    $from_node, $to_node, $left_polygon, $right_poligon, $num_coordinates;

Using GPS data log: Drawing and Editing with Kashmir 3D

Kashmir 3D is a free mapping software. The image above is created by this software. Another great example of what this software can do for GPS data log can be found here.

This software has so many functions, but I will focus on functions related to GPS data log.

Installing Kashmir 3D

Download and install the followings from Kashmir 3D download page.

  • Kashmir 3D (I use Ver 8.6.9 Japanese)
  • SRTM plugin (maybe included in Kashmir 3D)
  • NMEA/IPS import plugin
  • Shuttle Radar Topography Mission SRTM-30
    No installation work needed, just put all .xem files into some folder.
  • Start Kashmir 3D, and drag & drop one of SRTM-30 .xem file, and you'll see the map.

Drawing US State Borders

  • Install Kashmir 3D GIS tool plugin
  • Download state border data
    http://www.npms.rspa.dot.gov/data/data_base.htm
    Choose ArcView Export (so called e00 format. Note it's 40MB). After downloding, extract .e00 file from .zip file.
  • Start Kashmir 3D and choose file, open, GIS tool, AcrInfo Export file.
  • Choose .e00 file just downloaded. It takes about 10 - 20 minutes. Once you finish loading, it takes only 10 seconds since it will be read from "data depot" for next time.

Importing GPS data log (NMEA 0183)

  • Since Kashmir 3D's default geodic system is Tokyo, you should add the following one line to change this to WGS 84. You can also change geodic system by hand in Kashmir 3D after importing.
$PGRMM,WGS 84*06
  • Change extention of GPS data log into .nme or .nmea
  • Choose "tool", "NMEA/IPS file reading" in Kashmir 3D. Then choose .nme file to import.
  • In the dialog asking how much to cut data, put 1%, then push "start".
  • You can see detailed GPS track charts by "Edit", "GPS data edit", and edit (delete) outliers by hand. To find outliers, verocity and altitude charts are helpful.

Output map image

  • Set zoom to 0.25 times.
  • Right click the map and choose "map view" "shrink". Left click anywhere, then you will get more shrunk map.
  • Choose "Edit", "Select by latitude / longtitude", put N50,W-125 for top-left and N24,W-66 for bottom-right. You will get whole 48 mainland states in the USA.
  • Choose "file", "save image", "selected area", then you will have BMP image.

GPSログの活用に関するメモ

SonyからGPSロガー(デジカメとの連携をうたっているが、ハードウェアはただのNMEA0183ログ取り機)GPS-CS1Kが発売。興味深いのは、今までGPSを持っていなかったと思われる人がブログなどで取り上げているケースが非常に多いこと。できるようになることは、カシミール3Dとデジカメプラグインの組み合わせでできていたことと変わらないのだが……。

GPSログを取ることを主目的にGPSを買った筆者としては気になる機器だが、測位のスピードが気になる。未消化だがかき集めた情報をメモ。

http://www.sony.jp/products/Consumer/Peripheral/GPS/GPS-CS1K/
公式サイト
http://www.j-love.info/ino/archives/20060816_gpscs1k.html
GPSログ取りのために検討している方のメモ
http://t-code.org/blog/2006/08/sony-gps-cs1k.html
購入してログをKMLに変換している方のメモ
http://bb.watch.impress.co.jp/stapa_blog/archives/2006/08/gps_2.html
スタパブログの記事
http://blog.goo.ne.jp/hira_kei/e/843195f15a1676a6c0377985e27203b1
スタパブログの記事へのコメント
http://dc.watch.impress.co.jp/cda/item/2006/08/31/4511.html
デジカメWatchの記事
http://plusd.itmedia.co.jp/lifestyle/articles/0608/23/news022.html
IT mediaの記事

ついでに見つけたログ活用ツール類のメモ。

http://etoh.minidns.net/gps/trk2googlemaps/
自分でとったログをGoogle Maps APIを使って表示する
http://sightfield.jp/CS1K/upload.php
GPS-CS1K用と言っているが、NMEA0183データをuploadするとGoogle Maps上で軌跡再生できるサイト

取得したGPSログの活用: カシミール3Dによる表示と編集

カシミール3Dというのは、フリーの地図・地形図ソフトである。上記の画像はこのソフトで作成した。

このソフトの主なターゲットは山歩き用の立体表示と思われるが、GPSデータの操作機能も豊富であり、さまざまな2次元表示も可能である。非常に多機能なソフトであるが、ここではGPSログの活用目的に限定して紹介する。

なお、本項目を書くにあたっては毎日がエブリデイを大いに参考にさせていただいた。驚異的な量の軌跡が公開されている。

カシミール3Dのインストール

カシミール3Dのページから、以下のものをダウンロードして順にインストールする。

なお、スペースシャトル地図にはより詳細なSRTM-1というデータもある。

SRTM-1は、カバー範囲がアメリカ国内のみであること、データサイズが大きすぎることから、広い範囲を見るのには適さない。

アメリカの州境を描画する

アメリカの州境が必要ない場合はこの項目はスキップしてよい。

  • Kashmir 3DのGISツールプラグイン(Ver.0.4.0)をインストール
  • tiger/line state borderで検索して見つけたstate borderデータをダウンロード
    http://www.npms.rspa.dot.gov/data/data_base.htm
    ArcView Exportを選択する(e00と呼ばれる形式。40MBとサイズが大きいことに注意)。ZIPファイルを適当な場所に展開しておく。なお、Tiger/Lineはアメリカの州別GISデータ。
  • カシミール3Dを起動して、「ファイル」「開く」「GISツール」「ArcInfo Exportファイル」を選択。
  • 展開したe00ファイルを指定すると読み込まれる。サイズが大きいので10分〜20分ほどかかるが、再起動時にはデータデポから読むのでそれほど遅くはない(10秒程度)。

海岸線まで含まれることと、詳細すぎる(そのために速度が犠牲になる)ことが若干気になるが、とりあえずの用には十分。

……としばらくは思っていたが、カシミール3Dを起動するたびに待たされることに耐えられなくなり、データを間引くことにした

GPSログをインポートする

  • カシミール3DのNMEAインポートプラグインは、デフォルトの測位系がTokyo(日本測位系)になってしまう。GPSlim236はWGS84なので、インポートしてから手動で変更しても良いが面倒なので、NMEAファイルの先頭に下記の1行を追加する。筆者はcygwinでcatコマンドを使用している。
$PGRMM,WGS 84*06
  • GPSログの拡張子を.nmeまたは.nmeaに変更する。このときに筆者は、1日分のログを1ファイルに連結している(cygwinでcatを使用)。
  • カシミール3Dで「ツール」「NMEA/IPSファイルの読み込み」を選択。インポートしたい.nmeファイルを選択する。
  • 「インポートするデータを次の量まで間引く」というダイアログが出てくるので1%を指定。「開始」をクリック。100%でインポートするとトラックポイントが簡単に数万を越えてしまい、実用的な速さで動作しなくなる。
  • 「編集」「GPSデータ編集」でGPSデータを確認する。「トラック」に読み込まれている。1つのファイルでも、適宜分割されたトラックとなる場合がある。トラック名をダブルクリックすると、トラックデータの編集用グラフが表示される。
  • 先頭のポイントの日付が正しくない場合は修正するか削除(NMEA0183では一部のセンテンスにしか日付情報がないため、こうなる場合がある)。
  • 横軸と縦軸を適宜変えながら、異常点を探し削除するか修正。筆者は標高と速度を使って異常点を探すことが多い。

地図画像出力の方法

  • 「表示」「パレットの選択」と「表示」「表示の設定」「地形表現」の組合せで表示色が設定できる。筆者は毎日がエブリデイにならって、パレットを「石膏の色分け(レリーフ専用)」にしている。地形表現は「レリーフ1(地図帳風)」に設定している。
  • 画面右のパネルから「GISツール」でstate borderの色が変更できる。デフォルトの黄色は灰色の地図に合わないので濃紺系の色にしている。
  • ズーム/縮尺パネルなどで、ズームを0.25倍に設定。
  • 地図を右クリックして「地図表示」「縮小」を選択。適当な範囲を指定して左クリックすると、さらに縮小された表示(おそらく1/8倍)になる。なお、これ以外の方法では0.25倍未満のズーム倍率は指定できない(Ver.8.6.9で確認)。
  • 「編集」「選択範囲を緯度経度で指定する」で、左上を緯度50・経度-125(マイナスは西経)、右下を緯度24・経度-66とする。これでアメリカ本土の全域が入る。
  • 「ファイル」「表示画像を保存」「選択範囲を保存」でファイル名を指定するとBMP形式で保存される。1/8倍で表示している場合は900x500pixelぐらいである。
  • 適当な画像編集ツールでjpgにでも変換する。

ツヴァイクの「マゼラン」

マゼラン・アメリゴ (ツヴァイク伝記文学コレクション1)

マゼラン・アメリゴ (ツヴァイク伝記文学コレクション1)

この本の面白いところは、最初の1章を時代背景の説明に充てている点。ツヴァイク自身が、南米に船で移動している最中に感じた怖さの説明から始まり、マゼランの時代(16世紀初頭)の「世界」や「海」といったものについて当時の人々が持っていたであろう「常識」のようなものが説明される。この最初の1章の存在によって、単にマゼランの航海を読むだけではなく、その歴史的意義を感じることができるようになっている。
この本は、単なる「伝記」というよりも、紀伝体の歴史書の一部と考えるべきである。

はてな国のマクロ経済(素案)

  • はてな国の通貨ははてなポイントである。
  • はてな国の中央銀行は(株)はてなである。
  • ポイント換金制度存続中は、金本位制ならぬ円本位制と考えることができる。
    • 発行されるはてなポイントの量は、(株)はてなが備蓄している円の量に依存する。
    • ポイント換金が殺到した場合、(株)はてなは円を外部から調達しなくてはならない可能性がある。
  • ポイント換金制度廃止は、兌換制度から不換制度への移行とも考えられる。
  • はてなポイントの為替レートは、1ポイント=1円の固定相場制である。
    • (株)はてなが何らかの理由で(実世界では対外債務の返済のためというのが多いが)、はてなポイントを過剰に発行した場合、インフレが起こり固定相場制の維持ができなくなり、はてなポイントの価値が下落することが考えられる。
    • 月額固定料金で質問がいくらでもできるビジネスはてなの存在(すでに廃止されている模様)によって、もしかしたら1ポイント=1円より安く入手されたポイントが市場に流入しているかもしれない。
  • 消費税率は5%である。
  • 主な産業は、(株)はてなによる各種Webサービス事業と、日本国からの大量の出稼ぎ者による質疑応答サービス(人力検索)である。
    • 質疑応答サービスに従事している回答者は、日本国(最低賃金時給600円台)に比べて極めて安い報酬で働いている。
    • 質疑応答サービスの質問料金は、日本国(知り合いに食事をおごって話を聞かせてもらえば3000円ぐらいはかかる)に比べてかなり安い。
    • 今後、さらに多くの質問者が日本国から買出しにやってくる可能性があり、それによりはてな国のGDPが向上すると思われる。

オンラインゲームについての経済学は色々と書かれているが、はてなポイントの経済学は見つからなかったので、かなり怪しい知識がベースではあるが、とりあえず思いつきを並べた。

はてなで見つけたPocketPC + GPS情報

はてなは、キーワード経由で関連情報が探しやすい。
PocketPCGPSを使っている人の記事をいくつか。

PCやLinuxに自信がない人は,素直にPocketPC(hx4700など)を選択しましょう.そして,BT-338のようなBluetooth型のGPSレシーバを購入し,PocketMappleなどで楽しくGPSライフを楽しむことをおすすめします.正直,GPSが第一です.という方は,文句なくこれ.

BT-338もSiRFStarIII搭載。購入当時、GPSlim236と迷ったが、どこかでBT-338はBluetooth通信が途切れると勝手に電源が切れてしまう、というのを読んでGPSlim236にした気がする。

(その後追記。id:Hie氏からコメントをいただき、BT-338はBluetooth通信が途切れると10分程度で電源が切れるとのこと。購入当時はもっと短時間で切れてしまうと思っていた。コメントにある通り、このぐらい長ければ何かの拍子に勝手に落ちてしまうというデメリットはあまりなく、GPSレシーバの電源切り忘れによる電池切れ(経験あり)を防ぐ効果があるかもしれない。)

GPSlim236ユーザー。コメント欄で、GpsGateなるソフト(複数アプリからGPSレシーバを利用するためのソフト)が言及されているが知らなかった。とはいえ、1つのPocketPC上の複数アプリでGPSを共有したいと思ったことはないが……。

Bluetooth GPSも、せっかく電波を飛ばしているわけだから1対1の通信だけでなく、無線LANのアクセスポイントのように1対Nの通信で(つまり複数の機器から)使えると便利な気がする。

GPSlim266の場合は、GPSlim236の電源を入れてダッシュボードに置き、BenQ P50の電源を確保してフォルダに固定、電源を入れて地図ソフトを起動して、GPSlim236と接続しますが既にGPSlim236の電源は入っているので、地図ソフトから接続した時点で即時的に測位が出来ています。

やはりGPSlim236のtime-to-first-fixは短いらしい。