jQuery('#TreeTableMap').TableAjaxMap({ wpsUrl: 'http://biuro.biall-net.pl/wps', wfsUrl: 'http://biuro.biall-net.pl/wps' }); * */ class TableAjaxMap { private $_acl; private $_zasobID; private $_width; private $_height; public function __construct($tblAcl, $width = 512, $height = 256) { $this->_acl = $tblAcl; $this->_zasobID = $tblAcl->getID(); $this->_width = $width; $this->_height = $height; } public function printCSS() { // // ?> sendAjaxProxy($_REQUEST); break; } default: //$this->sendAjaxData($_REQUEST); } } public function sendAjaxProxy($args) { $url = V::get('url', '', $args); // 1. http%3A%2F%2Fbiuro.biall-net.pl%2Fwps%3FSERVICE%3DWPS%26REQUEST%3DGetCapabilities // 2. http%3A%2F%2Fbiuro.biall-net.pl%2Fwps%3FSERVICE%3DWPS%26REQUEST%3DDescribeProcess%26VERSION%3D1.0.0%26IDENTIFIER%3Dpozdrawiam header('Content-Type: application/xml; charset=utf-8'); $urlParts = parse_url($url); $urlQuery = array(); $urlQueryTmp = V::get('query', '', $urlParts); $urlQueryTmp = explode('&', $urlQueryTmp); foreach ($urlQueryTmp as $vQuery) { $parts = explode('=', $vQuery, 2); $urlQuery[$parts[0]] = $parts[1]; } $wpsServer = new TableAjaxMapWpsServer($this->_acl); if ('WPS' == V::get('SERVICE', '', $urlQuery)) { $req = V::get('REQUEST', '', $urlQuery); $methodName = "{$req}Action"; if (method_exists($wpsServer, $methodName)) { $wpsServer->$methodName($urlQuery); } } else { $wpsServer->parseXMLRequest(); } exit; } } class TableAjaxMapWfsAction { private $_acl; private $_zasobID; public function __construct($acl) { $this->_acl = $acl; $this->_zasobID = $acl->getID(); } /** * example: MULTIPOLYGON(((2072016.74395199 7234076.79293037,2072016.74395199 7234115.01144451,2072131.3994944 7234115.01144451,2072131.3994944 7234076.79293037,2072016.74395199 7234076.79293037))) */ public function generateGmlFromWKT($wkt) { $gml = ''; $wktParts = explode('(', $wkt, 2); ob_start(); switch ($wktParts[0]) { case 'MULTIPOLYGON': case 'POLYGON': { $points = trim($wktParts[1], '() '); $points = str_replace(',', "\n", $points); ?> -180 -90 180 90 45.67 88.56 // 45.67, 88.56 ?> -180 -90 180 90 -180 -90 180 90 _acl->getDB()); $dataSource->setTable($this->_acl->getName()); $dataSource->addCol('ID'); $dataSource->addCol('the_geom'); $dataSource->setColTypes($this->_acl->getTypes()); $params = array(); $params['limit'] = 1000; if (!empty($args['BBOX'])) { $params['f_the_geom'] = 'BBOX:' . implode(',', $args['BBOX']); } $items = $dataSource->getItems($params); $buildingsGml = array(); foreach ($items as $r) { if (!empty($r->the_geom)) { $buildingsGml[$r->ID] = $this->generateGmlFromWKT($r->the_geom); } } /** * * * * goes to js: @see priv.addWKTInput _layer.selectedFeatures[0] * * attributes: Object recordId: "1130" tblId: "16" */ echo ''; ?> -180 -90 180 90 $vGml) : ?> _zasobID; ?> title = 'Przypisz'; $this->description = 'Przypisuje położenie do wybranego rekordu w tabeli.'; $this->dataInputs['geom'] = new stdClass(); $this->dataInputs['geom']->title = 'geom'; $this->dataInputs['geom']->description = 'Input geometry'; $this->dataInputs['geom']->type = 'geom';// CoomplexData $this->dataInputs['idTable'] = new stdClass(); $this->dataInputs['idTable']->title = 'geom'; $this->dataInputs['idTable']->description = 'Table ID'; $this->dataInputs['idTable']->type = 'integer';// LiteralData: xs:integer $this->dataInputs['idRecord'] = new stdClass(); $this->dataInputs['idRecord']->title = 'idRecord'; $this->dataInputs['idRecord']->description = 'Record ID'; $this->dataInputs['idRecord']->type = 'integer';// LiteralData: xs:integer } } class TableAjaxMapWpsServer { private $_fun;// config for identifiers private $_wfsAction; private $_zasobID; private $_acl; public function __construct($acl) { $this->_fun['przypiszDoRekordu'] = new WpsActionPrzypiszDoRekordu(); $this->_acl = $acl; $this->_zasobID = $acl->getID(); $this->_wfsAction = new TableAjaxMapWfsAction($this->_acl); } public function parseXMLRequest() { $data = array(); $reqContent = file_get_contents('php://input'); $xml = new SimpleXMLElement($reqContent); if ('GetFeature' == $xml->getName()) { // TODO: parse xml and set query params /* the_geom 17.226562502593 53.887024366231 20.039062502593 54.847089981191 */ $corners = null; $xmlTag = $xml->children("wfs", TRUE)->Query; if (!empty($xmlTag)) { $xmlTag = $xmlTag->children("ogc", TRUE)->Filter; if (!empty($xmlTag)) { $xmlTag = $xmlTag->BBOX; if (!empty($xmlTag)) { $xmlTag = $xmlTag->children("gml", TRUE)->Envelope; if (!empty($xmlTag)) { $corners = (object)array('lowerCorner' => (string)$xmlTag->lowerCorner, 'upperCorner' => (string)$xmlTag->upperCorner); } } } } if ($corners) { $lowerCorner = (string) $corners->lowerCorner; $upperCorner = (string) $corners->upperCorner; $lowerCorner = explode(" ", trim($lowerCorner)); $upperCorner = explode(" ", trim($upperCorner)); if (count($lowerCorner) == 2 && count($upperCorner) == 2) { $points = array(); $points[] = $upperCorner[1];// top $points[] = $upperCorner[0];// right $points[] = $lowerCorner[1];// bottom $points[] = $lowerCorner[0];// left $isAllNumeric = true; foreach ($points as $point) { if (!is_numeric($point)) $isAllNumeric = false; } if ($isAllNumeric) { $data['BBOX'] = $points; } } } else { // inna struktura xml'a } $this->_wfsAction->execute($data); } else if (isset($xml->children('ows', TRUE)->Identifier)) { $identifier = (string)$xml->children('ows', TRUE)->Identifier; if (array_key_exists($identifier, $this->_fun)) { foreach ($xml->children('wps', TRUE)->DataInputs->children('wps', TRUE) as $input) { $inputIdentifier = (string)$input->children('ows', TRUE)->Identifier; if (array_key_exists($inputIdentifier, $this->_fun[$identifier]->dataInputs)) { $inputType = (string)$this->_fun[$identifier]->dataInputs[$inputIdentifier]->type; switch ($inputType) { case 'integer': $data[$inputIdentifier] = (string)$input->children('wps', TRUE)->Data->LiteralData; break; case 'geom': $data[$inputIdentifier] = (string)$input->children('wps', TRUE)->Data->ComplexData; break; default: } } else { // brak zdefiniowanego inputa } } $this->_fun['przypiszDoRekordu']->execute($data); } else { echo "TODO: brak zdefiniowanej funkcji '{$identifier}'"; var_dump($identifier); } } else { echo "TODO: '" . $xml->getName() . "' ..."; } } public function getCapabilitiesAction() { echo ''; ?> Prototype GeoServer WPS wps geoserver WPS 1.0.0 NONE NONE GeoServer _fun as $kFun => $vFun) : ?> title; ?> description; ?> en-US en-US '; if (array_key_exists($args['IDENTIFIER'], $this->_fun)) { $identifier = $this->_fun[$args['IDENTIFIER']]; ?> title; ?> description; ?> dataInputs as $kInput => $vInput) : ?> title; ?> description; ?> type == 'geom') : ?> text/xml; subtype=gml/3.1.1 text/xml; subtype=gml/3.1.1 text/xml; subtype=gml/2.1.2 application/wkt application/gml-3.1.1 application/gml-2.1.2 type == 'integer') : ?> xs:integer result result text/xml; subtype=gml/3.1.1 text/xml; subtype=gml/3.1.1 text/xml; subtype=gml/2.1.2 application/wkt application/gml-3.1.1 application/gml-2.1.2