3Dモデルの中をCurlで歩いてみよう
連載インデックスへ

第3回 Curlで読み込んで理解するKMZ/KMLの中身


株式会社ベーシック
尾松秀紀
2009/6/12
3Dモデルを簡単に作れるGoogle SketchUpで家を建て、その中をCurl 3D Galleryで歩き、3Dプログラミングを学ぶ連載です

Google SketchUpをCurlアプリで読み込もう

- PR -

 もう、連載はなくなったのかと思わせるほどの間が空いてしまいましたが、連載の3回目をお送りします。前回の「3Dモデリング建築内を歩けるCurl 3D Galleryとは?」では、Curl開発環境のセットアップから、第1回の「3Dモデルを簡単に作れるGoogle SketchUp超入門」で作成したモデルデータを読み込んで、取りあえず、開発環境ができるところまでをお伝えしました。

 今回からは「Curl 3D Gallery」の内部処理のお話に入っていきます。今回の内容は、Google SketchUp(以下、SketchUp)データの読み込みということで、次の2点についてお送りします。

  • SketchUpファイル(XML形式ファイル)の読み込み
  • 読み込んだモデルデータを扱いやすい内容に加工する

 Curl自体の詳細を知りたい方は、記事「いまさら聞けない「Curl」入門(お菓子じゃない方)」を参照しておいてください。

SketchUpファイル(kmz)の中身はどうなっている?

 前回では、さらりと流していましたが、今回取り扱うファイルは、SketchUpでエクスポートした「Google Earth(*.kmz)」*1という形式です。

*1:「Google Earth 4(*.kmz)」というエクスポート形式もありますが、こちらはバージョンが異なり内部構造もまったく違うので、間違えないようにお願いします

 kmz形式のファイルは、ZIP形式で圧縮されたファイルとなっています。拡張子を.zipに変えて、お手持ちの解凍ツールで展開してみてください。「doc.kml」というファイルが展開されたと思います。このdoc.kmlファイルが、今回読み込む対象となるモデルデータになります。

 kmlファイルの仕様については、グーグルのサイトで、リファレンスやチュートリアルを参照できます。今回のkmzファイルはkmlのバージョン2.0ですが、内容の把握には問題はありません。

 「Curl 3D Gallery」にて取り扱う主要な部分の構造は、以下のようになっています。

<Document>
<DocumentOrigin> 原点座標
<coordinates> 座標情報
<Style id="Edges"> スタイル情報
<LineStyle> 境界線色
<color>ff000000</color>
<PolyStyle> ポリゴン色、線の幅
<outline>0</outline>
<fill>1</fill>
<color>ffffffff</color>
<Placemark> 面情報
<styleUrl>#Wood_Board_Cork</styleUrl> 面のスタイル参照情報
<GeometryCollection> 形状要素のコンテナ
<Polygon> ポリゴン
<outerBoundaryIs> ポリゴン
<LinearRing>
<coordinates> 座標情報
<innerBoundaryIs> ポリゴン内部(くり抜き)
<LinearRing>
<coordinates> 座標情報
<Placemark> 面情報
<GeometryCollection>
<LineString> ポリゴン輪郭線
<coordinates>

 今回のkmzファイルでは、座標情報、および、色情報のみで、SketchUpで張り付けたイメージファイルは、含まれていません*2。イメージ情報は、Placemarkタグ内のstyleUrlタグにポリゴン情報の色情報が格納されているのですが、そのstyleUrlのID名称がイメージファイル名となっています。

*2:「Google Earth 4(*.kmz)」では、doc.kmlは位置情報のみであり、モデル情報は「models\xxxxx.dae」というファイルに収められています。「COLLADA」という3Dモデルデータフォーマット形式で、イメージファイルも含まれ、より再現性の高い情報が提供されています

 今回は、別途SketchUpからイメージ情報を取り出し、ファイル化して使用するようにしています*3。また、座標情報はkml形式であるため、緯度や経度で格納されています。後述するXYZ軸の直交座標系にするための変換処理が必要となります。

*3:イメージのファイル化に関しては、Curl Developer Centerの「Google SketchUpから Curl 3D Galleryへファイルを読み込む方法」記事の最後に、「もっときれいに再現するために」という部分に記述されています

 styleUrlのID名称は、ファイル化されたイメージファイル名と一致しない場合があるので、その際はイメージファイル名をstyleUrlのID名称に変更する必要があります。なお、各タグの詳細やkmlの構造などについては、kmlのリファレンスを参照願います。

 次は、CurlでのXMLファイルの扱い方を説明します。

CurlでXMLを扱うSAXインターフェイス

 Curlには、標準でSAX(Simple API for XML)インターフェイスが実装されており、手軽にXMLパーサーを開発できます。CurlのSAX実装は、Java SAX 2.0 APIをCurl言語にマッピングしており、メソッド名こそ、Curl言語の命名規則となっていますが、クラス名はJava SAXのクラス名と同じです。Javaでのプログラミング経験があれば、抵抗なく理解できるでしょう。

 なおSAXについては、以下の記事参照してください。

 それでは、「Curl 3D Gallery」での実装例に沿って、XMLデータの読み込み処理を説明していきます。スペースの都合上、詳細の処理は割愛しますが、実装ソースやキーワードとなる主な情報を記述しておくので、Curlヘルプドキュメントの「SAX XML インターフェイスの使用」「DefaultHandler(クラス)」や後述する参照URLなどの情報を参照すれば、より深く理解できます。

 XMLデータの読み込みは、MODEL\ObjectManager.scurlファイルのread-model-from-fileメソッドで行っています。

    || データの生成
    let parser:SAXParser = {SAXParser}
    let handler:GeometryHandler = {GeometryHandler}
    {parser.set-content-handler handler}
    
    || KMLデータの読み込み
    {parser.parse
        {InputSource character-stream = {read-open file-url}}
    }

 XMLファイルの内部処理は、DefaultHandlerを継承したGeometryHandlerクラスで行っています。GeometryHandlerクラスは、KML\kml-parser.scurlに実装されています。GeometryHandlerクラスでは、以下の5つのXML構造分析イベントに対するメソッドを実装しています。

  • start-document:ドキュメントの開始
  • end-document:ドキュメントの終了
  • start-element:タグ要素の開始
  • end-element:タグ要素の終了
  • characters:文字データ

 ここで重要なのは、start-element(タグ要素の開始)、end-element(タグ要素の終了)、characters(文字データ)の3つのメソッドです。SAXではXML文書を解析しながら、タグ要素の開始、タグ要素の終了、文字データといったイベントを発生させ、実装したメソッドが呼び出されるようになっています。以下にメソッドの引数を説明します。

public  {DefaultHandler.start-element
    namespace-URI:String,       名前空間 URI
    local-name:String,          ローカル名(プレフィックスなし)
    q-name:String,              タグ名(プレフィックス付き)
    attributes:Attributes       要素に所属している属性
}:void 
 
public  {DefaultHandler.end-element
    namespace-URI:String,       名前空間 URI
    local-name:String,          ローカル名(プレフィックスなし)
    q-name:String               タグ名(プレフィックス付き)
}:void 
 
public  {DefaultHandler.characters
    ch:StringBuf,               XML ドキュメント文字
    start:int,                  配列内の開始位置
    length:int                  配列から読み取る文字数
}:void 

 各メソッドでは、どの要素の開始なのか、どの要素の終了なのかなどを判断しながら、XML文章をデータ化し、GeometryHandlerクラスに蓄えていきます。各タグ要素情報のクラスは、KML\kml-objects.scurlに実装されています。

 例えば、引数の内容のみをデバッグ表示するようなクラスを生成して実装してみると、どのようなタイミングでメソッドが呼び出されるのかを把握できると思います。

 次ページでは、実際に読み込んだKMLデータをCurlで扱うためのコツを教えます。図形パズルが好きな方はぜひ読んでみてください。

1-2

 INDEX
3Dモデルの中をCurlで歩いてみよう(3)
Curlで読み込んで理解するKMZ/KMLの中身
Page1
Google SketchUpをCurlアプリで読み込もう
SketchUpファイル(kmz)の中身はどうなっている?
CurlでXMLを扱うSAXインターフェイス
  Page2
読み込んだKMLデータをCurlで扱うには?
難しい場合はデバッグ情報を見てみよう



リッチクライアント&帳票 全記事一覧へ

TechTargetジャパン

リッチクライアント & 帳票 フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH