| Code Coverage | ||||||||||
| Classes and Traits | Functions and Methods | Lines | ||||||||
| Total |  | 0.00% | 0 / 1 |  | 11.11% | 1 / 9 | CRAP |  | 14.91% | 17 / 114 | 
| KML |  | 0.00% | 0 / 1 |  | 11.11% | 1 / 9 | 410.02 |  | 14.91% | 17 / 114 | 
| __construct($trackInstance = null) |  | 0.00% | 0 / 1 | 4.94 |  | 40.00% | 4 / 10 | |||
| saveHtml() |  | 0.00% | 0 / 1 | 2 |  | 0.00% | 0 / 2 | |||
| _createKmlDocument() |  | 100.00% | 1 / 1 | 1 |  | 100.00% | 13 / 13 | |||
| _getSubfolderName($folders, $index) |  | 0.00% | 0 / 1 | 6 |  | 0.00% | 0 / 5 | |||
| _getParent($parent, $folderName, $open) |  | 0.00% | 0 / 1 | 12 |  | 0.00% | 0 / 7 | |||
| _createFolder($parent, $folderName, $open = true) |  | 0.00% | 0 / 1 | 12 |  | 0.00% | 0 / 14 | |||
| addTrack($track, $tracksFolder, $toursFolder, $name = null) |  | 0.00% | 0 / 1 | 6 |  | 0.00% | 0 / 4 | |||
| _parse($tracksFolder, $toursFolder, $sequence, $name = null) |  | 0.00% | 0 / 1 | 90 |  | 0.00% | 0 / 58 | |||
| __toString() |  | 0.00% | 0 / 1 | 2 |  | 0.00% | 0 / 1 | |||
| <?php | |
| /** | |
| * | |
| */ | |
| namespace aae\geo\formats { | |
| /** | |
| * @author Axel Ancona Esselmann | |
| * @package aae\geo\formats | |
| */ | |
| class KML { | |
| protected $_dom, $_kmlDocument, $_folders; | |
| public $timeZone = 'UTC'; | |
| public function __construct($trackInstance = null) { | |
| $this->_folders = []; | |
| $this->_kmlDocument = $this->_createKmlDocument(); | |
| if (!is_null($trackInstance)) { | |
| $tracksFolder = $this->_createFolder($this->_kmlDocument, "Tracks", true); | |
| $toursFolder = $this->_createFolder($this->_kmlDocument, "Tours", true); | |
| foreach ($trackInstance as $sequence) { | |
| $this->_parse($tracksFolder, $toursFolder, $sequence); | |
| } | |
| } | |
| } | |
| public function saveHtml() { | |
| $formatted = $this->_dom->saveXML(); | |
| return $formatted; | |
| } | |
| private function _createKmlDocument() { | |
| $this->_dom = new \DOMDocument('1.0', "UTF-8"); | |
| $this->_dom->formatOutput = TRUE; | |
| $gpx = $this->_dom->createElement("kml"); | |
| $gpx->setAttribute("xmlns", "http://www.opengis.net/kml/2.2"); | |
| $gpx->setAttribute("xmlns:gx", "http://www.google.com/kml/ext/2.2"); | |
| $gpx->setAttribute("xmlns:kml", "http://www.opengis.net/kml/2.2"); | |
| $gpx->setAttribute("xmlns:atom", "http://www.w3.org/2005/Atom"); | |
| $this->_dom->appendChild($gpx); | |
| $kmlDocument = $this->_dom->createElement("Document"); | |
| $gpx->appendChild($kmlDocument); | |
| $openTag = $this->_dom->createElement("open", 1); | |
| $kmlDocument->appendChild($openTag); | |
| return $kmlDocument; | |
| } | |
| private function _getSubfolderName($folders, $index) { | |
| $result = $folders[0]; | |
| for ($i=1; $i < $index; $i++) { | |
| $result .= "\\" . $folders[$i]; | |
| } | |
| return $result; | |
| } | |
| private function _getParent($parent, $folderName, $open) { | |
| $folderNames = explode("\\", $folderName); | |
| if (count($folderNames) < 2) { | |
| return $parent; | |
| } else { | |
| $subFolderName = $this->_getSubfolderName($folderNames, count($folderNames) - 1); | |
| if (array_key_exists($subFolderName, $this->_folders)) { | |
| return $this->_folders[$subFolderName]; | |
| } else { | |
| return $this->_createFolder($parent, $subFolderName, $open); | |
| } | |
| } | |
| } | |
| private function _createFolder($parent, $folderName, $open = true) { | |
| if (!array_key_exists($folderName, $this->_folders)) { | |
| $folderNames = explode("\\", $folderName); | |
| $parent = $this->_getParent($parent, $folderName, $open); | |
| $domFolder = $this->_dom->createElement("Folder"); | |
| $parent->appendChild($domFolder); | |
| $domFolderName = $this->_dom->createElement("name", $folderNames[count($folderNames) - 1]); | |
| $domFolder->appendChild($domFolderName); | |
| if ($open) { | |
| $openTag = $this->_dom->createElement("open", 1); | |
| $domFolder->appendChild($openTag); | |
| } | |
| $this->_folders[$folderName] = $domFolder; | |
| } | |
| return $this->_folders[$folderName]; | |
| } | |
| public function addTrack($track, $tracksFolder, $toursFolder, $name = null) { | |
| foreach ($track as $sequence) { | |
| $this->_parse($tracksFolder, $toursFolder, $sequence, $name); | |
| } | |
| } | |
| protected function _parse($tracksFolder, $toursFolder, $sequence, $name = null) { | |
| // var_dump($tracksFolder); | |
| if (!array_key_exists($tracksFolder, $this->_folders)) { | |
| $this->_createFolder($this->_kmlDocument, $tracksFolder); | |
| } | |
| if (!array_key_exists($toursFolder, $this->_folders)) { | |
| $this->_createFolder($this->_kmlDocument, $toursFolder); | |
| } | |
| $tracksFolder = $this->_folders[$tracksFolder]; | |
| $toursFolder = $this->_folders[$toursFolder]; | |
| $latFormat = "%01.9f"; | |
| $lonFormat = "%01.9f"; | |
| $eleFormat = "%01.1f"; | |
| $timeFormat = "Y-m-d\TH:i:s\Z"; | |
| if (get_class($sequence) == 'aae\math\geospatial\Sequence') { | |
| if (is_null($name)) { | |
| $name = $sequence->name; | |
| } | |
| $trackPlacemark = $this->_dom->createElement("Placemark"); | |
| $tracksFolder->appendChild($trackPlacemark); | |
| $trackName = $this->_dom->createElement("name", $name); | |
| $trackPlacemark->appendChild($trackName); | |
| $visibilityTag = $this->_dom->createElement("visibility", 1); | |
| $trackPlacemark->appendChild($visibilityTag); | |
| $lineStringTag = $this->_dom->createElement("LineString"); | |
| $trackPlacemark->appendChild($lineStringTag); | |
| $tessellateTag = $this->_dom->createElement("tessellate", 1); | |
| $lineStringTag->appendChild($tessellateTag); | |
| $trackSegmentString = ""; | |
| foreach ($sequence as $trackPoint) { | |
| $trackSegmentString .= strval($trackPoint->lon).",".strval($trackPoint->lat).",".strval($trackPoint->ele)." "; | |
| } | |
| $trackSegment = $this->_dom->createElement("coordinates", $trackSegmentString); | |
| $lineStringTag->appendChild($trackSegment); | |
| // Tours folder | |
| $tourPlacemark = $this->_dom->createElement("Placemark"); | |
| $toursFolder->appendChild($tourPlacemark); | |
| $tourName = $this->_dom->createElement("name", $name); | |
| $tourPlacemark->appendChild($tourName); | |
| $visibilityTag = $this->_dom->createElement("visibility", 1); | |
| $tourPlacemark->appendChild($visibilityTag); | |
| $gxTrackTag = $this->_dom->createElement("gx:Track"); | |
| $tourPlacemark->appendChild($gxTrackTag); | |
| $time = new \DateTime(); | |
| $time->setTimezone(new \DateTimeZone($this->timeZone)); | |
| foreach ($sequence as $trackPoint) { | |
| $time->setTimestamp($trackPoint->time); | |
| $trackTime = $this->_dom->createElement("time", $time->format($timeFormat)); | |
| $whereTag = $this->_dom->createElement("when", $time->format($timeFormat)); | |
| $gxTrackTag->appendChild($whereTag); | |
| } | |
| foreach ($sequence as $trackPoint) { | |
| $whereTag = $this->_dom->createElement("gx:coord", strval($trackPoint->lon).",".strval($trackPoint->lat).",".strval($trackPoint->ele)); | |
| $gxTrackTag->appendChild($whereTag); | |
| } | |
| } else { | |
| echo "\n!!!!!!!!!!!!!!".get_class($sequence)."\n"; | |
| foreach ($sequence as $s) { | |
| $this->_parse($tracksFolder, $toursFolder, $s); | |
| } | |
| } | |
| } | |
| public function __toString() { | |
| return $this->saveHtml(); | |
| } | |
| } | |
| } |