Procházet zdrojové kódy

fixed wfs-data getFeature loading time

Piotr Labudda před 9 roky
rodič
revize
4fc4445be0
1 změnil soubory, kde provedl 62 přidání a 46 odebrání
  1. 62 46
      SE/se-lib/Api/WfsDataServer.php

+ 62 - 46
SE/se-lib/Api/WfsDataServer.php

@@ -167,20 +167,24 @@ class Api_WfsDataServer extends Api_WfsServerBase {
 		if($DBG){echo 'getItems:';print_r($searchParams);echo "\n";}
 		$items = $acl->getItems($searchParams);
 
-		$dom = new DOMDocument('1.0', 'utf-8');
-		$dom->formatOutput = true;
-		$dom->preserveWhiteSpace = false;
-		$rootNode = $dom->createElementNS('http://www.opengis.net/wfs', 'wfs:FeatureCollection');
-		$dom->appendChild($rootNode);
-		$rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns', 'http://www.opengis.net/wfs');
-		$rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:wfs', 'http://www.opengis.net/wfs');
-		$rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:gml', 'http://www.opengis.net/gml');
-		$rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
-		$rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xlink', 'http://www.w3.org/1999/xlink');
-		$rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:' . $wfsNs, $wfsNsUri);
-		if (!$simple) $rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', "xmlns:{$rootWfsNs}", $rootWfsNsUri);
-		//$rootNode->setAttribute('xsi:schemaLocation', 'http://www.opengis.net/wfs');
-		$rootNode->setAttribute('xsi:schemaLocation', "{$wfsNsUri} {$featureTypeUri}");
+		header('Content-type: application/xml; charset=utf-8');
+		$xmlWriter = new XMLWriter();
+		$xmlWriter->openUri('php://output');
+		// $xmlWriter->openMemory();// DBG
+		$xmlWriter->setIndent(true);
+		if (!$xmlWriter) throw new HttpException("Error no XMLWriter", 404);
+		$xmlWriter->startDocument('1.0','UTF-8');
+		//$xmlWriter->startElementNS('wfs', 'FeatureCollection', 'http://www.opengis.net/wfs');
+		$xmlWriter->startElement('wfs:FeatureCollection');
+//		$xmlWriter->writeAttributeNS('xmlns', 'wfs', 'http://www.w3.org/2000/xmlns/', 'http://www.opengis.net/wfs');
+		$xmlWriter->writeAttribute('xmlns:wfs', 'http://www.opengis.net/wfs');
+		$xmlWriter->writeAttribute('xmlns', 'http://www.opengis.net/wfs');
+		$xmlWriter->writeAttribute('xmlns:gml', 'http://www.opengis.net/gml');
+		$xmlWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
+		$xmlWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
+		$xmlWriter->writeAttribute("xmlns:{$wfsNs}", $wfsNsUri);
+		if (!$simple) $xmlWriter->writeAttribute("xmlns:{$rootWfsNs}", $rootWfsNsUri);
+		$xmlWriter->writeAttribute('xsi:schemaLocation', "{$wfsNsUri} {$featureTypeUri}");
 
 		if($DBG){echo '(geomFld: '.$geomFld.'):';print_r($acl->getFieldType($geomFld));echo "\n";}
 		if (empty($items)) {
@@ -197,21 +201,25 @@ class Api_WfsDataServer extends Api_WfsServerBase {
 			if($DBG && !empty($geomFld)){echo 'item['.$itemKey.'] ('.$geomFld.')isEmpty('.empty($item[$geomFld]).'):';print_r($item[$geomFld]);echo "\n";}
 			if($DBG_DS){echo ">>> loop({$itemKey}) item: ";print_r($item);echo "\n";}
 
-			$featureMemberNode = $dom->createElementNS('http://www.opengis.net/gml', 'gml:featureMember');
-			$rootNode->appendChild($featureMemberNode);
-				$featureNode = $dom->createElementNS($wfsNsUri, "{$wfsNs}:{$type}");
-				$featureMemberNode->appendChild($featureNode);
-				$featureNode->setAttribute('fid', "{$type}.{$itemKey}");
-				if (!$simple) $featureNode->setAttributeNS($rootWfsNsUri, "{$rootWfsNs}:web_link", Request::getPathUri() . "index.php?_route=ViewTableAjax&typeName=p5_{$sourceName}:{$tblName}#EDIT/{$itemKey}");
-					foreach ($fldList as $fldName) {
+			$xmlWriter->startElement('gml:featureMember');
+				$xmlWriter->startElement("{$wfsNs}:{$type}");
+					$xmlWriter->writeAttribute('fid', "{$type}.{$itemKey}");
+					if (!$simple) $xmlWriter->writeAttribute("{$rootWfsNs}:web_link", Request::getPathUri() . "index.php?_route=ViewTableAjax&typeName=p5_{$sourceName}:{$tblName}#EDIT/{$itemKey}");
+					foreach ($fldList as $idZasob => $fldName) {
+						if($DBG_DS){echo ">>> loop({$itemKey}) item({$item['ID']}) fld({$fldName}): ";var_dump($item[$fldName]);echo"\n";}
 						$fldType = $acl->getXsdFieldType($fldName);
-						$featureFldNode = $dom->createElementNS($wfsNsUri, "{$wfsNs}:{$fldName}");
-						if($DBG_DS){echo">>> acl->canReadObjectField('{$fldName}', \$item) ...\n";}
-						if ($acl->canReadObjectField($fldName, (object)$item)) {
-							if ($geomFld != null && $geomFld == $fldName) {
-								$geomNode = $this->_typeConverter->createGmlFromWkt($item[$fldName], $dom);
-								if (!$geomNode) continue;
-								$featureFldNode->appendChild($geomNode);
+						$canReadRecord = $acl->canReadObjectField($fldName, (object)$item);
+						if ($canReadRecord) {
+							if ($geomFld != null && $fldName == $geomFld) {
+								$xmlWriter->startElement("{$wfsNs}:{$fldName}");
+									if (!$simple && !$acl->canReadObjectField($fldName, (object)$item)) {
+										$xmlWriter->writeAttribute("{$rootWfsNs}:allow_read", "false");
+									}
+									if (!$simple && !$acl->canWriteObjectField($fldName, (object)$item)) {
+										$xmlWriter->writeAttribute("{$rootWfsNs}:allow_write", "true");
+									}
+									$this->_typeConverter->createGmlFromWkt_xmlWriter($item[$fldName], $xmlWriter);
+								$xmlWriter->endElement();// {$wfsNs}:{$fldName}
 							} else if (is_array($item[$fldName])) {// TODO: by struct - REF field
 								if($DBG_DS){echo">>> TODO({$fldName}) REF item[{$itemKey}][{$fldName}]: ";print_r($item[$fldName]);echo "\n";}
 								if (1 == count($item[$fldName])) {
@@ -220,34 +228,42 @@ class Api_WfsDataServer extends Api_WfsServerBase {
 									if (2 != count($xlinkParts)) throw new Exception("Error Processing Reques - wrong xlink format for ".$acl->getName().".{$itemKey}/{$fldName}");
 									$xlinkParts[0] = Api_WfsNs::getNsUri($xlinkParts[0]);
 									$xlink = implode('#', $xlinkParts);
-									$featureFldNode->setAttribute('xlink:href', $xlink);
+									$xmlWriter->startElement("{$wfsNs}:{$fldName}");
+										if (!$simple && !$acl->canReadObjectField($fldName, (object)$item)) {
+											$xmlWriter->writeAttribute("{$rootWfsNs}:allow_read", "false");
+										}
+										if (!$simple && !$acl->canWriteObjectField($fldName, (object)$item)) {
+											$xmlWriter->writeAttribute("{$rootWfsNs}:allow_write", "true");
+										}
+										$xmlWriter->writeAttribute('xlink:href', $xlink);
+									$xmlWriter->endElement();// {$wfsNs}:{$fldName}
 								} else {
 									throw new Exception("Error Processing Request - too many refs for ".$acl->getName().".{$itemKey}/{$fldName}");
 								}
-								// foreach ($item[$fldName] as $ref) {
-								// 	$refNode = $dom->createElementNS($wfsNsUri, "{$wfsNs}:{$fldName}");
-								// 	$featureFldNode->appendChild($refNode);
-								// }
 							} else {
-								$featureFldNode->nodeValue = str_replace('&', '&', $item[$fldName]);
-								if (empty($featureFldNode->nodeValue) && '0' !== $featureFldNode->nodeValue) {
+								$value = str_replace('&', '&', $item[$fldName]);
+								if (empty($value) && '0' !== $value) {
 									continue;
+								} else {
+									$xmlWriter->startElement("{$wfsNs}:{$fldName}");
+										if (!$simple && !$acl->canReadObjectField($fldName, (object)$item)) {
+											$xmlWriter->writeAttribute("{$rootWfsNs}:allow_read", "false");
+										}
+										if (!$simple && !$acl->canWriteObjectField($fldName, (object)$item)) {
+											$xmlWriter->writeAttribute("{$rootWfsNs}:allow_write", "true");
+										}
+										$xmlWriter->text($value);
+									$xmlWriter->endElement();// {$wfsNs}:{$fldName}
 								}
 							}
 						}
-						if (!$simple) {
-							if (!$acl->canReadObjectField($fldName, (object)$item)) {
-								$featureFldNode->setAttributeNS($rootWfsNsUri, "{$rootWfsNs}:allow_read", "false");
-							}
-							if ($acl->canWriteObjectField($fldName, (object)$item)) {
-								$featureFldNode->setAttributeNS($rootWfsNsUri, "{$rootWfsNs}:allow_write", "true");
-							}
-						}
-						$featureNode->appendChild($featureFldNode);
 					}
+				$xmlWriter->endElement();// {$wfsNs}:{$type}
+			$xmlWriter->endElement();// gml:featureMember
 		}
-
-		return $dom->saveXml();
+		$xmlWriter->endElement();// wfs:FeatureCollection
+		$xmlWriter->endDocument();
+		exit;
 	}
 
 	public function describeFeatureTypeAction() {