<?php
class GpxParser{
public function parse($file){
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}
$contents = fread($fp, filesize($file));
$p = xml_parser_create();
$res = xml_parse_into_struct($p, $contents, $values, $tags);
if ($res == 0)
die("Couldn't parse ".$file);
xml_parser_free($p);
$wpArr = array();
$trkArr = array();
foreach($tags as $key=>$tagIdxes){
if($key=='WPT'){
$wpArr = $this->createWPT($tagIdxes, $values);
}
elseif($key=='TRK'){
$trkArr = $this->createTracks($tagIdxes, $values);
}
}
$res = array();
$res["WPT"] = $wpArr;
$res["TRK"] = $trkArr;
return $res;
}
private function createTracks($tagIdxes, $values){
$trackArr = array();
foreach($tagIdxes as $idx){
$tag = $values[$idx];
if( $tag["type"] == 'open' ){
$segmentArr = $this->createTrack($idx + 1, $values);
$trackArr[] = $segmentArr;
}
}
return $trackArr;
}
private function createTrack($startIdx, $values){
$segmentArr = array();
for($i = $startIdx; ;$i++){
$tag = $values[$i];
if( $tag["type"] == 'open' && $tag["tag"] == 'TRKSEG'){
$segmentArr[] = $this->createTrackSegment($i+1, $values);
}
elseif( $tag["type"] == 'close' && $tag["tag"] == 'TRK'){
break;
}
}
return $segmentArr;
}
private function createTrackSegment($startIdx, $values){
$trackPoints = array();
for($i = $startIdx; ; $i++){
$tag = $values[$i];
if( $tag["tag"] == 'TRKPT' && is_array($tag["attributes"]) ){
$lat = $tag["attributes"]["LAT"];
$lng = $tag["attributes"]["LON"];
$trackPoints[] = array("LAT"=>$lat, "LNG"=>$lng);
}
elseif( $tag["type"] == 'close' && $tag["tag"] == 'TRKSEG'){
break;
}
}
return $trackPoints;
}
private function createWPT($tagIdxes, $values){
$latLngArr = array();
foreach($tagIdxes as $idx){
$tag = $values[$idx];
if($tag["type"] == 'open'){
if( is_array($tag["attributes"])){
$lat = $tag["attributes"]["LAT"];
$lng = $tag["attributes"]["LON"];
$latLngArr[] = array("LAT"=>$lat, "LNG"=>$lng);
}
}
}
return $latLngArr;
}
}
?>