diff --git a/examples/openls.html b/examples/openls.html new file mode 100644 index 0000000000..f63ec73734 --- /dev/null +++ b/examples/openls.html @@ -0,0 +1,86 @@ + + + + + + + OpenLS: Geocoding Example + + + + +

OpenLS Geocoding Example

+ +
+ OpenLS, XLS, Geocoding +
+ +

+ Show how to use an OpenLS service. +

+ +
+ + +
+ +
+ +
+ + +
+

+ Geocoding example using the http://www.openrouteservice.org/ OpenLS service. Recenter to the first item of the results. +

+
+ + diff --git a/examples/proxy.cgi b/examples/proxy.cgi index 160bf4075f..c668218c48 100755 --- a/examples/proxy.cgi +++ b/examples/proxy.cgi @@ -21,7 +21,7 @@ allowedHosts = ['www.openlayers.org', 'openlayers.org', 'sigma.openplans.org', 'demo.opengeo.org', 'www.openstreetmap.org', 'sample.azavea.com', 'v2.suite.opengeo.org', 'v-swe.uni-muenster.de:8080', - 'vmap0.tiles.osgeo.org'] + 'vmap0.tiles.osgeo.org', 'www.openrouteservice.org'] method = os.environ["REQUEST_METHOD"] diff --git a/lib/OpenLayers.js b/lib/OpenLayers.js index a62851f2ad..c85edce09d 100644 --- a/lib/OpenLayers.js +++ b/lib/OpenLayers.js @@ -329,6 +329,9 @@ "OpenLayers/Format/OWSContext/v0_3_1.js", "OpenLayers/Format/WMTSCapabilities.js", "OpenLayers/Format/WMTSCapabilities/v1_0_0.js", + "OpenLayers/Format/XLS.js", + "OpenLayers/Format/XLS/v1.js", + "OpenLayers/Format/XLS/v1_1_0.js", "OpenLayers/Layer/WFS.js", "OpenLayers/Control/GetFeature.js", "OpenLayers/Control/MouseToolbar.js", diff --git a/lib/OpenLayers/Format/XLS.js b/lib/OpenLayers/Format/XLS.js new file mode 100644 index 0000000000..15962e9f1b --- /dev/null +++ b/lib/OpenLayers/Format/XLS.js @@ -0,0 +1,118 @@ +/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for + * full list of contributors). Published under the Clear BSD license. + * See http://svn.openlayers.org/trunk/openlayers/license.txt for the + * full text of the license. */ + +/** + * @requires OpenLayers/Format/XML.js + */ + +/** + * Class: OpenLayers.Format.XLS + * Read/Wite XLS (OpenLS). Create a new instance with the + * constructor. Currently only implemented for Location Utility Services, more + * specifically only for Geocoding. No support for Reverse Geocoding as yet. + * + * Inherits from: + * - + */ +OpenLayers.Format.XLS = OpenLayers.Class(OpenLayers.Format.XML, { + + /** + * APIProperty: defaultVersion + * {String} Version number to assume if none found. Default is "1.1.0". + */ + defaultVersion: "1.1.0", + + /** + * APIProperty: version + * {String} Specify a version string if one is known. + */ + version: null, + + /** + * Property: parser + * {Object} Instance of the versioned parser. Cached for multiple read and + * write calls of the same version. + */ + parser: null, + + /** + * Constructor: OpenLayers.Format.XLS + * Create a new parser for XLS. + * + * Parameters: + * options - {Object} An optional object whose properties will be set on + * this instance. + */ + initialize: function(options) { + OpenLayers.Format.XML.prototype.initialize.apply(this, [options]); + }, + + /** + * APIMethod: write + * Write out an XLS request. + * + * Parameters: + * request - {Object} An object representing the LUS request. + * options - {Object} Optional configuration object. + * + * Returns: + * {String} An XLS document string. + */ + write: function(request, options) { + var version = (options && options.version) || + this.version || this.defaultVersion; + if(!this.parser || this.parser.VERSION != version) { + var format = OpenLayers.Format.XLS[ + "v" + version.replace(/\./g, "_") + ]; + if(!format) { + throw "Can't find an XLS parser for version " + + version; + } + this.parser = new format(this.options); + } + var root = this.parser.write(request); + return OpenLayers.Format.XML.prototype.write.apply(this, [root]); + }, + + /** + * APIMethod: read + * Read an XLS doc and return an object representing the result. + * + * Parameters: + * data - {String | DOMElement} Data to read. + * options - {Object} Options for the reader. + * + * Returns: + * {Object} An object representing the GeocodeResponse. + */ + read: function(data, options) { + if(typeof data == "string") { + data = OpenLayers.Format.XML.prototype.read.apply(this, [data]); + } + var root = data.documentElement; + var version = this.version; + if(!version) { + version = root.getAttribute("version"); + if(!version) { + version = this.defaultVersion; + } + } + if(!this.parser || this.parser.VERSION != version) { + var format = OpenLayers.Format.XLS[ + "v" + version.replace(/\./g, "_") + ]; + if(!format) { + throw "Can't find an XLS parser for version " + + version; + } + this.parser = new format(this.options); + } + var xls = this.parser.read(data, options); + return xls; + }, + + CLASS_NAME: "OpenLayers.Format.XLS" +}); diff --git a/lib/OpenLayers/Format/XLS/v1.js b/lib/OpenLayers/Format/XLS/v1.js new file mode 100644 index 0000000000..2ccb2c6677 --- /dev/null +++ b/lib/OpenLayers/Format/XLS/v1.js @@ -0,0 +1,307 @@ +/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for + * full list of contributors). Published under the Clear BSD license. + * See http://svn.openlayers.org/trunk/openlayers/license.txt for the + * full text of the license. */ + +/** + * @requires OpenLayers/Format/XLS.js + * @requires OpenLayers/Format/GML/v3.js + */ + +/** + * Class: OpenLayers.Format.XLS.v1 + * Superclass for XLS version 1 parsers. Only supports GeocodeRequest for now. + * + * Inherits from: + * - + */ +OpenLayers.Format.XLS.v1 = OpenLayers.Class(OpenLayers.Format.XML, { + + /** + * Property: namespaces + * {Object} Mapping of namespace aliases to namespace URIs. + */ + namespaces: { + xls: "http://www.opengis.net/xls", + gml: "http://www.opengis.net/gml", + xsi: "http://www.w3.org/2001/XMLSchema-instance" + }, + + /** + * Property: regExes + * Compiled regular expressions for manipulating strings. + */ + regExes: { + trimSpace: (/^\s*|\s*$/g), + removeSpace: (/\s*/g), + splitSpace: (/\s+/), + trimComma: (/\s*,\s*/g) + }, + + /** + * APIProperty: xy + * {Boolean} Order of the GML coordinate true:(x,y) or false:(y,x) + * Changing is not recommended, a new Format should be instantiated. + */ + xy: true, + + /** + * Property: defaultPrefix + */ + defaultPrefix: "xls", + + /** + * Property: schemaLocation + * {String} Schema location for a particular minor version. + */ + schemaLocation: null, + + /** + * Constructor: OpenLayers.Format.XLS.v1 + * Instances of this class are not created directly. Use the + * constructor instead. + * + * Parameters: + * options - {Object} An optional object whose properties will be set on + * this instance. + */ + initialize: function(options) { + OpenLayers.Format.XML.prototype.initialize.apply(this, [options]); + }, + + /** + * Method: read + * + * Parameters: + * data - {DOMElement} An XLS document element. + * options - {Object} Options for the reader. + * + * Returns: + * {Object} An object representing the XLSResponse. + */ + read: function(data, options) { + options = OpenLayers.Util.applyDefaults(options, this.options); + var xls = {}; + this.readChildNodes(data, xls); + return xls; + }, + + /** + * Property: readers + * Contains public functions, grouped by namespace prefix, that will + * be applied when a namespaced node is found matching the function + * name. The function will be applied in the scope of this parser + * with two arguments: the node being read and a context object passed + * from the parent. + */ + readers: { + "xls": { + "XLS": function(node, xls) { + xls.version = node.getAttribute("version"); + this.readChildNodes(node, xls); + }, + "Response": function(node, xls) { + this.readChildNodes(node, xls); + }, + "GeocodeResponse": function(node, xls) { + xls.responseLists = []; + this.readChildNodes(node, xls); + }, + "GeocodeResponseList": function(node, xls) { + var responseList = { + features: [], + numberOfGeocodedAddresses: + parseInt(node.getAttribute("numberOfGeocodedAddresses")) + }; + xls.responseLists.push(responseList); + this.readChildNodes(node, responseList); + }, + "GeocodedAddress": function(node, responseList) { + var feature = new OpenLayers.Feature.Vector(); + responseList.features.push(feature); + this.readChildNodes(node, feature); + // post-process geometry + feature.geometry = feature.components[0]; + }, + "GeocodeMatchCode": function(node, feature) { + feature.attributes.matchCode = { + accuracy: parseFloat(node.getAttribute("accuracy")), + matchType: node.getAttribute("matchType") + }; + }, + "Address": function(node, feature) { + var address = { + countryCode: node.getAttribute("countryCode"), + addressee: node.getAttribute("addressee"), + street: [], + place: [] + }; + feature.attributes.address = address; + this.readChildNodes(node, address); + }, + "freeFormAddress": function(node, address) { + address.freeFormAddress = this.getChildValue(node); + }, + "StreetAddress": function(node, address) { + this.readChildNodes(node, address); + }, + "Building": function(node, address) { + address.building = { + 'number': node.getAttribute("number"), + subdivision: node.getAttribute("subdivision"), + buildingName: node.getAttribute("buildingName") + }; + }, + "Street": function(node, address) { + // only support the built-in primitive type for now + address.street.push(this.getChildValue(node)); + }, + "Place": function(node, address) { + // type is one of CountrySubdivision, + // CountrySecondarySubdivision, Municipality or + // MunicipalitySubdivision + address.place[node.getAttribute("type")] = + this.getChildValue(node); + }, + "PostalCode": function(node, address) { + address.postalCode = this.getChildValue(node); + } + }, + "gml": OpenLayers.Format.GML.v3.prototype.readers.gml + }, + + /** + * Method: write + * + * Parameters: + * request - {Object} An object representing the geocode request. + * + * Returns: + * {DOMElement} The root of an XLS document. + */ + write: function(request) { + return this.writers.xls.XLS.apply(this, [request]); + }, + + /** + * Property: writers + * As a compliment to the readers property, this structure contains public + * writing functions grouped by namespace alias and named like the + * node names they produce. + */ + writers: { + "xls": { + "XLS": function(request) { + var root = this.createElementNSPlus( + "xls:XLS", + {attributes: { + "version": this.VERSION, + "xsi:schemaLocation": this.schemaLocation + }} + ); + this.writeNode("RequestHeader", request.header, root); + this.writeNode("Request", request, root); + return root; + }, + "RequestHeader": function(header) { + return this.createElementNSPlus("xls:RequestHeader"); + }, + "Request": function(request) { + var node = this.createElementNSPlus("xls:Request", { + attributes: { + methodName: "GeocodeRequest", + requestID: request.requestID || "", + version: this.VERSION + } + }); + this.writeNode("GeocodeRequest", request.addresses, node); + return node; + }, + "GeocodeRequest": function(addresses) { + var node = this.createElementNSPlus("xls:GeocodeRequest"); + for (var i=0, len=addresses.length; i + */ +OpenLayers.Format.XLS.v1_1_0 = OpenLayers.Class( + OpenLayers.Format.XLS.v1, { + + /** + * Constant: VERSION + * {String} 1.1 + */ + VERSION: "1.1", + + /** + * Property: schemaLocation + * {String} http://www.opengis.net/xls + * http://schemas.opengis.net/ols/1.1.0/LocationUtilityService.xsd + */ + schemaLocation: "http://www.opengis.net/xls http://schemas.opengis.net/ols/1.1.0/LocationUtilityService.xsd", + + /** + * Constructor: OpenLayers.Format.XLS.v1_1_0 + * Instances of this class are not created directly. Use the + * constructor instead. + * + * Parameters: + * options - {Object} An optional object whose properties will be set on + * this instance. + */ + initialize: function(options) { + OpenLayers.Format.XLS.v1.prototype.initialize.apply( + this, [options] + ); + }, + + CLASS_NAME: "OpenLayers.Format.XLS.v1_1_0" + +}); + +// Support non standard implementation +OpenLayers.Format.XLS.v1_1 = OpenLayers.Format.XLS.v1_1_0; diff --git a/tests/Format/XLS/v1_1_0.html b/tests/Format/XLS/v1_1_0.html new file mode 100644 index 0000000000..8a744f9d5c --- /dev/null +++ b/tests/Format/XLS/v1_1_0.html @@ -0,0 +1,98 @@ + + + + + + + + diff --git a/tests/list-tests.html b/tests/list-tests.html index 65e12230a4..24cd93ba9a 100644 --- a/tests/list-tests.html +++ b/tests/list-tests.html @@ -103,6 +103,7 @@
  • Format/SOSGetObservation.html
  • Format/SOSGetFeatureOfInterest.html
  • Format/OWSContext/v0_3_1.html
  • +
  • Format/XLS/v1_1_0.html
  • Format/XML.html
  • Geometry.html
  • Geometry/Collection.html