protected function handleStartElement($name, $attribs) { switch ($name) { case 'DOCUMENT': $this->elementStack[] = new KMLDocument($name, $attribs); break; case 'FOLDER': $parent = end($this->elementStack); $folder = new KMLFolder($name, $attribs); $this->elementStack[] = $folder; // we need to do this before the element is completed // since this info needs to be available for nested children if ($parent instanceof KMLFolder) { $parentCategory = $parent->getId(); $newFolderIndex = count($parent->getChildCategories()); } else { $parentCategory = $this->dataController->getCategoryId(); $newFolderIndex = count($this->items); } $folder->setId(substr(md5($parentCategory . $newFolderIndex), 0, strlen($parentCategory) - 1)); // something unique break; case 'STYLE': $this->elementStack[] = new KMLStyle($name, $attribs); break; case 'STYLEMAP': $style = new KMLStyle($name, $attribs); $style->setStyleContainer($this); $this->elementStack[] = $style; break; case 'PLACEMARK': $placemark = new KMLPlacemark($name, $attribs); $parent = end($this->elementStack); $placemark->addCategoryId($this->dataController->getCategoryId()); if ($parent instanceof KMLFolder) { $placemark->addCategoryId($parent->getId()); } $this->elementStack[] = $placemark; break; case 'POINT': $this->elementStack[] = new KMLPoint($name, $attribs); break; case 'LINESTRING': $this->elementStack[] = new KMLLineString($name, $attribs); break; case 'LINEARRING': $this->elementStack[] = new KMLLinearRing($name, $attribs); break; case 'POLYGON': $this->elementStack[] = new KMLPolygon($name, $attribs); break; } }
public function parseKML($kml, $kmlId) { $doc = new DOMDocument("1.0"); $doc->preserveWhiteSpace = false; $doc->loadXML($kml); /* * Get geometry information only, store it in placemarkArray */ $placemarkTagArray = $doc->getElementsByTagName("Placemark"); if (count($placemarkTagArray) > 0) { $id = 0; foreach ($placemarkTagArray as $node) { $geometryArray = $this->getGeometryArrayFromPlacemarkOrMultigeometryNode($node); $metadataArray = $this->getMetadataFromPlacemarkNode($node); /* * For a placemark, the geometryArray should only contain 1 geometry! */ for ($i = 0; $i < count($geometryArray); $i++) { $currentPlacemark = new KMLPlacemark($geometryArray[$i]); foreach ($metadataArray as $key => $value) { $currentPlacemark->setProperty($key, $value); } $currentPlacemark->setProperty("Mapbender:kml", true); $currentPlacemark->setProperty("Mapbender:name", "unknown"); $currentPlacemark->setProperty("Mapbender:id", $kmlId); $currentPlacemark->setProperty("Mapbender:placemarkId", $id); // add description and name: $namesNode = $node->getElementsByTagName('name'); if ($namesNode->length > 0) { $name = $namesNode->item(0)->nodeValue; } $descriptionsNode = $node->getElementsByTagName('description'); if ($descriptionsNode->length > 0) { $description = $descriptionsNode->item(0)->nodeValue; } $currentPlacemark->setProperty("name", $name); $currentPlacemark->setProperty("description", $description); array_push($this->placemarkArray, $currentPlacemark); } $id++; } } else { $e = new mb_exception("class_kml.php: KMLOWSParser: No placemarks found in KML."); return false; } return true; }
protected function handleStartElement($name, $attribs) { switch ($name) { case 'DOCUMENT': $this->elementStack[] = new KMLDocument($name, $attribs); break; case 'FOLDER': $folder = new KMLFolder($name, $attribs); $parent = end($this->elementStack); // we need to do this before the element is completed // since this info needs to be available for nested children if ($parent instanceof KMLFolder) { $newFolderIndex = count($parent->getListItems()); $categoryPath = $parent->getCategory(); } elseif ($parent instanceof KMLDocument) { // child of root element $newFolderIndex = count($this->items); $categoryPath = $this->category; } $categoryPath[] = $newFolderIndex; $folder->setIndex($newFolderIndex); $folder->setCategory($categoryPath); $this->elementStack[] = $folder; break; case 'STYLE': $this->elementStack[] = new KMLStyle($name, $attribs); break; case 'STYLEMAP': $style = new KMLStyle($name, $attribs); $style->setStyleContainer($this); $this->elementStack[] = $style; break; case 'PLACEMARK': $placemark = new KMLPlacemark($name, $attribs); $parent = end($this->elementStack); if (!($parent instanceof KMLFolder)) { // child of root element $placemark->setCategory($this->category); } $this->elementStack[] = $placemark; break; case 'POINT': $this->elementStack[] = new KMLPoint($name, $attribs); break; case 'LINESTRING': $this->elementStack[] = new KMLLineString($name, $attribs); break; case 'LINEARRING': $this->elementStack[] = new KMLLinearRing($name, $attribs); break; case 'POLYGON': $this->elementStack[] = new KMLPolygon($name, $attribs); break; } }