GetCapabilities.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. <?php
  2. Lib::loadClass('Api_WfsException');
  3. Lib::loadClass('Api_WfsGeomTypeConverter');
  4. Lib::loadClass('Api_WfsNs');
  5. Lib::loadClass('Request');
  6. Lib::loadClass('Core_AclHelper');
  7. Lib::loadClass('Core_XmlWriter');
  8. class Api_Wfs_GetCapabilities {
  9. public function getCapabilitiesCsv($wfsServerUrl, $serviceTitle, $serviceDescription, $aclList) {
  10. header('Content-Type: text/csv; charset=utf-8');
  11. $csvLineSepartor = "\n";
  12. $csvValueSepartor = ",";
  13. $csvText = function ($value) {
  14. return '"' . str_replace(['"'], ['\"'], $value) . '"';
  15. };
  16. echo implode(",", [
  17. "Name",
  18. "Title",
  19. "namespace url",
  20. "Keywords",
  21. "Abstract",
  22. "SRS",
  23. "LatLongBoundingBox - minx",
  24. "LatLongBoundingBox - miny",
  25. "LatLongBoundingBox - maxx",
  26. "LatLongBoundingBox - maxy",
  27. ]);
  28. echo $csvLineSepartor;
  29. echo implode($csvLineSepartor, array_map(function ($acl) use ($csvText, $csvValueSepartor) {
  30. $ns = Core_AclHelper::parseNamespaceUrl($acl->getNamespace());
  31. return implode($csvValueSepartor, [
  32. "p5_{$ns['prefix']}:{$ns['name']}", // Name
  33. $csvText($acl->getRawLabel()), // Title
  34. Api_WfsNs::getNsUri($ns['prefix']), // namespace url
  35. $csvText(implode(', ', [ $acl->getID(), $acl->getName(), $acl->getRawLabel() ])), // Keywords
  36. $csvText($acl->getRawOpis()), // Abstract
  37. 'EPSG:4326', // SRS
  38. "8.12328509871721", // LatLongBoundingBox - minx
  39. "38.8575126897477", // LatLongBoundingBox - miny
  40. "9.838674658246807", // LatLongBoundingBox - maxx
  41. "41.31378404137082", // LatLongBoundingBox - maxy
  42. ]);
  43. }, $aclList));
  44. echo $csvLineSepartor;
  45. echo implode($csvLineSepartor, array_map(function ($typeName) use ($csvText, $csvValueSepartor) {
  46. list($prefix, $name) = explode(':', $typeName);
  47. return implode($csvValueSepartor, [
  48. "p5_{$prefix}:{$name}", // Name
  49. $csvText($name), // Title
  50. Api_WfsNs::getNsUri($prefix), // namespace url
  51. $csvText($name), // Keywords
  52. $csvText($name), // Abstract
  53. 'EPSG:4326', // SRS
  54. "8.12328509871721", // LatLongBoundingBox - minx
  55. "38.8575126897477", // LatLongBoundingBox - miny
  56. "9.838674658246807", // LatLongBoundingBox - maxx
  57. "41.31378404137082", // LatLongBoundingBox - maxy
  58. ]);
  59. }, Core_AclHelper::getCustomAclList()));
  60. exit;
  61. }
  62. public function getCapabilitiesXml($wfsServerUrl, $serviceTitle, $serviceDescription, $aclList) {
  63. // if (V::get('DBG_ACL', '', $_GET)) {
  64. // {
  65. // echo "Core_AclHelper::getCustomAclList = [" . "\n";
  66. // foreach (Core_AclHelper::getCustomAclList() as $typeName) {
  67. // echo "|\t{$typeName}" . "\n";
  68. // }
  69. // echo "]// .EOF Core_AclHelper::getCustomAclList" . "\n";
  70. // }
  71. //
  72. // $fullTblAclList = $this->_usrAcl->getTablesAcl();
  73. // print_r($fullTblAclList);
  74. // die("\n" . '.EOF - DBG_ACL');
  75. // }
  76. header('Content-type: application/xml; charset=utf-8');
  77. $xmlWriter = new Core_XmlWriter();
  78. if (!$xmlWriter) throw new HttpException("Error no XMLWriter", 404);
  79. $xmlWriter->openUri('php://output');
  80. $xmlWriter->setIndent(true);
  81. $xmlWriter->startDocument('1.0','UTF-8');
  82. $xmlWriter->startElement('WFS_Capabilities');
  83. $xmlWriter->writeAttribute('xmlns', 'http://www.opengis.net/wfs');
  84. $xmlWriter->writeAttribute('xmlns:ogc', 'http://www.opengis.net/ogc');
  85. $xmlWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
  86. foreach (Api_WfsNs::getNsList() as $uri => $prefix) {
  87. $xmlWriter->writeAttribute("xmlns:{$prefix}", $uri);
  88. }
  89. $schemaLocations = [];
  90. //$schemaLocations[] = 'http://www.opengis.net/wfs http://webgis.regione.sardegna.it:80/geoserver/schemas/wfs/1.0.0/WFS-capabilities.xsd';// @from http://webgis.regione.sardegna.it/geoserver/ows?service=WFS&request=GetCapabilities
  91. if (!empty($schemaLocations)) $xmlWriter->writeAttribute('xsi:schemaLocation', implode(' ', $schemaLocations));
  92. $xmlWriter->writeAttribute('version', "1.0.0");
  93. $xmlWriter->h('Service', [
  94. ['Name', "WFS"],
  95. ['Title', $serviceTitle],
  96. ['Abstract', $serviceDescription],
  97. ['Keywords', "WFS, WMS"],
  98. ['OnlineResource', $wfsServerUrl],
  99. ['Fees', "NONE"],
  100. ['AccessConstraints', "NONE"],
  101. ]);
  102. $xmlWriter->h('Capability', [
  103. [ 'Request', [
  104. [ 'GetCapabilities', [
  105. [ 'DCPType', [
  106. [ 'HTTP', [
  107. [ 'Get', [ 'onlineResource' => "{$wfsServerUrl}?REQUEST=GetCapabilities" ], null ]
  108. ] ]
  109. ] ],
  110. [ 'DCPType', [
  111. [ 'HTTP', [
  112. [ 'Post', [ 'onlineResource' => "{$wfsServerUrl}" ], null ]
  113. ] ]
  114. ] ],
  115. ] ]
  116. ] ]
  117. ]);
  118. $xmlWriter->h('DescribeFeatureType', [
  119. [ 'SchemaDescriptionLanguage', [
  120. [ 'XMLSCHEMA', null ]
  121. ] ],
  122. [ 'DCPType', [
  123. [ 'HTTP', [
  124. [ 'Get', ['onlineResource' => "{$wfsServerUrl}?REQUEST=DescribeFeatureType"], null ]
  125. ] ]
  126. ] ],
  127. [ 'DCPType', [
  128. [ 'HTTP', [
  129. [ 'Post', ['onlineResource' => "{$wfsServerUrl}"], null ]
  130. ] ]
  131. ] ],
  132. ]);
  133. $xmlWriter->h('GetFeature', [
  134. [ 'ResultFormat', [
  135. 'WFSKMLOutputFormat',
  136. 'GML2',
  137. 'GML3',
  138. 'SHAPE-ZIP',
  139. 'CSV',
  140. 'JSON',
  141. ] ],
  142. [ 'DCPType', [
  143. [ 'HTTP', [
  144. [ 'Get', ['onlineResource' => "{$wfsServerUrl}?REQUEST=GetFeature"], null ]
  145. ] ]
  146. ] ],
  147. [ 'DCPType', [
  148. [ 'HTTP', [
  149. [ 'Post', ['onlineResource' => "{$wfsServerUrl}"], null ]
  150. ] ]
  151. ] ],
  152. ]);
  153. $xmlWriter->h('Transaction', [
  154. [ 'DCPType', [
  155. [ 'HTTP', [
  156. [ 'Get', ['onlineResource' => "{$wfsServerUrl}?REQUEST=Transaction"], null ]
  157. ] ]
  158. ] ],
  159. [ 'DCPType', [
  160. [ 'HTTP', [
  161. [ 'Post', ['onlineResource' => "{$wfsServerUrl}"], null ]
  162. ] ]
  163. ] ],
  164. ]);
  165. $xmlWriter->h('LockFeature', [
  166. [ 'DCPType', [
  167. [ 'HTTP', [
  168. [ 'Get', ['onlineResource' => "{$wfsServerUrl}?REQUEST=LockFeature"], null ]
  169. ] ]
  170. ] ],
  171. [ 'DCPType', [
  172. [ 'HTTP', [
  173. [ 'Post', ['onlineResource' => "{$wfsServerUrl}"], null ]
  174. ] ]
  175. ] ],
  176. ]);
  177. $xmlWriter->h('GetFeatureWithLock', [
  178. [ 'ResultFormat', [
  179. 'GML2'
  180. ] ],
  181. [ 'DCPType', [
  182. [ 'HTTP', [
  183. [ 'Get', ['onlineResource' => "{$wfsServerUrl}?REQUEST=GetFeatureWithLock"], null ]
  184. ] ]
  185. ] ],
  186. [ 'DCPType', [
  187. [ 'HTTP', [
  188. [ 'Post', ['onlineResource' => "{$wfsServerUrl}"], null ]
  189. ] ]
  190. ] ],
  191. ]);
  192. $featureTypeNodes = [];
  193. foreach ($aclList as $tblAcl) {
  194. $ns = Core_AclHelper::parseNamespaceUrl($tblAcl->getNamespace());
  195. DBG::log(['ns'=>$ns, 'acl_ns'=>$tblAcl->getNamespace(), 'cls'=>get_class($tblAcl)], 'array', "tblAcl [".$tblAcl->getID()."]");
  196. $dataSourceName = 'default_db';// TODO: $tblAcl->getSourceName()
  197. $prefix = "p5_{$dataSourceName}";
  198. $featureTypeNodes[] = [ 'FeatureType', [ "xmlns:{$prefix}" => Api_WfsNs::getNsUri($prefix) ], [
  199. [ 'Name', "p5_" . "{$ns['prefix']}:{$ns['name']}" ], // TODO: remove 'p5_' prefix
  200. [ 'Title', $tblAcl->getRawLabel() ],
  201. [ 'Abstract', $tblAcl->getRawOpis() ],
  202. [ 'Keywords', implode(', ', [ $tblAcl->getID(), $tblAcl->getName(), $tblAcl->getRawLabel() ]) ],
  203. [ 'SRS', 'EPSG:4326' ],
  204. [ 'LatLongBoundingBox', [
  205. 'minx' => "8.12328509871721",
  206. 'miny' => "38.8575126897477",
  207. 'maxx' => "9.838674658246807",
  208. 'maxy' => "41.31378404137082"], null ]
  209. ] ];
  210. }
  211. foreach (Core_AclHelper::getCustomAclList() as $typeName) {
  212. list($prefix, $name) = explode(':', $typeName);
  213. $featureTypeNodes[] = [ 'FeatureType', [ "xmlns:{$prefix}" => Api_WfsNs::getNsUri($prefix) ], [
  214. [ 'Name', "{$prefix}:{$name}" ],
  215. [ 'Title', $name ],
  216. [ 'Abstract', $name ],
  217. [ 'Keywords', $name ],
  218. [ 'SRS', 'EPSG:4326' ],
  219. ] ];
  220. }
  221. $xmlWriter->startElement('FeatureTypeList');
  222. $xmlWriter->h('Operations', ['Query', 'Insert', 'Update', 'Delete', 'Lock']);
  223. if (DBG::isActive()) {
  224. DBG::log(array_map(function ($feature) {
  225. return "{$feature[2][0][1]}, ".array_values($feature[1])[0];
  226. }, $featureTypeNodes), 'array', "\$featureTypeNodes");
  227. }
  228. foreach ($featureTypeNodes as $node) {
  229. $xmlWriter->h($node);
  230. }
  231. $xmlWriter->endElement();// FeatureTypeList
  232. $xmlWriter->h('ogc:Filter_Capabilities', [
  233. [ 'ogc:Spatial_Capabilities', [
  234. [ 'ogc:Spatial_Operators', [
  235. 'ogc:Disjoint',
  236. 'ogc:Equals',
  237. 'ogc:DWithin',
  238. 'ogc:Beyond',
  239. 'ogc:Intersect',
  240. 'ogc:Touches',
  241. 'ogc:Crosses',
  242. 'ogc:Within',
  243. 'ogc:Contains',
  244. 'ogc:Overlaps',
  245. 'ogc:BBOX',
  246. ] ]
  247. ] ],
  248. [ 'ogc:Scalar_Capabilities', [
  249. 'ogc:Logical_Operators',
  250. [ 'ogc:Comparison_Operators', [
  251. 'ogc:Simple_Comparisons',
  252. 'ogc:Between',
  253. 'ogc:Like',
  254. 'ogc:NullCheck',
  255. ] ],
  256. [ 'ogc:Arithmetic_Operators', [
  257. 'ogc:Simple_Arithmetic',
  258. [ 'ogc:Functions', [
  259. [ 'ogc:Function_Names', [
  260. [ 'ogc:Function_Name', ['nArgs'=>"1"], "abs" ],
  261. [ 'ogc:Function_Name', ['nArgs'=>"1"], "abs_2" ],
  262. [ 'ogc:Function_Name', ['nArgs'=>"1"], "abs_3" ],
  263. [ 'ogc:Function_Name', ['nArgs'=>"1"], "abs_4" ],
  264. [ 'ogc:Function_Name', ['nArgs'=>"1"], "acos" ],
  265. [ 'ogc:Function_Name', ['nArgs'=>"2"], "AddCoverages" ],
  266. [ 'ogc:Function_Name', ['nArgs'=>"4"], "Aggregate" ],
  267. [ 'ogc:Function_Name', ['nArgs'=>"1"], "Area" ],
  268. [ 'ogc:Function_Name', ['nArgs'=>"1"], "area2" ],
  269. [ 'ogc:Function_Name', ['nArgs'=>"3"], "AreaGrid" ],
  270. [ 'ogc:Function_Name', ['nArgs'=>"1"], "asin" ],
  271. [ 'ogc:Function_Name', ['nArgs'=>"1"], "atan" ],
  272. [ 'ogc:Function_Name', ['nArgs'=>"2"], "atan2" ],
  273. [ 'ogc:Function_Name', ['nArgs'=>"14"], "BarnesSurface" ],
  274. [ 'ogc:Function_Name', ['nArgs'=>"3"], "between" ],
  275. [ 'ogc:Function_Name', ['nArgs'=>"1"], "boundary" ],
  276. [ 'ogc:Function_Name', ['nArgs'=>"1"], "boundaryDimension" ],
  277. [ 'ogc:Function_Name', ['nArgs'=>"1"], "Bounds" ],
  278. [ 'ogc:Function_Name', ['nArgs'=>"2"], "buffer" ],
  279. [ 'ogc:Function_Name', ['nArgs'=>"3"], "BufferFeatureCollection" ],
  280. [ 'ogc:Function_Name', ['nArgs'=>"3"], "bufferWithSegments" ],
  281. [ 'ogc:Function_Name', ['nArgs'=>"7"], "Categorize" ],
  282. [ 'ogc:Function_Name', ['nArgs'=>"1"], "ceil" ],
  283. [ 'ogc:Function_Name', ['nArgs'=>"1"], "Centroid" ],
  284. [ 'ogc:Function_Name', ['nArgs'=>"2"], "classify" ],
  285. [ 'ogc:Function_Name', ['nArgs'=>"2"], "Clip" ],
  286. [ 'ogc:Function_Name', ['nArgs'=>"1"], "CollectGeometries" ],
  287. [ 'ogc:Function_Name', ['nArgs'=>"1"], "Collection_Average" ],
  288. [ 'ogc:Function_Name', ['nArgs'=>"1"], "Collection_Bounds" ],
  289. [ 'ogc:Function_Name', ['nArgs'=>"0"], "Collection_Count" ],
  290. [ 'ogc:Function_Name', ['nArgs'=>"1"], "Collection_Max" ],
  291. [ 'ogc:Function_Name', ['nArgs'=>"1"], "Collection_Median" ],
  292. [ 'ogc:Function_Name', ['nArgs'=>"1"], "Collection_Min" ],
  293. [ 'ogc:Function_Name', ['nArgs'=>"1"], "Collection_Sum" ],
  294. [ 'ogc:Function_Name', ['nArgs'=>"1"], "Collection_Unique" ],
  295. [ 'ogc:Function_Name', ['nArgs'=>"1"], "Concatenate" ],
  296. [ 'ogc:Function_Name', ['nArgs'=>"2"], "contains" ],
  297. [ 'ogc:Function_Name', ['nArgs'=>"7"], "Contour" ],
  298. [ 'ogc:Function_Name', ['nArgs'=>"2"], "convert" ],
  299. [ 'ogc:Function_Name', ['nArgs'=>"1"], "convexHull" ],
  300. [ 'ogc:Function_Name', ['nArgs'=>"1"], "cos" ],
  301. [ 'ogc:Function_Name', ['nArgs'=>"1"], "Count" ],
  302. [ 'ogc:Function_Name', ['nArgs'=>"2"], "CropCoverage" ],
  303. [ 'ogc:Function_Name', ['nArgs'=>"2"], "crosses" ],
  304. [ 'ogc:Function_Name', ['nArgs'=>"2"], "dateFormat" ],
  305. [ 'ogc:Function_Name', ['nArgs'=>"2"], "dateParse" ],
  306. [ 'ogc:Function_Name', ['nArgs'=>"2"], "difference" ],
  307. [ 'ogc:Function_Name', ['nArgs'=>"1"], "dimension" ],
  308. [ 'ogc:Function_Name', ['nArgs'=>"2"], "disjoint" ],
  309. [ 'ogc:Function_Name', ['nArgs'=>"2"], "disjoint3D" ],
  310. [ 'ogc:Function_Name', ['nArgs'=>"2"], "distance" ],
  311. [ 'ogc:Function_Name', ['nArgs'=>"2"], "distance3D" ],
  312. [ 'ogc:Function_Name', ['nArgs'=>"1"], "double2bool" ],
  313. [ 'ogc:Function_Name', ['nArgs'=>"1"], "endAngle" ],
  314. [ 'ogc:Function_Name', ['nArgs'=>"1"], "endPoint" ],
  315. [ 'ogc:Function_Name', ['nArgs'=>"1"], "env" ],
  316. [ 'ogc:Function_Name', ['nArgs'=>"1"], "envelope" ],
  317. [ 'ogc:Function_Name', ['nArgs'=>"2"], "EqualInterval" ],
  318. [ 'ogc:Function_Name', ['nArgs'=>"2"], "equalsExact" ],
  319. [ 'ogc:Function_Name', ['nArgs'=>"3"], "equalsExactTolerance" ],
  320. [ 'ogc:Function_Name', ['nArgs'=>"2"], "equalTo" ],
  321. [ 'ogc:Function_Name', ['nArgs'=>"1"], "exp" ],
  322. [ 'ogc:Function_Name', ['nArgs'=>"1"], "exteriorRing" ],
  323. [ 'ogc:Function_Name', ['nArgs'=>"3"], "Feature" ],
  324. [ 'ogc:Function_Name', ['nArgs'=>"1"], "floor" ],
  325. [ 'ogc:Function_Name', ['nArgs'=>"1"], "geometryType" ],
  326. [ 'ogc:Function_Name', ['nArgs'=>"1"], "geomFromWKT" ],
  327. [ 'ogc:Function_Name', ['nArgs'=>"1"], "geomLength" ],
  328. [ 'ogc:Function_Name', ['nArgs'=>"2"], "getGeometryN" ],
  329. [ 'ogc:Function_Name', ['nArgs'=>"1"], "getX" ],
  330. [ 'ogc:Function_Name', ['nArgs'=>"1"], "getY" ],
  331. [ 'ogc:Function_Name', ['nArgs'=>"1"], "getz" ],
  332. [ 'ogc:Function_Name', ['nArgs'=>"2"], "greaterEqualThan" ],
  333. [ 'ogc:Function_Name', ['nArgs'=>"2"], "greaterThan" ],
  334. [ 'ogc:Function_Name', ['nArgs'=>"5"], "Grid" ],
  335. [ 'ogc:Function_Name', ['nArgs'=>"7"], "Heatmap" ],
  336. [ 'ogc:Function_Name', ['nArgs'=>"0"], "id" ],
  337. [ 'ogc:Function_Name', ['nArgs'=>"2"], "IEEEremainder" ],
  338. [ 'ogc:Function_Name', ['nArgs'=>"3"], "if_then_else" ],
  339. [ 'ogc:Function_Name', ['nArgs'=>"11"], "in10" ],
  340. [ 'ogc:Function_Name', ['nArgs'=>"3"], "in2" ],
  341. [ 'ogc:Function_Name', ['nArgs'=>"4"], "in3" ],
  342. [ 'ogc:Function_Name', ['nArgs'=>"5"], "in4" ],
  343. [ 'ogc:Function_Name', ['nArgs'=>"6"], "in5" ],
  344. [ 'ogc:Function_Name', ['nArgs'=>"7"], "in6" ],
  345. [ 'ogc:Function_Name', ['nArgs'=>"8"], "in7" ],
  346. [ 'ogc:Function_Name', ['nArgs'=>"9"], "in8" ],
  347. [ 'ogc:Function_Name', ['nArgs'=>"10"], "in9" ],
  348. [ 'ogc:Function_Name', ['nArgs'=>"2"], "InclusionFeatureCollection" ],
  349. [ 'ogc:Function_Name', ['nArgs'=>"1"], "int2bbool" ],
  350. [ 'ogc:Function_Name', ['nArgs'=>"1"], "int2ddouble" ],
  351. [ 'ogc:Function_Name', ['nArgs'=>"1"], "interiorPoint" ],
  352. [ 'ogc:Function_Name', ['nArgs'=>"2"], "interiorRingN" ],
  353. [ 'ogc:Function_Name', ['nArgs'=>"3"], "Interpolate" ],
  354. [ 'ogc:Function_Name', ['nArgs'=>"2"], "intersection" ],
  355. [ 'ogc:Function_Name', ['nArgs'=>"7"], "IntersectionFeatureCollection" ],
  356. [ 'ogc:Function_Name', ['nArgs'=>"2"], "intersects" ],
  357. [ 'ogc:Function_Name', ['nArgs'=>"2"], "intersects3D" ],
  358. [ 'ogc:Function_Name', ['nArgs'=>"1"], "isClosed" ],
  359. [ 'ogc:Function_Name', ['nArgs'=>"0"], "isCoverage" ],
  360. [ 'ogc:Function_Name', ['nArgs'=>"1"], "isEmpty" ],
  361. [ 'ogc:Function_Name', ['nArgs'=>"2"], "isLike" ],
  362. [ 'ogc:Function_Name', ['nArgs'=>"1"], "isNull" ],
  363. [ 'ogc:Function_Name', ['nArgs'=>"2"], "isometric" ],
  364. [ 'ogc:Function_Name', ['nArgs'=>"1"], "isRing" ],
  365. [ 'ogc:Function_Name', ['nArgs'=>"1"], "isSimple" ],
  366. [ 'ogc:Function_Name', ['nArgs'=>"1"], "isValid" ],
  367. [ 'ogc:Function_Name', ['nArgs'=>"3"], "isWithinDistance" ],
  368. [ 'ogc:Function_Name', ['nArgs'=>"3"], "isWithinDistance3D" ],
  369. [ 'ogc:Function_Name', ['nArgs'=>"2"], "Jenks" ],
  370. [ 'ogc:Function_Name', ['nArgs'=>"1"], "length" ],
  371. [ 'ogc:Function_Name', ['nArgs'=>"2"], "lessEqualThan" ],
  372. [ 'ogc:Function_Name', ['nArgs'=>"2"], "lessThan" ],
  373. [ 'ogc:Function_Name', ['nArgs'=>"1"], "list" ],
  374. [ 'ogc:Function_Name', ['nArgs'=>"1"], "log" ],
  375. [ 'ogc:Function_Name', ['nArgs'=>"4"], "LRSGeocode" ],
  376. [ 'ogc:Function_Name', ['nArgs'=>"5"], "LRSMeasure" ],
  377. [ 'ogc:Function_Name', ['nArgs'=>"5"], "LRSSegment" ],
  378. [ 'ogc:Function_Name', ['nArgs'=>"2"], "max" ],
  379. [ 'ogc:Function_Name', ['nArgs'=>"2"], "max_2" ],
  380. [ 'ogc:Function_Name', ['nArgs'=>"2"], "max_3" ],
  381. [ 'ogc:Function_Name', ['nArgs'=>"2"], "max_4" ],
  382. [ 'ogc:Function_Name', ['nArgs'=>"2"], "min" ],
  383. [ 'ogc:Function_Name', ['nArgs'=>"2"], "min_2" ],
  384. [ 'ogc:Function_Name', ['nArgs'=>"2"], "min_3" ],
  385. [ 'ogc:Function_Name', ['nArgs'=>"2"], "min_4" ],
  386. [ 'ogc:Function_Name', ['nArgs'=>"1"], "mincircle" ],
  387. [ 'ogc:Function_Name', ['nArgs'=>"1"], "minimumdiameter" ],
  388. [ 'ogc:Function_Name', ['nArgs'=>"1"], "minrectangle" ],
  389. [ 'ogc:Function_Name', ['nArgs'=>"2"], "modulo" ],
  390. [ 'ogc:Function_Name', ['nArgs'=>"2"], "MultiplyCoverages" ],
  391. [ 'ogc:Function_Name', ['nArgs'=>"3"], "Nearest" ],
  392. [ 'ogc:Function_Name', ['nArgs'=>"1"], "not" ],
  393. [ 'ogc:Function_Name', ['nArgs'=>"2"], "notEqualTo" ],
  394. [ 'ogc:Function_Name', ['nArgs'=>"2"], "numberFormat" ],
  395. [ 'ogc:Function_Name', ['nArgs'=>"5"], "numberFormat2" ],
  396. [ 'ogc:Function_Name', ['nArgs'=>"1"], "numGeometries" ],
  397. [ 'ogc:Function_Name', ['nArgs'=>"1"], "numInteriorRing" ],
  398. [ 'ogc:Function_Name', ['nArgs'=>"1"], "numPoints" ],
  399. [ 'ogc:Function_Name', ['nArgs'=>"1"], "octagonalenvelope" ],
  400. [ 'ogc:Function_Name', ['nArgs'=>"3"], "offset" ],
  401. [ 'ogc:Function_Name', ['nArgs'=>"2"], "overlaps" ],
  402. [ 'ogc:Function_Name', ['nArgs'=>"1"], "parameter" ],
  403. [ 'ogc:Function_Name', ['nArgs'=>"1"], "parseBoolean" ],
  404. [ 'ogc:Function_Name', ['nArgs'=>"1"], "parseDouble" ],
  405. [ 'ogc:Function_Name', ['nArgs'=>"1"], "parseInt" ],
  406. [ 'ogc:Function_Name', ['nArgs'=>"1"], "parseLong" ],
  407. [ 'ogc:Function_Name', ['nArgs'=>"0"], "pi" ],
  408. [ 'ogc:Function_Name', ['nArgs'=>"4"], "PointBuffers" ],
  409. [ 'ogc:Function_Name', ['nArgs'=>"2"], "pointN" ],
  410. [ 'ogc:Function_Name', ['nArgs'=>"7"], "PointStacker" ],
  411. [ 'ogc:Function_Name', ['nArgs'=>"6"], "PolygonExtraction" ],
  412. [ 'ogc:Function_Name', ['nArgs'=>"2"], "pow" ],
  413. [ 'ogc:Function_Name', ['nArgs'=>"1"], "property" ],
  414. [ 'ogc:Function_Name', ['nArgs'=>"1"], "PropertyExists" ],
  415. [ 'ogc:Function_Name', ['nArgs'=>"2"], "Quantile" ],
  416. [ 'ogc:Function_Name', ['nArgs'=>"3"], "Query" ],
  417. [ 'ogc:Function_Name', ['nArgs'=>"0"], "random" ],
  418. [ 'ogc:Function_Name', ['nArgs'=>"5"], "RangeLookup" ],
  419. [ 'ogc:Function_Name', ['nArgs'=>"1"], "RasterAsPointCollection" ],
  420. [ 'ogc:Function_Name', ['nArgs'=>"4"], "RasterZonalStatistics" ],
  421. [ 'ogc:Function_Name', ['nArgs'=>"5"], "Recode" ],
  422. [ 'ogc:Function_Name', ['nArgs'=>"2"], "RectangularClip" ],
  423. [ 'ogc:Function_Name', ['nArgs'=>"2"], "relate" ],
  424. [ 'ogc:Function_Name', ['nArgs'=>"3"], "relatePattern" ],
  425. [ 'ogc:Function_Name', ['nArgs'=>"3"], "Reproject" ],
  426. [ 'ogc:Function_Name', ['nArgs'=>"1"], "rint" ],
  427. [ 'ogc:Function_Name', ['nArgs'=>"1"], "round" ],
  428. [ 'ogc:Function_Name', ['nArgs'=>"1"], "round_2" ],
  429. [ 'ogc:Function_Name', ['nArgs'=>"1"], "roundDouble" ],
  430. [ 'ogc:Function_Name', ['nArgs'=>"6"], "ScaleCoverage" ],
  431. [ 'ogc:Function_Name', ['nArgs'=>"4"], "sdo_nn" ],
  432. [ 'ogc:Function_Name', ['nArgs'=>"2"], "setCRS" ],
  433. [ 'ogc:Function_Name', ['nArgs'=>"3"], "Simplify" ],
  434. [ 'ogc:Function_Name', ['nArgs'=>"1"], "sin" ],
  435. [ 'ogc:Function_Name', ['nArgs'=>"3"], "Snap" ],
  436. [ 'ogc:Function_Name', ['nArgs'=>"1"], "sqrt" ],
  437. [ 'ogc:Function_Name', ['nArgs'=>"2"], "StandardDeviation" ],
  438. [ 'ogc:Function_Name', ['nArgs'=>"1"], "startAngle" ],
  439. [ 'ogc:Function_Name', ['nArgs'=>"1"], "startPoint" ],
  440. [ 'ogc:Function_Name', ['nArgs'=>"1"], "strCapitalize" ],
  441. [ 'ogc:Function_Name', ['nArgs'=>"2"], "strConcat" ],
  442. [ 'ogc:Function_Name', ['nArgs'=>"2"], "strEndsWith" ],
  443. [ 'ogc:Function_Name', ['nArgs'=>"2"], "strEqualsIgnoreCase" ],
  444. [ 'ogc:Function_Name', ['nArgs'=>"2"], "strIndexOf" ],
  445. [ 'ogc:Function_Name', ['nArgs'=>"2"], "strLastIndexOf" ],
  446. [ 'ogc:Function_Name', ['nArgs'=>"1"], "strLength" ],
  447. [ 'ogc:Function_Name', ['nArgs'=>"2"], "strMatches" ],
  448. [ 'ogc:Function_Name', ['nArgs'=>"3"], "strPosition" ],
  449. [ 'ogc:Function_Name', ['nArgs'=>"4"], "strReplace" ],
  450. [ 'ogc:Function_Name', ['nArgs'=>"2"], "strStartsWith" ],
  451. [ 'ogc:Function_Name', ['nArgs'=>"3"], "strSubstring" ],
  452. [ 'ogc:Function_Name', ['nArgs'=>"2"], "strSubstringStart" ],
  453. [ 'ogc:Function_Name', ['nArgs'=>"1"], "strToLowerCase" ],
  454. [ 'ogc:Function_Name', ['nArgs'=>"1"], "strToUpperCase" ],
  455. [ 'ogc:Function_Name', ['nArgs'=>"1"], "strTrim" ],
  456. [ 'ogc:Function_Name', ['nArgs'=>"3"], "strTrim2" ],
  457. [ 'ogc:Function_Name', ['nArgs'=>"2"], "StyleCoverage" ],
  458. [ 'ogc:Function_Name', ['nArgs'=>"2"], "symDifference" ],
  459. [ 'ogc:Function_Name', ['nArgs'=>"1"], "tan" ],
  460. [ 'ogc:Function_Name', ['nArgs'=>"1"], "toDegrees" ],
  461. [ 'ogc:Function_Name', ['nArgs'=>"1"], "toRadians" ],
  462. [ 'ogc:Function_Name', ['nArgs'=>"2"], "touches" ],
  463. [ 'ogc:Function_Name', ['nArgs'=>"1"], "toWKT" ],
  464. [ 'ogc:Function_Name', ['nArgs'=>"2"], "Transform" ],
  465. [ 'ogc:Function_Name', ['nArgs'=>"2"], "union" ],
  466. [ 'ogc:Function_Name', ['nArgs'=>"2"], "UnionFeatureCollection" ],
  467. [ 'ogc:Function_Name', ['nArgs'=>"2"], "Unique" ],
  468. [ 'ogc:Function_Name', ['nArgs'=>"2"], "UniqueInterval" ],
  469. [ 'ogc:Function_Name', ['nArgs'=>"6"], "VectorToRaster" ],
  470. [ 'ogc:Function_Name', ['nArgs'=>"3"], "VectorZonalStatistics" ],
  471. [ 'ogc:Function_Name', ['nArgs'=>"1"], "vertices" ],
  472. [ 'ogc:Function_Name', ['nArgs'=>"2"], "within" ],
  473. ] ],
  474. ] ],
  475. ] ],
  476. ] ],
  477. ]);
  478. $xmlWriter->endElement();// WFS_Capabilities
  479. $xmlWriter->endDocument();
  480. exit;
  481. }
  482. }