KML (Keyhole Markup Language) は Google Earth などで使われている位置情報(緯度・経度など)を扱うXMLフォーマット。
この KML を Java で操作したいと思って探してみたところ Java API for KML (JAK) というライブラリが良さそうなので試しているところ。

Java API for KML (JAK)

- JAK Home
- javaapiforkml - Project Hosting on Google Code

いまのところ配布されているのは "091130" というバージョン1種類のみ。
ライブラリとして使えるJARファイル(JavaAPIforKml.jar)と、
ソースコードの入ったJARファイル(JavaAPIforKml-sources.jar)の
2ファイルがダウンロードできる。
Downloads - javaapiforkml - Project Hosting on Google Code

なぜかWeb上で見れるjavadocが用意されていないので自前で生成しておいた(プロジェクトのサイトを見るとTODOリストには上がっているようだけど……)。
Java API for KML (JAK) 091130

javadocによるAPIリファレンス生成

環境によってはなぜかindex.htmlなどの一部ファイルが生成されなかった。原因はよくわからない。Windows XP や Linux のどちらのOSでもうまく生成できる環境とできない環境があった。

今回は Debian Lenny で作業を開始したが、


$ wget http://javaapiforkml.googlecode.com/files/JavaAPIforKml-sources.jar
$ jar xf ./JavaAPIforKml-sources.jar
$ ls
JavaAPIforKml-sources.jar  META-INF  de  exampledata  log4j.properties  schema
$ mkdir src
$ mv ./de ./src

javadocコマンドでindex.htmlなどの一部ファイルが生成されなかった。
そのためjavadocコマンドはWindows XP上で実行した。

OS: Windows XP SP3
JDKのバージョン: 1.6.0_13


C:\jak>java -version
java version "1.6.0_13"
Java(TM) SE Runtime Environment (build 1.6.0_13-b03)
Java HotSpot(TM) Client VM (build 11.3-b02, mixed mode, sharing)

以下の内容の configure.bat というファイルを作って実行。


set JAVA_HOME=C:\java\jdk1.6.0_13
set PATH=C:\java\jdk1.6.0_13\bin;%PATH%

以下の内容の makedoc.bat というファイルを作る。


javadoc -locale "en_US" -docencoding "ISO-8859-1" -encoding "ISO-8859-1" -d doc -sourcepath src -subpackages de -doctitle "Java API for KML (JAK) 091130" -windowtitle "Java API for KML (JAK) 091130"

javadoc - Java API ドキュメントジェネレータ によると、-locale をすべてのオプションより前(左側)に指定しろと書いてある。

makedoc.bat を実行して、標準出力と標準エラー出力をファイル a.txt へリダイレクト。

なぜか一回目の実行では期待した通りの文字コードで出力されない。
1度目の実行後、そのまま2度目を実行するときちんと期待したとおりの文字コードで出力される。
原因不明。
先に出力先のdocディレクトリを作ってあるといいのか、それともファイルがすでにあるところへ上書きしているのがいいのか、ぜんぜんわからない。うーむ。


C:\jak>makedoc.bat > a.txt 2>&1

以下、一度目の javadoc コマンド実行時のログ(一部省略)。


C:\jak>javadoc -locale "en_US" -docencoding "ISO-8859-1" -encoding "ISO-8859-1" -d doc -sourcepath src -subpackages de -doctitle "Java API for KML (JAK) 091130" -windowtitle "Java API for KML (JAK) 091130" 
宛先ディレクトリの作成中: "doc\"
Loading source files for package de.micromata.opengis.kml.v_2_2_0...
Loading source files for package de.micromata.opengis.kml.v_2_2_0.annotations...
Loading source files for package de.micromata.opengis.kml.v_2_2_0.atom...
Loading source files for package de.micromata.opengis.kml.v_2_2_0.gx...
Loading source files for package de.micromata.opengis.kml.v_2_2_0.xal...
Constructing Javadoc information...
C:\jak\src\de\micromata\opengis\kml\v_2_2_0\Kml.java:39: パッケージ com.sun.istack は存在しません。
import com.sun.istack.NotNull;
                     ^
C:\jak\src\de\micromata\opengis\kml\v_2_2_0\Kml.java:40: パッケージ com.sun.xml.bind.marshaller は存在しません。
import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
                                  ^
C:\jak\src\de\micromata\opengis\kml\v_2_2_0\Kml.java:945: シンボルを見つけられません。
シンボル: クラス NamespacePrefixMapper
場所    : de.micromata.opengis.kml.v_2_2_0.Kml の クラス
        extends NamespacePrefixMapper
                ^
C:\jak\src\de\micromata\opengis\kml\v_2_2_0\Kml.java:763: シンボルを見つけられません。
シンボル: クラス NotNull
場所    : de.micromata.opengis.kml.v_2_2_0.Kml の クラス
        @NotNull
         ^
C:\jak\src\de\micromata\opengis\kml\v_2_2_0\Kml.java:892: シンボルを見つけられません。
シンボル: クラス NotNull
場所    : de.micromata.opengis.kml.v_2_2_0.Kml の クラス
        @NotNull
         ^
標準 Doclet バージョン 1.6.0_13
全パッケージとクラスの階層ツリーを作成しています...
doc\de/micromata/opengis/kml/v_2_2_0/\AbstractLatLonBox.html の生成
C:\jak\src\de\micromata\opengis\kml\v_2_2_0\AbstractLatLonBox.java:437: warning - Tag @see:illegal character: "60" in "#setAbstractLatLonBoxObjectExtension(List<AbstractObject>)"
C:\jak\src\de\micromata\opengis\kml\v_2_2_0\AbstractLatLonBox.java:437: warning - Tag @see:illegal character: "62" in "#setAbstractLatLonBoxObjectExtension(List<AbstractObject>)"
C:\jak\src\de\micromata\opengis\kml\v_2_2_0\AbstractLatLonBox.java:437: warning - Tag @see: can't find setAbstractLatLonBoxObjectExtension(List<AbstractObject>) in de.micromata.opengis.kml.v_2_2_0.AbstractLatLonBox
(中略)
C:\jak\src\de\micromata\opengis\kml\v_2_2_0\Kml.java:719: warning - タグ @link: 参照が見つかりません: http://code.google.com/p/javaapiforkml/issues/detail?id=7
java.lang.ClassCastException: com.sun.tools.javadoc.ClassDocImpl cannot be cast to com.sun.javadoc.AnnotationTypeDoc
	at com.sun.tools.javadoc.AnnotationDescImpl.annotationType(AnnotationDescImpl.java:46)
	at com.sun.tools.doclets.formats.html.HtmlDocletWriter.getAnnotations(HtmlDocletWriter.java:1739)
	at com.sun.tools.doclets.formats.html.HtmlDocletWriter.writeAnnotationInfo(HtmlDocletWriter.java:1713)
	at com.sun.tools.doclets.formats.html.HtmlDocletWriter.writeAnnotationInfo(HtmlDocletWriter.java:1692)
	at com.sun.tools.doclets.formats.html.AbstractExecutableMemberWriter.writeParameters(AbstractExecutableMemberWriter.java:117)
	at com.sun.tools.doclets.formats.html.AbstractExecutableMemberWriter.writeParameters(AbstractExecutableMemberWriter.java:100)
	at com.sun.tools.doclets.formats.html.MethodWriterImpl.writeSignature(MethodWriterImpl.java:154)
	at com.sun.tools.doclets.internal.toolkit.builders.MethodBuilder.buildSignature(MethodBuilder.java:176)
	at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.tools.doclets.internal.toolkit.builders.MethodBuilder.invokeMethod(MethodBuilder.java:109)
	at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.build(AbstractBuilder.java:90)
	at com.sun.tools.doclets.internal.toolkit.builders.AbstractMemberBuilder.build(AbstractMemberBuilder.java:56)
	at com.sun.tools.doclets.internal.toolkit.builders.MethodBuilder.buildMethodDoc(MethodBuilder.java:150)
	at sun.reflect.GeneratedMethodAccessor47.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.tools.doclets.internal.toolkit.builders.MethodBuilder.invokeMethod(MethodBuilder.java:109)
	at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.build(AbstractBuilder.java:90)
	at com.sun.tools.doclets.internal.toolkit.builders.AbstractMemberBuilder.build(AbstractMemberBuilder.java:56)
	at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.buildMethodDetails(ClassBuilder.java:322)
	at sun.reflect.GeneratedMethodAccessor45.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.invokeMethod(ClassBuilder.java:101)
	at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.build(AbstractBuilder.java:90)
	at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.buildClassDoc(ClassBuilder.java:124)
	at sun.reflect.GeneratedMethodAccessor13.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.invokeMethod(ClassBuilder.java:101)
	at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.build(AbstractBuilder.java:90)
	at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.build(ClassBuilder.java:108)
	at com.sun.tools.doclets.formats.html.HtmlDoclet.generateClassFiles(HtmlDoclet.java:155)
	at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.generateClassFiles(AbstractDoclet.java:164)
	at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.startGeneration(AbstractDoclet.java:106)
	at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.start(AbstractDoclet.java:64)
	at com.sun.tools.doclets.formats.html.HtmlDoclet.start(HtmlDoclet.java:42)
	at com.sun.tools.doclets.standard.Standard.start(Standard.java:23)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.tools.javadoc.DocletInvoker.invoke(DocletInvoker.java:269)
	at com.sun.tools.javadoc.DocletInvoker.start(DocletInvoker.java:143)
	at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:340)
	at com.sun.tools.javadoc.Start.begin(Start.java:128)
	at com.sun.tools.javadoc.Main.execute(Main.java:41)
	at com.sun.tools.javadoc.Main.main(Main.java:31)
(中略)
doc\overview-frame.html の生成
doc\de/micromata/opengis/kml/v_2_2_0/\package-frame.html の生成
doc\de/micromata/opengis/kml/v_2_2_0/\package-summary.html の生成
doc\de/micromata/opengis/kml/v_2_2_0/\package-tree.html の生成
doc\de/micromata/opengis/kml/v_2_2_0/annotations/\package-frame.html の生成
doc\de/micromata/opengis/kml/v_2_2_0/annotations/\package-summary.html の生成
doc\de/micromata/opengis/kml/v_2_2_0/annotations/\package-tree.html の生成
doc\de/micromata/opengis/kml/v_2_2_0/atom/\package-frame.html の生成
doc\de/micromata/opengis/kml/v_2_2_0/atom/\package-summary.html の生成
doc\de/micromata/opengis/kml/v_2_2_0/atom/\package-tree.html の生成
doc\de/micromata/opengis/kml/v_2_2_0/gx/\package-frame.html の生成
doc\de/micromata/opengis/kml/v_2_2_0/gx/\package-summary.html の生成
doc\de/micromata/opengis/kml/v_2_2_0/gx/\package-tree.html の生成
doc\de/micromata/opengis/kml/v_2_2_0/xal/\package-frame.html の生成
doc\de/micromata/opengis/kml/v_2_2_0/xal/\package-summary.html の生成
doc\de/micromata/opengis/kml/v_2_2_0/xal/\package-tree.html の生成
doc\constant-values.html の生成
全パッケージとクラスのインデックスを作成しています...
doc\overview-tree.html の生成
doc\index-all.html の生成
C:\jak\src\de\micromata\opengis\kml\v_2_2_0\gx\LatLonQuad.java:262: warning - @code> は未知のタグです。
C:\jak\src\de\micromata\opengis\kml\v_2_2_0\LinearRing.java:658: warning - @code> は未知のタグです。
C:\jak\src\de\micromata\opengis\kml\v_2_2_0\LineString.java:653: warning - @code> は未知のタグです。
C:\jak\src\de\micromata\opengis\kml\v_2_2_0\Point.java:582: warning - @code> は未知のタグです。
doc\deprecated-list.html の生成
全クラスのインデックスを作成しています...
doc\allclasses-frame.html の生成
doc\allclasses-noframe.html の生成
doc\index.html の生成
doc\overview-summary.html の生成
doc\help-doc.html の生成
doc\stylesheet.css の生成
2338 warnings

他のKML操作ライブラリ

libkml
GoogleによるC++用KML操作ライブラリ。
SWIGによるバインディングを使ってJavaから使うことが可能。
libkml - Project Hosting on Google Code

KML Java Framework
"This project was registered on SourceForge.net on Apr 13, 2007" とあるけどダウンロードできるファイルが1つも無い。。。
SourceForge.net: KML Java Framework - Project Web Hosting - Open Source Software

参考資料など

- KML | OGC
- KML 入門用ドキュメント - KML - Google Code
- JAK Home
- javaapiforkml - Project Hosting on Google Code
- Java API for KML (JAK) 091130 (javadocによるAPIリファレンス)

tags: zlashdot Java Java KML

Posted by NI-Lab. (@nilab)