/** * 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; } }