戻る

Javaアプレットで電子地図(デジタルマップ)を作る。


 って書くとかなり大げさなんですが、プログラムの練習用なんでたいした内容ではないです。

 作ろうと思った動機は、webで公開する時に走行軌跡などのポイントデータを公開するのに、現在あるwebで使える地図サイトだけでは、ちょっと用途が足りなかったためです。普通に一つの地点だけを表示したりするのには、全然問題ないのでそういう用途で使うときには今まで通りで行こうと思います。現在、トップページに走行軌跡も一応表示していますが、カーナビからデータを吸い上げて、PCカードでハードディスクに移してMapFanに付属のルートエクスチェンジャーでMapFanの軌跡データにコンバートして、MapFanで表示させてクリップボードに軌跡が載っている範囲を切り出してグラフィックソフトで加工してからアップロードする。と、かなり作業が煩雑なので、走行軌跡だけをアップロードして後は勝手に表示させてみてね。っていうのをやりたかったからです。

 で、地図を作ると言っても簡単に作れる訳ではありません。何しろ地図マニアとはいえ、地図を作るとなるとずぶの素人。右も左も分かりません。ただ、測地系なり経緯度なりある程度の言葉は分かるので、分かるところから解決していきましょう。


1:ラスター表示に挑戦の巻

地図2002.11.22
 まずは、ラスター地図を表示させることに挑戦してみようと思います。ラスター地図というのはビットマップの細かく分かれた地図データをマス目上に表示していき大きな地図を完成させます。スクロールや地図の表示はゲームで培った方法を用いてみました。ビットマップの地図が無いので国土地理院のメッシュ標高データをカシミール3Dで表示させてそこから拝借したいと思います。MapFanやゼンリンの地図でもいいのですが、経緯度線を好きな位置に張れるので、データを管理するのに都合が良かったので。そして、出来たのが下の地図画像です。

 ここまで作るのにも一苦労でした。しかも、測地系がゲーム座標(笑)なので、データに汎用性がありません。スクロール範囲が狭いです。まぁ、お遊び範囲では、これでもいいんですけど。とりあえず、地図以外にも「らくえぼ」で投稿した自動車の位置とカロッツエリアDVDカーナビゲーションシステム(所謂、カロナビ)AVIC-D9500からPCカード経由で吸い出した走行軌跡も一緒に表示。自車位置表示は、すでに公開しているページにもあるので、自車位置から経緯度変換して表示するのは、それほど難しくはありません。問題は走行軌跡表示です。データの解析から始めます。もちろん、一般に公開されているものではないので、MapFan上でどのようにコンバートされているのかをデータをちょくちょく変えていきながら確認します。腕がいい人はMapFanを解析すれば早いかもしれないですけど、僕にはそんな技術は無いので(笑)。そして、ようやく走行軌跡を経緯度変換することに成功。でも、これからデータをいろいろいじっていくことを考えたら今の内にちゃんとしておこうと思ったので、ラスター地図はこれまで。


2:ベクター表示に挑戦の巻

2002.11.24
 次にベクター地図の表示に挑戦します。なぜベクター地図にしたかというと、まずデータが少ないのでデバッグがやりやすいということ、ポイントデータの汎用性が取れること、あとからビットマップを貼り付けるだけでラスター地図にもなるということからです。さて、問題はデータをどこから入手するかということが一番問題ですね。これは、国土交通省のホームページからダウンロードして実験してみましょう。取り敢えずは鉄道のデータをダウンロードしてみました。見たことも無いフォーマットなのでかなり大変でした。ノードデータ?リンクデータ?さっぱり分かりません(笑)。幸いデータはテキストファイルで経緯度らしきものが書いてあります。適当に拾って表示してみましょう。表示してみたところ、それらしい表示が出てきました(笑)。でも、荒削りです。今度は中間ポイントというものを拾って表示してみたところ、きちんと細かいところも表示されました。そして、走行軌跡も表示。これはラスター地図のときと同じデータを利用しているので、経緯度変換をベクター用に書き換えるだけで済むので楽です。そして、表示したものが下の画面です。

地図

 使わなそうな数字や文字がいっぱいあったり、表示範囲から枠がはみ出てたりするのはデバッグ用です。画面外でどのような処理をしているかも確認するためです。しかし、昔のパソコンの画面みたいになって退化したように見えますが(笑)、ラスター地図より大変です。地図マニアでなかったら、こういう線がいっぱい出てきても「何となく合っているかも?」と、言うことさえ分からないかもしれません。他にも、道路や河川、せめて海岸線等も表示させないと地図としてかなり物足りないですね。ただ、ここまで作ってちょっと満足してしまったので、大幅なバージョンアップはしばらく無いかもしれません(またかよ)。


3:表示するデータを増やすの巻

2002.11.26
 もっとデータをいじってみようと、今度はポリゴンにも挑戦してみたのですが、例によって、まずはノードデータから座標を拾ってポリゴンへ…。あれ?ノードデータが空の所から座標を拾ってるぞ…。俺のプログラムがおかしいのかな?テキストエディタで見てみてもノードデータは設定されていません。っつ〜事は、根本的に俺の解釈が間違ってたのかな?それとも、データの不具合?分からないので後回しにしましょう。(断念とも言う)

 仕方なく、ラインデータを増やしてみます。鉄道だけだと寂しいので海岸線を入れてみることにします。データは同じく国土交通省から。海岸線は鉄道と違って都道府県別にダウンロードする仕組みになっています。これは逆に面倒です。メッシュで管理する場合、同じメッシュ内に違う都道府県が重なる場所があるからです。とりあえず、複数の都道府県ファイルをメッシュ毎に分けるツールから作りました。あとは、データは互換性(?)があるので、鉄道のデータと同じように表示します。ついでに、データを軽くするために、テキストデータを読んでいたのをバイナリデータにしました。で、完成したのが以下の画面です。

地図

 雰囲気を変えるために、色を変えてみました。少しは地図らしくなったかな?みんなの位置と走行軌跡が分かりにくくなったので見やすくしてみました。表示するものを鉄道にするか道路にするか悩みどころですが、両方表示すると逆に見難くなってしまうので切り分けが必要かもしれません。


4:地図らしくしてみるの巻

2002.11.28
 今まで鉄道のデータを表示していましたが、走行軌跡が自動車の物なので、道路のデータを表示するようにしました。ついでに、道の色分けも行いました。高速道路は青、国道は赤、それ以外の道は黒で線を引きます。これで、かなり地図らしくなってきました。

地図


5:ベクター地図らしくの巻

地図2002.11.30
 今回のバージョンは見た目的にはあまり変化していません。内部のデータをかなりいじっただけです。今回から表示範囲の物をキャッシュして読み込んでいない部分をスレッドで少しずつ読み込むことにしました。これによって地図を読み込んでいる間もストレス無くスクロールを行えるようになりました。ただ、思いっきりスクロールさせると読み込みが間に合わなくなって地図欠けが起こったりします。カーナビのような現象です(笑)。ついでに、ベクター地図らしさを出すために、拡大縮小をリアルタイムで行えるようにしました。今回からホイール対応です。Navin' Youのように急降下、急上昇が味わえるので、これだけでかなり遊べます。海岸線を全国分入れてみたのですが、長崎県は海岸線が凄いことになっているので、読み込みが遅いです(笑)。データを海岸線と道データで別に読み込んでいるので、同じファイルにして色分けするだけで、また速度が稼げそうなので、手が空いたら挑戦してみたいと思います。これは、地図のプログラムよりもデータ生成プログラムの方が手間が掛かりそうです。


6:はまりの巻

2002.12. 1
 数値地図コンバータに手を入れてデータを一元化したのに加えて、鉄道も新幹線やJR等の色違いに手を出してしまいました。「3:表示するデータを増やすの巻」では、線分データを利用していたので気付かなかったのですが、今回は線データに手を出したのが良くなかったのか、はまりました。下の画像は、「N02_07L.txt」の内容です。左側に行番号、DS、路線コード、1、ライン種別フラグ(1:新幹線 2:JR在来線 3:公営鉄道 4:民営鉄道)となっています。つまり東海道新幹線は、路線番号は13002500、種別フラグは1の新幹線になります。ここまでは問題無いですね。

地図

 さて、次に線データを追ってみます。線分データと線データの違いがまだ分かってないので間違ってたら指摘してください。全部を説明すると長くなってしまうので省きますが、黄色い部分が東海道新幹線を表しています。その下の行から線データが続きます。この路線は648本の線で結ばれているという事です(多分)。で、そのデータはメッシュコード+メッシュコード内番号で表記されてそれが連続して書かれています。それがノードデータです。

地図

 分かりやすくするために、行数が戻っていますが、気にしないように。で、下のデータがノードデータです。上の表と対応しています。東海道新幹線は、メッシュコード533946番号94からスタートします。その経緯度が、ノードデータに書かれている、(5031710,1284280)になります(多分)。線データは、94-93-90-91-92...と繋がっているので、経緯度(座標)は、(5031710,1284280)-(5031530,1284070)-(5031500,1284000)-(5031570,1284110)-(5031670,1284200)-...と繋がっていくはずなのですが、どうもこの座標がしっくりきません。この線を繋いでみると左下に向かっていると思ったら右上に向かったりします。ただ、全体的に遠くから見ると何となく、東海道新幹線の路線図になるのです。もしかしたら、線分データや線データの解釈が間違っているのかもしれないです。ここら辺、詳しい人がいましたら教えてください。

地図


7:はまりからの脱出の巻

地図2002.12. 2
 一日中悩んだ結果、何とか解決できました。線分データというのはどうやら直のデータではなさそうで、ノードデータと同じように間接的に使うデータのようです。そして、線データがその線分データを呼び出して、更にそれがノードデータを参照するという考えれば考えるほど訳が分からなくなってきます。取り敢えず、訳が分からなくなる前に線を引いてしまいましょう。完成したものが左の画像です。台帳データから駅の座標も拾って表示しました。同じ駅名で路線が違うものも表示しているのでターミナル駅は字が重なって見難いですけど…。新幹線とJR在来線とそれ以外の路線で色も変えられるようになりました。ただ、これだと道路を表示すると分からなくなってしまうので、やっぱ鉄道はゼブラにした方が見やすいかもしれません。


8:デザインを考えるの巻

地図2002.12. 3
 さて、データもそろそろ揃ってきました。あとは表示させるものを如何に綺麗に見せるかという、一番苦手とする部分です(笑)。その前に、現在表示してあるものを整理してみました。取り敢えず、道路は高速道路、国道、その他の道で色分け。スケールが大きくなると道を太くしました。鉄道は黒一本の細いまま。駅はある程度拡大してから表示するようにしました。駅の場所の丸い印も拡大率にあわせて大きくします。道のデータが県道レベルしか収録されていないので、拡大した時にやや物足りないものを感じます。


9:ロゴマークを表示するの巻

地図2002.12. 5
 今度はロゴマークの表示に挑戦します。カーナビなどで出てくるおなじみのマークです。今回はプログラムの処理はほとんどいじらないでほとんどの作業がデータ打ちです。取り敢えず、ホームページで住所を公開している、am/pmとスターバックスとジョナサンを表示してみましょう。スタバとジョナサンは、前に作った地図のページのデータをコンバートするので楽でしたが、am/pmを入れようとしたのが間違いでした。住所から経緯度に変換するのが大変で途中で投げ出そうと思ったくらいです。データ打ちをしている人は凄いですね。結局23区で果てました(笑)。地図ソフトはプログラムよりもデータ管理の方が大切なのが身にしみて分かりました。で、出来たのが左の画像です。ロゴマークを小さくしたのできちんと判別できるか分からないですが。何とか、数年前のカーナビくらいの表示に近づいてきました(笑)。ちなみに、青い線は神田川です。


10:町名を表示するの巻

地図2002.12. 7
 地図を表示していて何か足りないものを感じていました。そう、町名の表示です。何で気付かなかったんだろ?アホですね。地図に町名が無かったら、意味がありません。まぁ、地図マニアは町名が無くても場所が分かるので困らなかったのですが…。という事で、町名表示の追加です。これも、国土交通省のホームページにデータがあるので、ありがたく利用させていただきました。このデータは都道府県毎に番地レベルまでデータがあります。ただ、それでは今回扱うデータとしてはあまりにも巨大すぎるので、町名までにとどめておきました。ただ、町名表示の代表点が分からないので、一番最初にその町名を見付けた所を表示する基準にしてしまったので、若干位置に違和感があるかもしれないです。全部のデータの平均値の方が正しく表示されるのかもしれないですが、今回は面倒臭いのでパスです。丁目表示が漢数字なのでアラビア数字の半角に変換しました。「丁」の字がダメ文字なので正規表現できないのでEUCにしました。あと、漢数字をそのまま変換したら「六本木」が「6本木」になってしまったので(笑)、「?丁目」を変換することにしました。あとは、拡大率によって表示するデータを分けて、地図がゴチャゴチャしないようにしました。出来上がったのが左の画像です。かなり地図らしくなってきました。ただ、入手できるデータがそろそろ限界に近づいてきたので終わりも近いです。


11:iアプリに対応させるの巻

地図2002.12.20
 さて、今回は当初からの目的である、iアプリに対応させてみます。Javaで移植とは何事?という疑問はさておき。iアプリでの難関はやはりメモリの少なさです。2次メッシュではすぐにデータがオーバーフローしてしまいます。iアプリの場合、一度に通信できる量が10Kバイトいうのも大変です。一番の問題は、画面の大きさです。表示するデータを上手く添削しないとただの見難い落書きになってしまいます。とは言え、データを整理するのは並大抵の作業じゃないので、表示するデータを大まかに分けることにしました。で、完成したのが左の画像です。駅名がダブってしまうのは、データを整理しないとならないので、また今度。あと、折角の携帯なので現在地をアップロードできるようにしました。ただ、iモード端末の場合は、GPSを持っていないので自前で測位しないとなりません。日本地図の中から探すのは大変なので、オープンiエリアという近くのDoCoMoのアンテナの位置を取り込める機能を利用してある程度の場所を絞り込んで、微調整は地図で行うようにしました。ついでに、らくがき帳evolutionにも位置情報付きで書き込みを出来るようにしました。とりあえず、海ちゃんにも実験してもらったんですが、やはり表示されるデータが少ないということで場所が分かりづらいとの事でした。これは、国土交通省のデータでは限界です。他の地図データから持ってこないとダメです。と、思っていろいろ探していたら、国土地理院に「数値地図2500(空間データ基盤)の閲覧(試験公開)」という何やら使えそうなデータがあります。という事で、次回はこれをいじってみようと思います。


参考にしたページ
カシミール3D:http://www.kashmir3d.com/
国土地理院:http://www.gsi.go.jp/
国土交通省:http://www.mlit.go.jp/
am/pm:http://www.ampm.co.jp/
スターバックス:http://www.starbucks.co.jp/
ジョナサン:http://www.jonathan.co.jp/



(C)2002 Hisanori Takeuchi.All rights reserved.
当ホームページに掲載されているあらゆる内容の無許可転載、転用を禁止します。
すべての内容は日本の著作権法及び国際条約によって保護を受けています。