[Commits] r1342 - in sandbox/camptocamp/geobretagne: lib/GeoExt/data tests/lib/GeoExt/data

commits at geoext.org commits at geoext.org
Thu Aug 27 16:26:13 CEST 2009


Author: fvanderbiest
Date: 2009-08-27 16:26:12 +0200 (Thu, 27 Aug 2009)
New Revision: 1342

Added:
   sandbox/camptocamp/geobretagne/lib/GeoExt/data/WFSCapabilitiesReader.js
   sandbox/camptocamp/geobretagne/lib/GeoExt/data/WFSCapabilitiesStore.js
   sandbox/camptocamp/geobretagne/tests/lib/GeoExt/data/WFSCapabilitiesReader.html
   sandbox/camptocamp/geobretagne/tests/lib/GeoExt/data/WFSCapabilitiesReader.js
Log:
applied patch A0 attached to ticket 10 (wfs capabilities reader and store) - missing files

Added: sandbox/camptocamp/geobretagne/lib/GeoExt/data/WFSCapabilitiesReader.js
===================================================================
--- sandbox/camptocamp/geobretagne/lib/GeoExt/data/WFSCapabilitiesReader.js	                        (rev 0)
+++ sandbox/camptocamp/geobretagne/lib/GeoExt/data/WFSCapabilitiesReader.js	2009-08-27 14:26:12 UTC (rev 1342)
@@ -0,0 +1,262 @@
+/**
+ * Copyright (c) 2008-2009 The Open Source Geospatial Foundation
+ * 
+ * Published under the BSD license.
+ * See http://svn.geoext.org/core/trunk/geoext/license.txt for the full text
+ * of the license.
+ */
+
+/**
+ * @include GeoExt/data/LayerRecord.js
+ */
+
+/** api: (define)
+ *  module = GeoExt.data
+ *  class = WFSCapabilitiesReader
+ *  base_link = `Ext.data.DataReader <http://extjs.com/deploy/dev/docs/?class=Ext.data.DataReader>`_
+ */
+Ext.namespace("GeoExt.data");
+
+/** api: constructor
+ *  .. class:: WFSCapabilitiesReader(meta, recordType)
+ *  
+ *      :param meta: ``Object`` Reader configuration.
+ *      :param recordType: ``Array | Ext.data.Record`` An array of field
+ *          configuration objects or a record object.  Default is
+ *          :class:`GeoExt.data.LayerRecord`.
+ *   
+ *      Data reader class to create an array of
+ *      :class:`GeoExt.data.LayerRecord` objects from a WFS GetCapabilities
+ *      response.
+ */
+GeoExt.data.WFSCapabilitiesReader = function(meta, recordType) {
+    meta = meta || {};
+    if(!meta.format) {
+        meta.format = new OpenLayers.Format.WFSCapabilities();
+    }
+    if(!(typeof recordType === "function")) {
+        recordType = GeoExt.data.LayerRecord.create(
+            recordType || meta.fields || [
+                {name: "name", type: "string"},
+                {name: "abstract", type: "string"}
+            ]
+        );
+    }
+    GeoExt.data.WFSCapabilitiesReader.superclass.constructor.call(
+        this, meta, recordType
+    );
+};
+
+Ext.extend(GeoExt.data.WFSCapabilitiesReader, Ext.data.DataReader, {
+
+    /** private: method[read]
+     *  :param request: ``Object`` The XHR object which contains the parsed XML
+     *      document.
+     *  :return: ``Object`` A data block which is used by an ``Ext.data.Store``
+     *      as a cache of ``Ext.data.Record`` objects.
+     */
+    read: function(request) {
+        var data = request.responseXML;
+        if(!data || !data.documentElement) {
+            data = request.responseText;
+        }
+        return this.readRecords(data);
+    },
+
+    /** private: method[readRecords]
+     *  :param data: ``DOMElement | String | Object`` A document element or XHR
+     *      response string.  As an alternative to fetching capabilities data
+     *      from a remote source, an object representing the capabilities can
+     *      be provided given that the structure mirrors that returned from the
+     *      capabilities parser.
+     *  :return: ``Object`` A data block which is used by an ``Ext.data.Store``
+     *      as a cache of ``Ext.data.Record`` objects.
+     *  
+     *  Create a data block containing Ext.data.Records from an XML document.
+     */
+    readRecords: function(data) {
+        if(typeof data === "string" || data.nodeType) {
+            data = this.meta.format.read(data);
+        }
+        var records = [], layer, l, parts, layerOptions, protocolOptions;
+        var featureTypes = data.featureTypeList.featureTypes;
+        var protocolDefaults = {
+            url: data.capability.request.getfeature.href.post
+        };
+        for(var i=0, len=featureTypes.length; i<len; i++) {
+            layer = featureTypes[i];
+            if(layer.name) {
+                // create protocol
+                parts = layer.name.split(":");
+                if (parts.length > 1) {
+                    protocolOptions = {
+                        featureType: parts[1],
+                        featurePrefix: parts[0]
+                    };
+                } else {
+                    protocolOptions = {
+                        featureType: parts[0],
+                        featurePrefix: null
+                    };
+                }
+                if(this.meta.protocolOptions) {
+                    Ext.apply(protocolOptions, this.meta.protocolOptions, 
+                        protocolDefaults);
+                } else {
+                    Ext.apply(protocolOptions, {}, protocolDefaults);
+                }
+                // create vector layer with protocol
+                layerOptions = {
+                    protocol: new OpenLayers.Protocol.WFS(protocolOptions),
+                    strategies: [new OpenLayers.Strategy.Fixed()]
+                };
+                if(this.meta.layerOptions) {
+                    Ext.apply(layerOptions, this.meta.layerOptions);
+                }
+                l = new OpenLayers.Layer.Vector(
+                    layer.title || layer.name, 
+                    layerOptions
+                );
+                records.push(new this.recordType(Ext.apply(layer, {
+                    layer: l
+                }), l.id));
+            }
+        }
+        return {
+            totalRecords: records.length,
+            success: true,
+            records: records
+        };
+    }
+});
+/**
+ * Copyright (c) 2008-2009 The Open Source Geospatial Foundation
+ * 
+ * Published under the BSD license.
+ * See http://svn.geoext.org/core/trunk/geoext/license.txt for the full text
+ * of the license.
+ */
+
+/**
+ * @include GeoExt/data/LayerRecord.js
+ */
+
+/** api: (define)
+ *  module = GeoExt.data
+ *  class = WFSCapabilitiesReader
+ *  base_link = `Ext.data.DataReader <http://extjs.com/deploy/dev/docs/?class=Ext.data.DataReader>`_
+ */
+Ext.namespace("GeoExt.data");
+
+/** api: constructor
+ *  .. class:: WFSCapabilitiesReader(meta, recordType)
+ *  
+ *      :param meta: ``Object`` Reader configuration.
+ *      :param recordType: ``Array | Ext.data.Record`` An array of field
+ *          configuration objects or a record object.  Default is
+ *          :class:`GeoExt.data.LayerRecord`.
+ *   
+ *      Data reader class to create an array of
+ *      :class:`GeoExt.data.LayerRecord` objects from a WFS GetCapabilities
+ *      response.
+ */
+GeoExt.data.WFSCapabilitiesReader = function(meta, recordType) {
+    meta = meta || {};
+    if(!meta.format) {
+        meta.format = new OpenLayers.Format.WFSCapabilities();
+    }
+    if(!(typeof recordType === "function")) {
+        recordType = GeoExt.data.LayerRecord.create(
+            recordType || meta.fields || [
+                {name: "name", type: "string"},
+                {name: "abstract", type: "string"}
+            ]
+        );
+    }
+    GeoExt.data.WFSCapabilitiesReader.superclass.constructor.call(
+        this, meta, recordType
+    );
+};
+
+Ext.extend(GeoExt.data.WFSCapabilitiesReader, Ext.data.DataReader, {
+
+    /** private: method[read]
+     *  :param request: ``Object`` The XHR object which contains the parsed XML
+     *      document.
+     *  :return: ``Object`` A data block which is used by an ``Ext.data.Store``
+     *      as a cache of ``Ext.data.Record`` objects.
+     */
+    read: function(request) {
+        var data = request.responseXML;
+        if(!data || !data.documentElement) {
+            data = request.responseText;
+        }
+        return this.readRecords(data);
+    },
+
+    /** private: method[readRecords]
+     *  :param data: ``DOMElement | String | Object`` A document element or XHR
+     *      response string.  As an alternative to fetching capabilities data
+     *      from a remote source, an object representing the capabilities can
+     *      be provided given that the structure mirrors that returned from the
+     *      capabilities parser.
+     *  :return: ``Object`` A data block which is used by an ``Ext.data.Store``
+     *      as a cache of ``Ext.data.Record`` objects.
+     *  
+     *  Create a data block containing Ext.data.Records from an XML document.
+     */
+    readRecords: function(data) {
+        if(typeof data === "string" || data.nodeType) {
+            data = this.meta.format.read(data);
+        }
+        var records = [], layer, l, parts, layerOptions, protocolOptions;
+        var featureTypes = data.featureTypeList.featureTypes;
+        var protocolDefaults = {
+            url: data.capability.request.getfeature.href.post
+        };
+        for(var i=0, len=featureTypes.length; i<len; i++) {
+            layer = featureTypes[i];
+            if(layer.name) {
+                // create protocol
+                parts = layer.name.split(":");
+                if (parts.length > 1) {
+                    protocolOptions = {
+                        featureType: parts[1],
+                        featurePrefix: parts[0]
+                    };
+                } else {
+                    protocolOptions = {
+                        featureType: parts[0],
+                        featurePrefix: null
+                    };
+                }
+                if(this.meta.protocolOptions) {
+                    Ext.apply(protocolOptions, this.meta.protocolOptions, 
+                        protocolDefaults);
+                } else {
+                    Ext.apply(protocolOptions, {}, protocolDefaults);
+                }
+                // create vector layer with protocol
+                layerOptions = {
+                    protocol: new OpenLayers.Protocol.WFS(protocolOptions),
+                    strategies: [new OpenLayers.Strategy.Fixed()]
+                };
+                if(this.meta.layerOptions) {
+                    Ext.apply(layerOptions, this.meta.layerOptions);
+                }
+                l = new OpenLayers.Layer.Vector(
+                    layer.title || layer.name, 
+                    layerOptions
+                );
+                records.push(new this.recordType(Ext.apply(layer, {
+                    layer: l
+                }), l.id));
+            }
+        }
+        return {
+            totalRecords: records.length,
+            success: true,
+            records: records
+        };
+    }
+});

Added: sandbox/camptocamp/geobretagne/lib/GeoExt/data/WFSCapabilitiesStore.js
===================================================================
--- sandbox/camptocamp/geobretagne/lib/GeoExt/data/WFSCapabilitiesStore.js	                        (rev 0)
+++ sandbox/camptocamp/geobretagne/lib/GeoExt/data/WFSCapabilitiesStore.js	2009-08-27 14:26:12 UTC (rev 1342)
@@ -0,0 +1,122 @@
+/**
+ * Copyright (c) 2008-2009 The Open Source Geospatial Foundation
+ * 
+ * Published under the BSD license.
+ * See http://svn.geoext.org/core/trunk/geoext/license.txt for the full text
+ * of the license.
+ */
+
+/**
+ * @include GeoExt/data/WFSCapabilitiesReader.js
+ */
+
+/** api: (define)
+ *  module = GeoExt.data
+ *  class = WFSCapabilitiesStore
+ *  base_link = `Ext.data.DataStore <http://extjs.com/deploy/dev/docs/?class=Ext.data.DataStore>`_
+ */
+Ext.namespace("GeoExt.data");
+
+/** api: constructor
+ *  .. class:: WFSCapabilitiesStore
+ *  
+ *      Small helper class to make creating stores for remote WFS layer data
+ *      easier.  The store is pre-configured with a built-in
+ *      ``Ext.data.HttpProxy`` and :class:`GeoExt.data.WFSCapabilitiesReader`.
+ *      The proxy is configured to allow caching and issues requests via GET.
+ *      If you require some other proxy/reader combination then you'll have to
+ *      configure this with your own proxy or create a basic
+ *      :class:`GeoExt.data.LayerStore` and configure as needed.
+ */
+
+/** api: config[format]
+ *  ``OpenLayers.Format``
+ *  A parser for transforming the XHR response into an array of objects
+ *  representing attributes.  Defaults to an ``OpenLayers.Format.WFSCapabilities``
+ *  parser.
+ */
+
+/** api: config[fields]
+ *  ``Array | Function``
+ *  Either an Array of field definition objects as passed to
+ *  ``Ext.data.Record.create``, or a record constructor created using
+ *  ``Ext.data.Record.create``.  Defaults to ``["name", "type"]``. 
+ */
+
+GeoExt.data.WFSCapabilitiesStore = function(c) {
+    c = c || {};
+    GeoExt.data.WFSCapabilitiesStore.superclass.constructor.call(
+        this,
+        Ext.apply(c, {
+            proxy: c.proxy || (!c.data ?
+                new Ext.data.HttpProxy({url: c.url, disableCaching: false, method: "GET"}) :
+                undefined
+            ),
+            reader: new GeoExt.data.WFSCapabilitiesReader(
+                c, c.fields
+            )
+        })
+    );
+};
+Ext.extend(GeoExt.data.WFSCapabilitiesStore, Ext.data.Store);
+/**
+ * Copyright (c) 2008-2009 The Open Source Geospatial Foundation
+ * 
+ * Published under the BSD license.
+ * See http://svn.geoext.org/core/trunk/geoext/license.txt for the full text
+ * of the license.
+ */
+
+/**
+ * @include GeoExt/data/WFSCapabilitiesReader.js
+ */
+
+/** api: (define)
+ *  module = GeoExt.data
+ *  class = WFSCapabilitiesStore
+ *  base_link = `Ext.data.DataStore <http://extjs.com/deploy/dev/docs/?class=Ext.data.DataStore>`_
+ */
+Ext.namespace("GeoExt.data");
+
+/** api: constructor
+ *  .. class:: WFSCapabilitiesStore
+ *  
+ *      Small helper class to make creating stores for remote WFS layer data
+ *      easier.  The store is pre-configured with a built-in
+ *      ``Ext.data.HttpProxy`` and :class:`GeoExt.data.WFSCapabilitiesReader`.
+ *      The proxy is configured to allow caching and issues requests via GET.
+ *      If you require some other proxy/reader combination then you'll have to
+ *      configure this with your own proxy or create a basic
+ *      :class:`GeoExt.data.LayerStore` and configure as needed.
+ */
+
+/** api: config[format]
+ *  ``OpenLayers.Format``
+ *  A parser for transforming the XHR response into an array of objects
+ *  representing attributes.  Defaults to an ``OpenLayers.Format.WFSCapabilities``
+ *  parser.
+ */
+
+/** api: config[fields]
+ *  ``Array | Function``
+ *  Either an Array of field definition objects as passed to
+ *  ``Ext.data.Record.create``, or a record constructor created using
+ *  ``Ext.data.Record.create``.  Defaults to ``["name", "type"]``. 
+ */
+
+GeoExt.data.WFSCapabilitiesStore = function(c) {
+    c = c || {};
+    GeoExt.data.WFSCapabilitiesStore.superclass.constructor.call(
+        this,
+        Ext.apply(c, {
+            proxy: c.proxy || (!c.data ?
+                new Ext.data.HttpProxy({url: c.url, disableCaching: false, method: "GET"}) :
+                undefined
+            ),
+            reader: new GeoExt.data.WFSCapabilitiesReader(
+                c, c.fields
+            )
+        })
+    );
+};
+Ext.extend(GeoExt.data.WFSCapabilitiesStore, Ext.data.Store);

Added: sandbox/camptocamp/geobretagne/tests/lib/GeoExt/data/WFSCapabilitiesReader.html
===================================================================
--- sandbox/camptocamp/geobretagne/tests/lib/GeoExt/data/WFSCapabilitiesReader.html	                        (rev 0)
+++ sandbox/camptocamp/geobretagne/tests/lib/GeoExt/data/WFSCapabilitiesReader.html	2009-08-27 14:26:12 UTC (rev 1342)
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html debug="true">
+  <head>
+    <script type="text/javascript" src="../../../../../ext/adapter/ext/ext-base.js"></script>
+    <script type="text/javascript" src="../../../../../ext/ext-all-debug.js"></script>
+
+    <script type="text/javascript" src="../../../../../openlayers/lib/OpenLayers.js"></script>
+    <script type="text/javascript" src="../../../../lib/GeoExt.js"></script>
+    <script type="text/javascript" src="WFSCapabilitiesReader.js"></script>
+
+    <script type="text/javascript">
+      
+        function test_constructor(t) {
+            t.plan(2);
+            var reader = new GeoExt.data.WFSCapabilitiesReader();
+
+            var fields = reader.recordType.prototype.fields;
+
+            // 1 test
+            t.eq(fields.items.length, 4, 'number of default items is correct');
+
+            var reader = new GeoExt.data.WFSCapabilitiesReader({},[
+                {name: "foo"},
+                {name: "bar"}
+            ]);
+
+            var fields = reader.recordType.prototype.fields;
+
+            //1 test
+            t.ok(fields.items[2].name == 'foo' &&
+                 fields.items[3].name == 'bar',
+                 'field values set from configuration are correct');
+        }
+        
+        function test_read(t) {
+            t.plan(7);
+
+            var reader = new GeoExt.data.WFSCapabilitiesReader();
+
+            var records = reader.read({responseXML : doc});
+
+            //1 test
+            t.eq(records.totalRecords, 5, 'readRecords returns correct number of records');
+            
+            var record = records.records[0];
+
+            //3 tests -- testing the fields of a record
+            t.eq(record.get("name"), "sf:archsites", "[0] correct layer name");
+            t.eq(record.get("title"), "Spearfish archeological sites", "[0] correct layer title");
+            t.eq(
+                record.get("abstract"),
+               "Sample data from GRASS, archeological sites location, Spearfish, South Dakota, USA",
+                "[0] correct layer abstract"
+            );
+
+            //3 tests -- Testing the layer field (and its default protocol)
+            var layer = record.get("layer");
+            t.eq(layer.CLASS_NAME, "OpenLayers.Layer.Vector", "[0] layer field is of type OpenLayers.Layer.Vector");
+            t.eq(layer.protocol.CLASS_NAME, "OpenLayers.Protocol.WFS.v1_0_0", "[0] protocol is of type OpenLayers.Protocol.WFS.v1_0_0");
+            t.eq(layer.protocol.url, "http://someserver.com:8080/geoserver/wfs?", "[0] protocol has correct URL");
+        }
+        
+    </script>
+  <body>
+    <div id="map"></div>
+  </body>
+</html>

Added: sandbox/camptocamp/geobretagne/tests/lib/GeoExt/data/WFSCapabilitiesReader.js
===================================================================
--- sandbox/camptocamp/geobretagne/tests/lib/GeoExt/data/WFSCapabilitiesReader.js	                        (rev 0)
+++ sandbox/camptocamp/geobretagne/tests/lib/GeoExt/data/WFSCapabilitiesReader.js	2009-08-27 14:26:12 UTC (rev 1342)
@@ -0,0 +1,329 @@
+var doc = (new OpenLayers.Format.XML).read(
+'<?xml version="1.0" encoding="UTF-8"?>'+
+'<WFS_Capabilities version="1.0.0" xsi:schemaLocation="http://www.opengis.net/wfs http://someserver.com:8080/geoserver/schemas/wfs/1.0.0/WFS-capabilities.xsd" xmlns="http://www.opengis.net/wfs" xmlns:cite="http://www.opengeospatial.net/cite" xmlns:it.geosolutions="http://www.geo-solutions.it" xmlns:tiger="http://www.census.gov" xmlns:sde="http://geoserver.sf.net" xmlns:topp="http://www.openplans.org/topp" xmlns:sf="http://www.openplans.org/spearfish" xmlns:nurc="http://www.nurc.nato.int" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'+
+    '<Service>'+
+        '<Name>WFS</Name>'+
+        '<Title>GeoServer Web Feature Service</Title>'+
+        '<Abstract>This is the reference implementation of WFS 1.0.0 and WFS 1.1.0, supports all WFS operations including Transaction.</Abstract>'+
+        '<Keywords>WFS, WMS, GEOSERVER</Keywords>'+
+        '<OnlineResource>http://someserver.com:8080/geoserver/wfs</OnlineResource>'+
+        '<Fees>NONE</Fees>'+
+        '<AccessConstraints>NONE</AccessConstraints>'+
+    '</Service>'+
+    '<Capability>'+
+        '<Request>'+
+            '<GetCapabilities>'+
+                '<DCPType>'+
+                    '<HTTP>'+
+                        '<Get onlineResource="http://someserver.com:8080/geoserver/wfs?request=GetCapabilities" />'+
+                    '</HTTP>'+
+                '</DCPType>'+
+                '<DCPType>'+
+                    '<HTTP>'+
+                        '<Post onlineResource="http://someserver.com:8080/geoserver/wfs?" />'+
+                    '</HTTP>'+
+                '</DCPType>'+
+            '</GetCapabilities>'+
+            '<DescribeFeatureType>'+
+                '<SchemaDescriptionLanguage>'+
+                    '<XMLSCHEMA />'+
+                '</SchemaDescriptionLanguage>'+
+                '<DCPType>'+
+                    '<HTTP>'+
+                        '<Get onlineResource="http://someserver.com:8080/geoserver/wfs?request=DescribeFeatureType" />'+
+                    '</HTTP>'+
+                '</DCPType>'+
+                '<DCPType>'+
+                    '<HTTP>'+
+                        '<Post onlineResource="http://someserver.com:8080/geoserver/wfs?" />'+
+                    '</HTTP>'+
+                '</DCPType>'+
+            '</DescribeFeatureType>'+
+            '<GetFeature>'+
+                '<ResultFormat>'+
+                    '<GML2 />'+
+                    '<SHAPE-ZIP />'+
+                    '<GEOJSON />'+
+                    '<csv />'+
+                    '<GML3 />'+
+                '</ResultFormat>'+
+                '<DCPType>'+
+                    '<HTTP>'+
+                        '<Get onlineResource="http://someserver.com:8080/geoserver/wfs?request=GetFeature" />'+
+                    '</HTTP>'+
+                '</DCPType>'+
+                '<DCPType>'+
+                    '<HTTP>'+
+                        '<Post onlineResource="http://someserver.com:8080/geoserver/wfs?" />'+
+                    '</HTTP>'+
+                '</DCPType>'+
+            '</GetFeature>'+
+            '<Transaction>'+
+                '<DCPType>'+
+                    '<HTTP>'+
+                        '<Get onlineResource="http://someserver.com:8080/geoserver/wfs?request=Transaction" />'+
+                    '</HTTP>'+
+                '</DCPType>'+
+                '<DCPType>'+
+                    '<HTTP>'+
+                        '<Post onlineResource="http://someserver.com:8080/geoserver/wfs?" />'+
+                    '</HTTP>'+
+                '</DCPType>'+
+            '</Transaction>'+
+            '<LockFeature>'+
+                '<DCPType>'+
+                    '<HTTP>'+
+                        '<Get onlineResource="http://someserver.com:8080/geoserver/wfs?request=LockFeature" />'+
+                    '</HTTP>'+
+                '</DCPType>'+
+                '<DCPType>'+
+                    '<HTTP>'+
+                        '<Post onlineResource="http://someserver.com:8080/geoserver/wfs?" />'+
+                    '</HTTP>'+
+                '</DCPType>'+
+            '</LockFeature>'+
+            '<GetFeatureWithLock>'+
+                '<ResultFormat>'+
+                    '<GML2 />'+
+                '</ResultFormat>'+
+                '<DCPType>'+
+                    '<HTTP>'+
+                        '<Get onlineResource="http://someserver.com:8080/geoserver/wfs?request=GetFeatureWithLock" />'+
+                    '</HTTP>'+
+                '</DCPType>'+
+                '<DCPType>'+
+                    '<HTTP>'+
+                        '<Post onlineResource="http://someserver.com:8080/geoserver/wfs?" />'+
+                    '</HTTP>'+
+                '</DCPType>'+
+            '</GetFeatureWithLock>'+
+        '</Request>'+
+    '</Capability>'+
+    '<FeatureTypeList>'+
+        '<Operations>'+
+            '<Query />'+
+            '<Insert />'+
+            '<Update />'+
+            '<Delete />'+
+            '<Lock />'+
+        '</Operations>'+
+        '<FeatureType>'+
+            '<Name>sf:archsites</Name>'+
+            '<Title>Spearfish archeological sites</Title>'+
+            '<Abstract>Sample data from GRASS, archeological sites location, Spearfish, South Dakota, USA</Abstract>'+
+            '<Keywords>archsites, spearfish, sfArchsites, archeology</Keywords>'+
+            '<SRS>EPSG:26713</SRS>'+
+            '<LatLongBoundingBox minx="-103.8725637911543" miny="44.37740330855979" maxx="-103.63794182141925" maxy="44.48804280772808" />'+
+        '</FeatureType>'+
+        '<FeatureType>'+
+            '<Name>sf:bugsites</Name>'+
+            '<Title>Spearfish bug locations</Title>'+
+            '<Abstract>Sample data from GRASS, bug sites location, Spearfish, South Dakota, USA</Abstract>'+
+            '<Keywords>spearfish, sfBugsites, insects, bugsites, tiger_beetles</Keywords>'+
+            '<SRS>EPSG:26713</SRS>'+
+            '<LatLongBoundingBox minx="-103.86796131703647" miny="44.373938816704396" maxx="-103.63773523234195" maxy="44.43418821380063" />'+
+        '</FeatureType>'+
+        '<FeatureType>'+
+            '<Name>sf:restricted</Name>'+
+            '<Title>Spearfish restricted areas</Title>'+
+            '<Abstract>Sample data from GRASS, restricted areas, Spearfish, South Dakota, USA</Abstract>'+
+            '<Keywords>spearfish, restricted, areas, sfRestricted</Keywords>'+
+            '<SRS>EPSG:26713</SRS>'+
+            '<LatLongBoundingBox minx="-103.85057172920756" miny="44.39436387625042" maxx="-103.74741494853805" maxy="44.48215752041131" />'+
+        '</FeatureType>'+
+        '<FeatureType>'+
+            '<Name>sf:roads</Name>'+
+            '<Title>Spearfish roads</Title>'+
+            '<Abstract>Sample data from GRASS, road layout, Spearfish, South Dakota, USA</Abstract>'+
+            '<Keywords>sfRoads, spearfish, roads</Keywords>'+
+            '<SRS>EPSG:26713</SRS>'+
+            '<LatLongBoundingBox minx="-103.87741691493184" miny="44.37087275281798" maxx="-103.62231404880659" maxy="44.50015918338962" />'+
+        '</FeatureType>'+
+        '<FeatureType>'+
+            '<Name>sf:streams</Name>'+
+            '<Title>Spearfish streams</Title>'+
+            '<Abstract>Sample data from GRASS, streams, Spearfish, South Dakota, USA</Abstract>'+
+            '<Keywords>spearfish, sfStreams, streams</Keywords>'+
+            '<SRS>EPSG:26713</SRS>'+
+            '<LatLongBoundingBox minx="-103.87789019829768" miny="44.372335260095554" maxx="-103.62287788915457" maxy="44.502218486214815" />'+
+        '</FeatureType>'+
+    '</FeatureTypeList>'+
+    '<ogc:Filter_Capabilities>'+
+        '<ogc:Spatial_Capabilities>'+
+            '<ogc:Spatial_Operators>'+
+                '<ogc:Disjoint />'+
+                '<ogc:Equals />'+
+                '<ogc:DWithin />'+
+                '<ogc:Beyond />'+
+                '<ogc:Intersect />'+
+                '<ogc:Touches />'+
+                '<ogc:Crosses />'+
+                '<ogc:Within />'+
+                '<ogc:Contains />'+
+                '<ogc:Overlaps />'+
+                '<ogc:BBOX />'+
+            '</ogc:Spatial_Operators>'+
+        '</ogc:Spatial_Capabilities>'+
+        '<ogc:Scalar_Capabilities>'+
+            '<ogc:Logical_Operators />'+
+            '<ogc:Comparison_Operators>'+
+                '<ogc:Simple_Comparisons />'+
+                '<ogc:Between />'+
+                '<ogc:Like />'+
+                '<ogc:NullCheck />'+
+            '</ogc:Comparison_Operators>'+
+            '<ogc:Arithmetic_Operators>'+
+                '<ogc:Simple_Arithmetic />'+
+                '<ogc:Functions>'+
+                    '<ogc:Function_Names>'+
+                        '<ogc:Function_Name nArgs="1">abs</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">abs_2</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">abs_3</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">abs_4</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">acos</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">Area</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">asin</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">atan</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">atan2</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="3">between</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">boundary</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">boundaryDimension</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">buffer</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="3">bufferWithSegments</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">ceil</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">centroid</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">classify</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">Collection_Average</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">Collection_Bounds</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">Collection_Count</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">Collection_Max</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">Collection_Median</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">Collection_Min</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">Collection_Sum</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">Collection_Unique</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">Concatenate</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">contains</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">convert</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">convexHull</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">cos</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">crosses</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">dateFormat</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">dateParse</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">difference</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">dimension</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">disjoint</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">distance</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">double2bool</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">endPoint</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">envelope</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">EqualInterval</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">equalsExact</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="3">equalsExactTolerance</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">equalTo</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">exp</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">exteriorRing</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">floor</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">geometryType</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">geomFromWKT</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">geomLength</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">getGeometryN</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">getX</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">getY</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">getZ</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">greaterEqualThan</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">greaterThan</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="0">id</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">IEEEremainder</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="3">if_then_else</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="11">in10</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="3">in2</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="4">in3</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="5">in4</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="6">in5</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="7">in6</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="8">in7</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="9">in8</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="10">in9</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">int2bbool</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">int2ddouble</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">interiorPoint</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">interiorRingN</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">intersection</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">intersects</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">isClosed</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">isEmpty</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">isLike</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">isNull</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">isRing</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">isSimple</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">isValid</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="3">isWithinDistance</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">length</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">lessEqualThan</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">lessThan</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">log</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">max</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">max_2</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">max_3</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">max_4</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">min</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">min_2</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">min_3</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">min_4</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">not</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">notEqualTo</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">numberFormat</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">numGeometries</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">numInteriorRing</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">numPoints</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">overlaps</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">parseBoolean</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">parseDouble</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">parseInt</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">parseLong</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="0">pi</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">pointN</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">pow</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">PropertyExists</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">Quantile</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="0">random</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">relate</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="3">relatePattern</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">rint</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">round</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">round_2</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">roundDouble</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">sin</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">sqrt</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">StandardDeviation</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">startPoint</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">strConcat</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">strEndsWith</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">strEqualsIgnoreCase</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">strIndexOf</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">strLastIndexOf</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">strLength</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">strMatches</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="4">strReplace</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">strStartsWith</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="3">strSubstring</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">strSubstringStart</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">strToLowerCase</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">strToUpperCase</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">strTrim</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">symDifference</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">tan</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">toDegrees</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">toRadians</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">touches</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="1">toWKT</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">union</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">UniqueInterval</ogc:Function_Name>'+
+                        '<ogc:Function_Name nArgs="2">within</ogc:Function_Name>'+
+                    '</ogc:Function_Names>'+
+                '</ogc:Functions>'+
+            '</ogc:Arithmetic_Operators>'+
+        '</ogc:Scalar_Capabilities>'+
+    '</ogc:Filter_Capabilities>'+
+'</WFS_Capabilities>'
+);
\ No newline at end of file



More information about the Commits mailing list