日別アーカイブ: 08/02/2011

GPX to KML

GARMINのGPSデータフォーマット(GPX)をgoogle mapsにインポートするためにフォーマットをKMLに変換する必要があったので、プログラムを作ってみた。どちらもXML形式のファイルだが定義が違うだけ。ウェブ上でファイルをアップロードして変換してくれるサイトもあるみたいなんだけど〜。

<?php
/**
 * 使い方
 * command$ php gpx2kml.php "/Volumes/GARMIN/Garmin/GPX/Archive/Week 29-JUL-11 07.41.35.gpx"
 *
 */

// 引数(ファイル指定)がない場合はエラー
if (!isset($argv&#91;1&#93;))
  die("usage: gpx2kml.php &#91;gpx file&#93;\n");

$file = $argv&#91;1&#93;;

// ファイルが存在しない場合はエラー
if (!file_exists($file))
  die("error: can't open file.\n");

// GPSデータの読み込み
$rawFeed = file_get_contents($file);
$xml = new SimpleXmlElement($rawFeed);

// GMAPには1000までしかプロットできないので
// GPSファイルにある座標の合計から適切な
// プロット間隔を算出する
$points = 0;
foreach ($xml->trk->trkseg as $trkseg)
{
  foreach ($trkseg as $trkpt)
  {
    $points++;
  }
}

$interval = 1;
if ($points > 1000)
  $interval = intval($points/1000)+1;

// KML(GMAP用XMLファイル)の吐き出し
echo '
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Document>
    <name>Paths</name>
    <description></description>
    <Style id="yellowLineGreenPoly">
      <LineStyle>
        <color>7f00ffff</color>
        <width>4</width>
      </LineStyle>
      <PolyStyle>
        <color>7f00ff00</color>
      </PolyStyle>
    </Style>
    <Placemark>
      <name>Absolute Extruded</name>
      <description>Transparent green wall with yellow outlines</description>
      <styleUrl>#yellowLineGreenPoly</styleUrl>
      <LineString>
        <extrude>1</extrude>
        <tessellate>1</tessellate>
        <altitudeMode>absolute</altitudeMode>
        <coordinates>';

$count = 0;
foreach ($xml->trk->trkseg as $trkseg)
{
  foreach ($trkseg as $trkpt)
  {
    $count++;

    if ($count % $interval == 0)
      echo $trkpt['lon'].','.$trkpt['lat'].','.$trkpt->ele . "\n";
  }
}

echo '        </coordinates>
      </LineString>
    </Placemark>
  </Document>
</kml>';
echo "\n";

つーことで白峰三山縦走のデータを追記しておきました。