2011年11月26日

KML ファイルを作成する

ちょっと、CSV のデータから KML ファイルを作成してみます。

CSV ファイルから KML に変換するスクリプト

Python でスクリプトを書いておきます。

KML ファイルのテンプレートを用意する

Jinja2 を使ったテンプレートだと次のように記述できます。 名前と緯度経度が必須で、説明文がある場合はそれも出力します。

TEMPLATE = u"""<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">

{% for point in points %}
  <Placemark>
    <name>{{ point.name }}</name>
    {% if point.description %}
    <description>{{ point.description }}</description>
    {% endif %}
    <Point>
      <coordinates>{{ point.longitude }},{{ point.latitude }}</coordinates>
    </Point>
  </Placemark>
{% endfor %}

</kml>"""


CSV ファイルを読み込む

次のフォーマットの CSV ファイルについて考えます。 1行目はヘッダー行で固定とし、2行目以降に同じ並びでデータが続きます。

name,longitude,latitude,description
国立霞ヶ丘競技場,139.714941,35.678160,naash.go.jp

... 同じ形式でデータが続く ...

簡単のために、区切り文字以外にカンマは存在しない、と仮定しておくと、 次のようなコードで処理できます。

    def process(self, reader):
        header = reader.next().strip().split(',')
        points = []
        for line in reader:
            r = line.strip()
            if not r:
                continue
            row = r.split(',')
            data = dict(zip(header, row))
            points.append(data)
        self.rederer.render(points)

エクセルの CSV と互換性がないとか、ダブルクォートの処理がどうのという話もありますが、 CSV ファイルを真面目に扱うと奥が深いのでやめておきます。

ファイルにまとめる

引数処理や入出力のエンコーディング処理を追加して、ファイルにまとめておきます。

入力ファイル

$ cat sample.csv
name,longitude,latitude,description
国立霞ヶ丘競技場,139.714941,35.678160,naash.go.jp

実行結果

$ python csv2kml.py sample.csv
INFO:root:Start processing: sample.csv
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">

  <Placemark>
    <name>国立霞ヶ丘競技場</name>

    <description>naash.go.jp</description>

    <Point>
      <coordinates>139.714941,35.678160</coordinates>
    </Point>
  </Placemark>

</kml>
INFO:root:End processing: sample.csv

ヘルプ表示

$ python csv2kml.py -h
Usage: python csv2kml.py [options] file1 [file2 [ ... ]]

Convert CSV file into KML format.
See KML Tutorial
<http://code.google.com/intl/ja/apis/kml/documentation/kml_tut.html>

Input file must contain following header line:

    name,longitude,latitude,description


Options:
  -h, --help            show this help message and exit
  -f FILE, --file=FILE  setting file
  -o FILE, --out=FILE   output file
  --basedir=BASEDIR     base directory
  --input-encoding=ENC_IN
                        encoding of input source
  --output-encoding=ENC_OUT
                        encoding of output destination
  -v, --verbose         verbose mode
  -q, --quiet           quiet mode

Google Maps で読み込む

Google Maps には、ローカルファイルシステムから KML をアップロードする方法と、 任意の URL のファイルを読み込む方法が用意されています。 Dropbox のパブリックフォルダなどに KML を置くことで、URL から読み取れるようになります。

終わりに

CSV のデータから KML ファイルを作成しました。 Google Maps と Google Earth は KML を読み取って地点情報などを表示できます。 何となく地球の地点情報を火星にマッピングしてみると楽しいかもしれません。 まぁ、誰得な話でもでもありませんが。。

KML には Google の拡張もあり、Google Earth ではツアー機能もありますので、 気が向いたら使ってみようかなぁ、と思いました。

あと、Google Earth で緯度経度表示の単位を変更するには、 設定画面から選択できるようです。 度分秒からの表示を変更したい場合に便利です。

追記:KML で複数の地点を含めるために Document 要素を追加。
コメントを投稿