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;
 }
Example #3
0
 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;
     }
 }