プロジェクト

全般

プロフィール

Proj4J

概要

公式サイト
http://trac.osgeo.org/proj4j/

Proj4Jは、地図投影変換ライブラリの定番 proj.4 をJavaへ移植したものです。
ライセンスはApache License 2.0です。

機能紹介ページ
http://tsusiatsoftware.net/proj4j/main.html

入手とビルド

2014-04現在、Proj4Jはソースファイルを公開していますが、バイナリは用意されていません 2015-02にmavenリポジトリにバイナリが公開されています。

mavenリポジトリ

mavenのProj4Jプロジェクト情報ページ
http://mvnrepository.com/artifact/org.osgeo/proj4j

バイナリファイル提供URL
http://central.maven.org/maven2/org/osgeo/proj4j/0.1.0/

ソースファイルからビルド

ソースファイルを入手し自分でビルドする方法を述べます。
ビルドした結果は本ページに添付しています。

ソースファイルはSubversionリポジトリが公開されているので、Subversionツールを使ってチェックアウトしてきます。

~$ svn co http://svn.osgeo.org/metacrs/proj4j/trunk/ proj4j

チェックアウトした内容は次のようになっています。

proj4j
  +-- pom.xml
  +-- src
        +-- build.properties
        +-- build.xml
        +-- doc
        |     +-- Proj4J Version History.html
        +-- LICENSE-2.0.txt
        +-- main
        |     +-- java
        |     |     :
        |     +-- resources
        |           :

mavenのビルド設定pom.xmlと、Antのビルド設定build.xmlの両方があります。
mavenとantどちらでもビルドできるようになっています。

ビルド(ant)

ここはやはりantでしょ、ということでantでビルドします。

proj4j$ cd src
src$ ant
    [javac] C:\Users\toru\Documents\study\javaw\gis\Proj4J\Proj4J.trunk\src\main\java\org\osgeo\proj4j\datum\GeocentricConverter.java:178: エラー: この文字は、エンコーディングMS932にマップできません
    [javac]      * "Institut f?r Erdmessung", University of Hannover, July 1988.
 :

エラーになってしまいました。ハノーバー大学(ドイツ)ということから、たぶんウムラウトなどの文字が使われていると予想し、ファイルエンコーディングをiso8859-1に指定します。
  • build.xmlの修正
    @@ -45,7 +45,8 @@
     <target name="compile" depends="prepare" 
                            description="Compiles all the java classes.">
                    <javac srcdir="main/java" 
    -                      destdir="${build-dir}/classes/src">
    +                      destdir="${build-dir}/classes/src" 
    +                      encoding="${src.encoding}">
                            <classpath>
                                    <pathelement path="src/lib" />
                            </classpath>
    
  • build.propertiesの修正
    @@ -1 +1,2 @@
     lib.version=0.1.0
    +src.encoding=iso8859-1
    

ビルド結果は、次のディレクトリに生成されます。(一部省略)

proj4j
  +-- build
        +-- classes
        +-- distro
        |     +-- bin
        |     +-- doc
        |     |     +-- javadoc
        |     |     +-- Proj4J Version History.html
        |     +-- lib
        |     |     +-- junit.jar
        |     |     +-- prop4j-0.1.0.jar
        |     |     +-- prop4j-support-0.1.0.jar
        |     +-- LICENSE-2.0.txt
        |     +-- README.html
        +-- proj4j-0.1.0.zip

build/distroの下に、実行スクリプト、Javadoc、jarファイルなどが展開されます。
これをzipに固めたものがproj4j-0.1.0.zipになります。

なお、javadocの出力が化けているので、build.xmlを修正します。

@@ -85,7 +86,9 @@
 <target name="javadoc" 
                description="Generates the JavaDoc files.">
            <javadoc packagenames="org.osgeo.proj4j.*" 
-               destdir="${distro}/doc/javadoc">
+               destdir="${distro}/doc/javadoc" 
+               encoding="${src.encoding}" 
+               docencoding="UTF-8">
                <sourcepath location="main/java"/>
            </javadoc>
        </target>

Proj4Jライブラリのセットアップ

NetBeans IDE へライブラリ設定

NetBeans IDEのライブラリにProj4Jを設定します。
[ツール]メニュー > [ライブラリ]を選択し「Antライブラリ・マネージャ」ダイアログを表示します。
[新規ライブラリ]ボタンを押し、ライブラリ名欄に"Proj4J"を記入し[OK]ボタンを押します。
[クラスパス]タブを選択し、[JAR/フォルダの追加]ボタンを押し、proj4j-0.1.0.jar を選択します。
[Javadoc]タブを選択し、[ZIP/フォルダの追加]ボタンを押し、javadocフォルダを選択します。

Proj4Jを使用するプロジェクトでライブラリにこのProj4Jを指定します。

プログラミング

投影法の定義

まず、投影前の空間座標系と投影先の空間参照系を作成します。

import org.osgeo.proj4j.CRSFactory;
import org.osgeo.proj4j.CoordinateReferenceSystem;

public class HelloProj4J {
    public static void main(String... args) {      
        CRSFactory crsFactory = new CRSFactory();

        // 投影前のWGS84地理座標系を生成
        CoordinateReferenceSystem crsWgs84 = crsFactory.createFromName("EPSG:4326");

        // 投影先の正距方位投影座標系をESRIコードを使用して生成
        CoordinateReferenceSystem crsAzEq = crsFactory.createFromName("ESRI:54032");

        // 投影先の正距方位投影座標系を名前とパラメータ定義文字列を指定して生成
        CoordinateReferenceSystem crsAzEqJ = crsFactory.createFromParameters(
            "Azimuthal_Equidistant_JPN",
            "+proj=aeqd +lat_0=35 +lon_0=135 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs");        
    }
}

CRSFactoryクラスを使って投影変換する空間座標系(地理座標系+投影座標系)を生成します。
生成には、空間座標系コード(EPSG、ESRI、WORLD、NA83、NAD27)か、空間座標系定義文字列を使用します。空間座標系コードは、Proj4Jのソースディレクトリ src/main/resources の中にある定義ファイルを使用しているようです。
正距方位投影で中心位置を指定したい場合などは、パラメータ文字列定義を指定して空間座標系を作成します。

次に、投影前、投影先の空間座標系を指定して投影変換オブジェクトを生成します。

        CoordinateTransformFactory transformFactory = new CoordinateTransformFactory();
        CoordinateTransform transform = transformFactory.createTransform(crsWgs84, crsAzEqJ);

投影元の座標値を指定して投影変換します。

        ProjCoordinate gcsPoint = new ProjCoordinate(135, 35);
        ProjCoordinate pcsPoint = new ProjCoordinate();
        pcsPoint = transform.transform(gcsPoint, pcsPoint);

空間座標系コードの利用

JARファイルの/nad ディレクトリ下に空間座標系コード定義ファイルが格納されています。

/nad
  +-- epsg
  +-- esri
  +-- nad27
  +-- nad83
  +-- world

エラーになった指定

NullPointerException発生
  • ESRI:54018 # World Winkel I
  • ESRI:54019 # World Winkel II
  • ESRI:54022 # World Quartic Authalic
  • ESRI:54023 # World Loximuthal
  • ESRI:54024 # World Bonne
他の例外
  • ESRI:54029 # World Van der Grinten I

注意事項

直接空間座標系クラスを使うと・・・

org.osgeo.proj4j.proj.EquidistantAzimuthalProjection というクラスがあったので、最初これを使ってみたところ、投影変換結果が意図と違う結果となりました。入力に緯度経度を指定し出力はメートルのはずですが、そうはなりませんでした。

このパッケージには多数の空間座標系の名前を持つクラスがありますが、同様に使うべきではなさそうです。

クリップボードから画像を追加 (サイズの上限: 1 GB)