2014年7月13日日曜日

GNSS/GPS 経路の表示に OpenLayers 2 を使う (その5:KML ファイルで経路を表示)

これはGNSS/GPS 経路の表示に OpenLayers 2 を使う(その4:不透明度を変えて2つの地図を重ねて表示)からの続きである。
GNSS/GPS 経路の表示に OpenLayers 2 を使う(その0:はじめに)に目次がある。
ここでは OpenLayers 2.13.1 を使っている。
前回(その4:不透明度を変えて2つの地図を重ねて表示)では 2種類の地図を表示させ,一方の地図の不透明度を変更させて,見え具合をユーザーが変更できるようにした。

今回は,KML ファイルを読み込ませて,GNSS/GPS ロガーの経路データを任意の地図の上に表示させる。 ここでの話は OpenLayers のサンプルや,地理院地図の使い方, 技術情報, 地理院タイルを用いたサイト構築サンプル集, 等を参考にしている。

2014年7月9日水曜日

GNSS/GPS 経路の表示に OpenLayers 2 を使う (その4:不透明度を変えて2つの地図を重ねて表示)

これはGNSS/GPS 経路の表示に OpenLayers 2 を使う(その3:中央にセンターマークを表示)からの続きである。
GNSS/GPS 経路の表示に OpenLayers 2 を使う(その0:はじめに)に目次がある。
ここでは OpenLayers 2.13.1 を使っている。
前回(その3:中央にセンターマークを表示)では 地図の中央にセンターマークを表示させた。 今回は,2つの地図を重ねて,一方の不透明度を操作して2つの地図を同時に見たり,一方だけにしたりしてみたい。 ここでの記載はy2blog OpenLayersでレイヤーをオーバレイ表示する方法を参考にさせてもらっている(というか,そのままに近いかもしれない…)。

GNSS/GPS 経路の表示に OpenLayers 2 を使う (その3:中央にセンターマークを表示)

これはGNSS/GPS 経路の表示に OpenLayers 2 を使う(その2:OpenLayers 2 を使って地理院地図を表示)からの続きである。
GNSS/GPS 経路の表示に OpenLayers 2 を使う(その0:はじめに)に目次がある。
ここでは OpenLayers 2.13.1 を使っている。
前回(その2:OpenLayers 2 を使って地理院地図を表示)は OpenLayers を使って地理院地図を表示させたが,今回は地図の中央にセンターマークを表示させてみる。 ここでの記載は地理院地図のページのソースや, y2blog OpenLayersでレイヤーをオーバレイ表示する方法などのサイトを参考にさせてもらっている。

GNSS/GPS 経路の表示に OpenLayers 2 を使う (その2:OpenLayers 2 を使って地理院地図を表示)

これはGNSS/GPS 経路の表示に OpenLayers 2 を使う(その1:OpenLayers 2 を使って複数の Google Map を表示)からの続きである。
GNSS/GPS 経路の表示に OpenLayers 2 を使う(その0:はじめに)に目次がある。
ここでは OpenLayers 2.13.1 を使っている。
前回(その1:OpenLayers 2 を使って複数の Google Map を表示)は OpenLayers を使って Google Map を表示させたが,今回は地理院地図を表示させてみる。

GNSS/GPS 経路の表示に OpenLayers 2 を使う (その1: OpenLayers 2 を使って複数の Google Map を表示)

これはGNSS/GPS 経路の表示に OpenLayers 2 を使う(その0:はじめに)からの続きである。
また,GNSS/GPS 経路の表示に OpenLayers 2 を使う(その0:はじめに)に目次がある。
ここでは OpenLayers 2.13.1 を使っている。
ここでは OpenLayers を使って Google Map をさせようと思う。 実は前回(GNSS/GPS 経路の表示に OpenLayers 2 を使う(その0:はじめに))すでに Google Map の表示の仕方を説明していた。 今回は同じ Google Map の表示だが,複数種類の Google Map を表示させよう。

 OpenLayers では,地図画像や,マーカーなどはベースとなる変数(画像のためのキャンバスのような意味を持つ変数。ここでは「map」)に, いろんな地図やマーカーなどの「Layer(層)」を重ねていくイメージである。 通常は「背景」となる「Base Layer」となる画像を置き,その上に「Overlay(上の層)」を重ねていく。 ここで,Base Layer と Overlay の違いは,地図画像自体の透明度を変えるなどの加工ができるかどうか,であり, Base Layer は加工はできないみたいである(たぶん…)。

 今回は,複数種類の Google Map を全て Base Layer として表示させる。 そのため,複数の地図画像 (Base) Layer を重ねてやると,複数種類の Google Map を同じ画面上に表示できるが, 当然下の画像は見えなくなってしまう。 片方の画像の透明度を変えるとうまく兼ねて表示できるのだが,その点に関しては,「その4」辺りで述べようと思う。

 ここでは複数種類の地図を Base Layer として表示させるが,同時には見えないので,Layer 切り替えスイッチを使って表示を切り替える。 以下に具体例を示すので,自分で表示させて感触を得て欲しい。

GNSS/GPS 経路の表示に OpenLayers 2 を使う (その0:はじめに)

 最近,電子国土の仮サービスが地理院地図というサービスに統合された。 地理院地図は 1/25000 の地形図を電子形式にしたもので,私的な利用に関してはあまり制限なく使うことができる(正確な事は地理院地図の利用規約を見て欲しい)

 私は,これまで GNSS/GPS ロガーの経路データを写真の表示に主に Google Map を使っていた。 理由は Google Maps API というのを使えば,自分で地図をカスタマイズできたからである。 しかし,Google Maps の場合,道路地図だと拡大していくと細かい部分は省略されてしまうし, かと言って衛星画像は読込みが重いし,Google の地形図はいまいち好みじゃないし,と思っていた。 他の地図サービスというと,Yahoo Map の他に,電子国土というサービスがあり,1/25000 地形図を見ることができるのは知っていた。 でも,GNSS/GPS ロガーの経路データの表示に使おうと思っていなかった。 しかし,最近,電子国土から地理院地図に変わり, いろいろと調べてみると,意外とカスタマイズできそうだったので,地理院地図を使った GNSS/GPS ロガーの経路データ表示に挑戦してみた。 それについて,ここで数回に分けて書きたいと思う。

 地理院地図だが,web 上での表示にはオープンソース・ソフトウェアである OpenLayers を使っている。 実際,地理院地図のページに行き,ソースを表示させると OpenLayers を使っているのがわかる。 そこで,まずは OpenLayers (OpenLayers 2.13.1) について勉強してみた。 その上で,私なりに地理院地図+OpenLayers を使った GNSS/GPS ロガー経路データの表示を行うことにした。

 以下に OpenLayers 本家関連のリンクを書こう。
  ・OpenLayers:メインのサイト (2014/9/1 現在は OpenLayers 3 になってる)
  ・OpenLayers 2:OpenLayers 2.13.1 のメインサイト
  ・User Documents:OpenLayers の使い方の文章
  ・API Documents:変数に関する説明
  ・Development examples:OpenLayers の使用例
  ・Release examples (2.13.1):最新バージョンの使用例(リスト形式)
これらは当然ながら英語であるが,検索すると日本にしてあるものもあるので探してみて欲しい。

 数回になっているので,目次も書いておこう。
  ・その0:はじめに(このページ)
  ・その1:OpenLayers 2 を使って複数種類の Google Map を表示
  ・その2:OpenLayers 2 を使って地理院地図を表示
  ・その3:中央にセンターマークを表示
  ・その4:不透明度を変えて2つの地図を重ねて表示
  ・その5:KML ファイルで経路を表示
  ・その6:KML ファイルで経路とマーカーを表示
  ・その7:マーカーを text ファイル,経路を KML で表示
  ・その8:マーカーと経路を別々の KML ファイルで表示
  ・その9:今回の一連のものをまとめたもの
  ・OpenLayers 3 を使ってみよう(その0:はじめに:地理院地図を表示):OpenLayers 3 を使った例

2014年7月6日日曜日

GNSS/GPS ロガーの比較(その3):GPS ログの比較(その6)

 今回は GNSS/GPS ロガーの比較(その2):GPS ログの比較(その5)の続きの投稿である。
また,この続きとして GNSS/GPS ロガーの比較(その4):GPS ログの比較(その7)というのを書いた。

 GNSS/GPS ロガーの比較第3弾である。 GPS ログの比較では第6弾であるが,最近はメインが GNSS になっている。 どうも GPS よりも GNSS の方が性能がいいようなので…。

 今回は4種類のロガーを使った。そのうち3つが GNSS ロガーである。
使用したロガーを具体的に書くと,
 (1) Adafruit 社が販売している Ultimate GPS unit,
 (2) GlobalTop 社が販売している Gms-g9 ユニットを使った GNSS ロガー1号機,
 (3) GlobalTop 社が販売している Gms-g9 ユニットを使った GNSS ロガー2号機,
 (4) ランニングエレクトロニクス社製 Gms-g9 基板を使用した GNSS ロガー 3号機
の4つ(2種類)である。

前回からの違いは, GNSS ロガー3号機が投入された点のみである。 今回,紀伊半島を走る機会に4つの GNSS/GPS ロガーをテストしてみた。

2014年6月18日水曜日

ランニングエレクトロニクス社製 Gms-g9 基板使用 GNSS ロガー 3号機の製作

 参考:GNSS ロガー (Gms-g9 使用) の2号機を作る:Gms-g9 を使った GNSS ロガーの2号機の話

 ネットで見つけたので,ランニングエレクトロニクス社から, Gms-g9 Breakout 基板を買ってみた。
その製品は基板の表に Gms-g9 がつけてあり,裏にチップ抵抗やチップコンデンサなどが配置されている。 価格は2014/現在で,4,094円だった。 基板の大きさは Gms-g9 を一回り大きくしたぐらいで,縦横共に2.54cmとなっており,コンパクトにまとまっている。 一つ難点をあげるとすると,ボタン電池をつけるスペースと未 Fix 時に点滅する LED が基板上にないことぐらいだろうか。 Gms-g9 はバックアップ電源として常にボタン電池から電圧を供給しておきたいのだが,それは別にスペースを確保しないといけない。 Adafruit 製の Ultimate GPS unit (PA6H が載っている基板)の場合,全体の大きさは少し大きいが, 表側に抵抗などが配置され裏にボタン電池をつけるスペースがあった。 バックアップ電源はなくても使えるが,常にバックアップ電源から電圧を供給しておく方が衛星の捕捉が早かったはずなので, breakout 基板にボタン電池を付けれる方がいいと感じた。 また,Fix していない時に点滅する LED もついていると,部品と手間が減っていいと思うのだが…。 自分で基板に Gms-g9 を貼り付けた場合は,できるだけ Gms-g9 と同じ基板上にボタン電池と LED (+抵抗)をつけるようにしていた。 しかし,コンパクトにきれいにまとまっているという点では,ランニングエレクトロニクス製の breakout 基板には全然かなわない。
ランニングエレクトロニクス社製 Gms-g9 基板Gms-g9 基板裏面

2014年4月4日金曜日

ウォッちずがサービス停止になって,地理院地図(電子国土Web)を使えと言われた

 私はバイクで紀伊半島を走るのが好きであり,よく GPS ロガーを持って走りに行っている。 GPS ロガーは走行経路の記録の他に,写真の位置情報を地図に結びつけていたりする。 つまり,ツーリングの時に撮った写真がどこで撮られたかを地図で示すのに使っている。 その際,使っている地図が3種類ある。

一つ目は Google Maps。これは Google が提供している地図であり,JavaScript を使ってアイコンを表示したりできるので重宝している。 また交通情報を表示させたり,あるいは地形を航空写真で見たりできて,大変便利で使わせてもらっている。 しかし,問題がないわけではない。 多少粗い図を見ようと思うと,地図に表示される情報が極端に少なくなってしまう。 最高解像度から5段階ぐらいまでは等高線があっていいのだが,それ以上に広い範囲(少し粗い地図)を見ようと思うと,急に殺風景な地図になってしまう。 田舎で等高線がないと,のっぺりした知図になって何も情報が得られない。 少し粗い地図の表示が良くなるともっと良い地図になるのになぁ,と思う。

2つ目は Yahoo の地図である。 Yahoo の地図は等高線や山の形がわかるような表示なっていて,結構見やすいので気に入っている。 航空写真で見ることもできるし。 しかし,こちらにも問題がある。ある程度以上詳細にしようと思うとデータがない場合が多い。 特に紀伊半島の山の中などはかなり解像度を落とさないといけないことが多い。 データが増えてがどこでも詳細な図が表示されればいいのだが,とりあえずは拡大していくと使えなくなることが多い。

3つ目は国土地理院のウォッちずというサービスだった。 これは1/25000の地図を元にしていて,詳細な部分が得意な地図サービスだった。 しかし,過去形で書いているように,この 2014/3/31 付でサービスが終了してしまった。 なんてことだ,と最初は思ったが,実は別の電子国土というプロジェクトがあり,そちらの情報を使うようにサービスが移行した,のだった。 ウォッちずのサイトのお知らせでは「地理院地図(電子国土Web)」と書かれている。

さて,その地理院地図(電子国土Web)だが,サイトとしては https://maps.gsi.go.jp/(2018/5 訂正。http://portal.cyberjapan.jp/site/mapuse4/index.html)にある。 そのサイトを開くと,日本全体が見渡せる地図が表示される。 そして,ズームすると,最終的に 1/25000 の地図が表示される。 右上の方の「表示」の中の「中心位置の十字線」を選ぶと,中央に十字線が現れたりする。 なかなか面白い地図である。

しかし,ツーリングの時に撮った写真を撮った位置を示そうと思うと,上記のサイトにそのままリンクを張ったのでは意味がない。 そこでどうすればいいか,というのが今回のお話(もうほとんど終わりなのだが…)

具体的には
http://portal.cyberjapan.jp/site/mapuse4/index.html?crs=1&zoom=15&lat=33.7360611111111&lon=135.57495
のように書けばよい。 ここで,「?」以降には web site に渡したいパラメーターを記入できる。複数のパラメーターを渡したい時は「&」記号で区切る。 上記の場合,「crs=1」というのが中央に十字線を表示しろ,というパラメーターであり, 「zoom=15」というのが表示の解像度を示している。zoom の数値が大きいほど,詳細な図になる。zoom 値の最大値は 20 程度だったと思う。 他に「lat=33.7360611111111」と「lon=135.57495」が緯度と経度を示している。 これら以外にも「tab=0」や「dir=0」,「skz=0」などがあり,表示が多少変更される。

ネットで検索すると,この電子国土の地図上に登山の際の経路を表示させることもできるみたい。 ちょっと遊べそうなネタが出来た,今日このごろである…。

(追記)2015年3月に上記のようにして地理院地図を使おうとしたら,日本全国が表示されてしまった(全然拡大してくれなかった)。 どうもサーバー側での処理スクリプトを変更したみたい。 今のところ下記のようにすればズームしてくれる。
http://maps.gsi.go.jp/?ll=34.637825,135.100522222222&z=15&base=std&vs=c1j0l0u0
緯度・経度は「ll=34.637825,135.100522222222」で指定し,拡大率は「z=15」,地図の種類は「base=std」で指定している(みたい)。 最後の「vs=c1j0l0u0」の意味はまだわからず…。

2014年3月2日日曜日

FreeBSD 上での Perl の UTF-8 の文字化けではまる

 久々に FreeBSD ではまってしまった。 何にハマったかというと,Perl の UTF-8 テキスト文字列の取扱いでハマった。 Perl + cgi と apache 2.2 で web を運用し,かつ,PostgreSQL で運用しているデータベースの情報を web に載せている。 その際,Perl 内部での日本語文字列(より正確には UTF-8 の文字列)の encoding というので文字化けが発生してしまい,頭が混乱してしまった。 今回はこの件について書こう。
 先に最終的に今回私が採用した解決方法を書いておこう。 私が採用した解決方法は,Perl スクリプトの先頭付近に
use utf8;                            # use utf8 in Perl
use open ':encoding(UTF-8)';         # input/output default encoding is UTF-8
use open ':std';                     # STDIN, STDOUT, STDERR is set equal to "use open ':encoding(UTF-8)';"
という記述を書き,cgi の form でやりとりした文字列に対しては,
$input_string = Encode::decode('utf8', $input_string);
のようにして,文字列のエンコーディングを変換する,という作戦である。

1. システム構成
 まず,今回の件の動作環境について書いておこう。
私は,個人的なサイトのために FreeBSD でサーバーを運用している。 サーバーと言っても,マシン自体はちょっと古くなった Windows の Note PC を格下げして使っているのだが…。 サーバー上では,現在 FreeBSD release 9.0 を動かしている。 その上で,apache 2.2 で web site を立ち上げている。 web site は,主に cgi を使って運用している。 cgi を使うには Perl が必要なのだが,FreeBSD では「当然」Perl は最初から入っている。 現在の Perl のバージョンは,5.18 にしている。 さらに,データの管理のためにデータベースを運用している。 データベース用のアプリケーションは PostgreSQL 9.2.7 を運用している(今回の件で 9.3.3 にあげたが…)。