/**
  * Creates a GML object from a GeoJSON (http://www.geojson.org) String
  * 
  * @return Gml
  * @param $geoJson String
  */
 public function createFromGeoJson($geoJson, $wfsConf = null)
 {
     if (is_a($wfsConf, "WfsConfiguration")) {
         $wfsFactory = new UniversalWfsFactory();
         $myWfsFactory = $wfsFactory->createFromDb($wfsConf->wfsId);
         if (is_a($myWfsFactory, "Wfs_1_1")) {
             $gml3Factory = new Gml_3_Factory();
             return $gml3Factory->createFromGeoJson($geoJson);
         }
         if (is_a($myWfsFactory, "Wfs_1_0")) {
             $gml2Factory = new Gml_2_Factory();
             return $gml2Factory->createFromGeoJson($geoJson);
         }
         throw new Exception("UniversalGmlFactory: Unknown WFS version");
     } else {
         $gml2Factory = new Gml_2_Factory();
         return $gml2Factory->createFromGeoJson($geoJson);
     }
 }
 public function transaction($method, $wfsConf, $geoJson)
 {
     $gmlFactory = new Gml_2_Factory();
     $gmlObj = $gmlFactory->createFromGeoJson($geoJson);
     return parent::transaction($method, $wfsConf, $gmlObj);
 }
 /**
  * Parses the feature segment of a GML and stores the geometry in the
  * $geometry variable of the class.
  * 	
  * Example of a feature segment of a GML. 
  * 
  * <gml:featureMember>
  * 	<ms:my_polygons gml:id="my_polygons.624">
  * 		<gml:boundedBy>
  * 			<gml:Envelope srsName="epsg:4326">
  * 				<gml:lowerCorner>39.700000 29.400000</gml:lowerCorner>
  * 				<gml:upperCorner>46.400000 35.400000</gml:upperCorner>
  * 			</gml:Envelope>
  * 		</gml:boundedBy>
  * 		<ms:the_geom>
  * 			<gml:MultiSurface srsName="epsg:4326">
  * 				<gml:surfaceMembers>
  * 					<gml:Polygon>
  * 						<gml:exterior>
  * 							<gml:LinearRing>
  * 								<gml:posList srsDimension="2">
  * 									43.200000 35.400000 
  * 									46.400000 31.700000 
  * 									44.100000 31.000000 
  * 									41.700000 29.400000 
  * 									39.700000 31.400000 
  * 									43.300000 32.300000 
  * 									43.200000 35.400000 
  * 								</gml:posList>
  * 							</gml:LinearRing>
  * 						</gml:exterior>
  * 					</gml:Polygon>
  * 				</gml:surfaceMembers>
  * 			</gml:MultiSurface>
  * 		</ms:the_geom>
  * 		<ms:oid>16752039</ms:oid>
  * 		<ms:gid>624</ms:gid>
  * 		<ms:name>inter_08</ms:name>
  * 		<ms:angle/>
  * 		<ms:annotation/>
  * 		<ms:style>3</ms:style>
  * 		</ms:my_polygons>
  * 	</gml:featureMember>
  * 
  * @return void
  * @param $domNode DOMNodeObject the feature tag of the GML 
  * 								(<gml:featureMember> in the above example)
  */
 protected function parseFeature($domNode, $feature, $wfsConf)
 {
     $geomFeaturetypeElement = $wfsConf->getGeometryColumnName();
     $feature->fid = $domNode->getAttribute("gml:id");
     $currentSibling = $domNode->firstChild;
     while ($currentSibling) {
         $name = $currentSibling->nodeName;
         $value = $currentSibling->nodeValue;
         $namespace = $this->findNameSpace($name);
         $ns = $namespace['ns'];
         $columnName = $namespace['value'];
         $isGeomColumn = $geomFeaturetypeElement == null || $columnName == $geomFeaturetypeElement;
         // check if this node is a geometry node.
         // however, even if it is a property node,
         // it has a child node, the text node!
         // So we might need to do something more
         // sophisticated here...
         if ($currentSibling->hasChildNodes() && $isGeomColumn) {
             $geomNode = $currentSibling->firstChild;
             if ($geomNode->nodeType != XML_ELEMENT_NODE) {
                 while ($geomNode = $geomNode->nextSibling) {
                     if ($geomNode->nodeType == XML_ELEMENT_NODE) {
                         break;
                     }
                 }
             }
             $geomType = $geomNode->nodeName;
             if ($geomNode->hasAttribute("srsName")) {
                 $srs = $geomNode->getAttribute("srsName");
             }
             switch ($geomType) {
                 case "gml:Polygon":
                     // untested!
                     $feature->geometry = self::parsePolygon($geomNode);
                     if ($feature->geometry->isEmpty()) {
                         $feature->geometry = Gml_2_Factory::parsePolygon($geomNode);
                     }
                     $feature->geometry->srs = $srs;
                     break;
                 case "gml:LineString":
                     // untested!
                     $feature->geometry = self::parseLine($geomNode);
                     if ($feature->geometry->isEmpty()) {
                         $feature->geometry = Gml_2_Factory::parseLine($geomNode);
                     }
                     $feature->geometry->srs = $srs;
                     break;
                 case "gml:Point":
                     $feature->geometry = self::parsePoint($geomNode);
                     if ($feature->geometry->isEmpty()) {
                         $feature->geometry = Gml_2_Factory::parsePoint($geomNode);
                     }
                     $feature->geometry->srs = $srs;
                     break;
                 case "gml:MultiPoint":
                     $feature->geometry = self::parseMultiPoint($geomNode);
                     if ($feature->geometry->isEmpty()) {
                         $feature->geometry = Gml_2_Factory::parseMultiPoint($geomNode);
                     }
                     $feature->geometry->srs = $srs;
                     break;
                 case "gml:MultiLineString":
                     new mb_exception("found multilinestring");
                     $feature->geometry = self::parseMultiLine($geomNode);
                     if ($feature->geometry->isEmpty()) {
                         $feature->geometry = Gml_2_Factory::parseMultiLine($geomNode);
                     }
                     $feature->geometry->srs = $srs;
                     break;
                 case "gml:MultiCurve":
                     $feature->geometry = self::parseMultiCurve($geomNode);
                     if ($feature->geometry->isEmpty()) {
                         $feature->geometry = Gml_2_Factory::parseMultiLine($geomNode);
                     }
                     $feature->geometry->srs = $srs;
                     break;
                 case "gml:MultiSurface":
                     $feature->geometry = self::parseMultiPolygon($geomNode);
                     if ($feature->geometry->isEmpty()) {
                         $feature->geometry = Gml_2_Factory::parseMultiPolygon($geomNode);
                     }
                     $feature->geometry->srs = $srs;
                     break;
                 default:
                     $feature->properties[$columnName] = $value;
                     break;
             }
         } else {
             if ($currentSibling->hasChildNodes() && $currentSibling->firstChild instanceof DOMText) {
                 $feature->properties[$columnName] = $value;
             }
         }
         $currentSibling = $currentSibling->nextSibling;
     }
 }