torutkのブログ

ソフトウェア・エンジニアのブログ

シェープファイル形式の地図データを読んでJavaFXで描画する

電子地図データの形式としてよく使われるシェープファイル形式(ベクターデータ)の地図データを読み込んで、投影変換をしてJavaFXで描画するという流れを確認するサンプルプログラムを作成しました。

JavaFXとベクター地図表示 - ソフトウェアエンジニアリング - Torutk

サンプルプログラムは、Java SE 8、NetBeans IDE 8.0、SceneBuilder 2.0 b14で作成しました。ビルドスクリプトNetBeans IDEの生成したAntです。使用するライブラリは、NetBeansのAntライブラリ管理機能で登録したものを参照する設定です。

このサンプルで取り組んだ課題は

です。

現時点の制約は、

とおおよそ地図表示アプリには程遠いものです。

地図データ(シェープファイル)の読み込み

地理情報システム(GIS)の分野では、いろいろなGISツールで使用する地図データ(ベクター形式)のファイルフォーマットとしてシェープファイルがわりと使われます。フォーマットは仕様化され公開されています。
シェープファイルについて | ESRIジャパン

ただ、一から読み込み処理を作るのは大変なので、Java用のオープンソースライブラリを使うのがよさそうです。

GeoTools、OpenMapは表示機能まで持つ大きなライブラリです。Java Esri Shapefile Readerは、シェープファイル(のうち.shpファイル)を読むだけに特化したライブラリです。今回はシェープファイルだけ読むJava Esri Shapefile Readerを使うことにしました。

地図投影変換

地図は、回転楕円体である地球表面の地理的情報を平面に写したものです。
一般に地図データは地球表面上の場所を示す地理座標系で緯度経度で表現されています。これを、地図使用目的に応じた投影法(メルカトルとかランベルト正角円錐とか)によって平面XY座標系に写します。

先に紹介したGeoToolsには投影変換の機能も含まれていますが、たまたま使用したかった正距方位図法がサポートされておらず、他を探してみたところ、投影変換では昔から定番のオープンソースライブラリ(C言語用)Proj4のJava移植版がありました。

投影座標系ー画面座標系変換

地図投影変換によって、地理座標系(緯度経度)で表現された地図データを平面XY座標にすることができました。次は、平面XY座標系の図形をJavaFXで作るGUI画面に描画します。ここで、地図の表示プログラムには通常拡大縮小、スクロールが必要になります。これは、平面XY座標系とアフィン変換とをJavaFXに与えて描画させることにほかなりません。この課題は、別途取り組んでいましたのでその結果を取り込んでいます。

CanvasでAffine変換で大いにはまる(数学的センスが足りなかった・・・) - torutkの日記