OpenLayers.ProxyHost = "proxy.cgi?url="; var wps = "http://demo.opengeo.org/geoserver/wps", capabilities, // the capabilities, read by Format.WPSCapabilities::read process; // the process description from Format.WPSDescribeProcess::read // get some capabilities getCapabilities(); // create the UI var layer = new OpenLayers.Layer.Vector("Scratchpad"); var toolbar = new OpenLayers.Control.EditingToolbar(layer); toolbar.addControls([new OpenLayers.Control.ModifyFeature(layer, { title: "Select feature" })]); var map = new OpenLayers.Map('map', { controls: [ toolbar, new OpenLayers.Control.ZoomPanel(), new OpenLayers.Control.PanPanel() ], layers: [ new OpenLayers.Layer.WMS( "OSM", "http://maps.opengeo.org/geowebcache/service/wms", {layers: "openstreetmap", format: "image/png"} ), layer ] }); map.zoomToMaxExtent(); // add behavior to html elements document.getElementById("processes").onchange = describeProcess; // using OpenLayers.Format.WPSCapabilities to read the capabilities function getCapabilities() { OpenLayers.Request.GET({ url: wps, params: { "SERVICE": "WPS", "REQUEST": "GetCapabilities" }, success: function(response){ capabilities = new OpenLayers.Format.WPSCapabilities().read( response.responseText ); var dropdown = document.getElementById("processes"); var offerings = capabilities.processOfferings, option; // populate the dropdown for (var p in offerings) { option = document.createElement("option"); option.innerHTML = offerings[p].identifier; option.value = p; dropdown.appendChild(option); } } }); } // using OpenLayers.Format.WPSDescribeProcess to get information about a // process function describeProcess() { var selection = this.options[this.selectedIndex].value; OpenLayers.Request.GET({ url: wps, params: { "SERVICE": "WPS", "REQUEST": "DescribeProcess", "VERSION": capabilities.version, "IDENTIFIER": selection }, success: function(response) { process = new OpenLayers.Format.WPSDescribeProcess().read( response.responseText ).processDescriptions[selection]; buildForm(); } }); } // dynamically create a form from the process description function buildForm() { document.getElementById("abstract").innerHTML = process["abstract"]; document.getElementById("input").innerHTML = "

Input:

"; document.getElementById("output").innerHTML = ""; var inputs = process.dataInputs, supported = true, sld = "text/xml; subtype=sld/1.0.0", input; for (var i=0,ii=inputs.length; i 0) { document.getElementById("input").appendChild(document.createTextNode("* ")); } } if (supported) { var executeButton = document.createElement("button"); executeButton.innerHTML = "Execute"; document.getElementById("input").appendChild(executeButton); executeButton.onclick = execute; } else { document.getElementById("input").innerHTML = '' + "Sorry, the WPS builder does not support the selected process." + ""; } } // helper function to dynamically create a textarea for geometry (WKT) data // input function addWKTInput(input, previousSibling) { var name = input.identifier; var container = document.getElementById("input"); var label = document.createElement("label"); label["for"] = name; label.title = input["abstract"]; label.innerHTML = name + " (select feature, then click field):"; previousSibling && previousSibling.nextSibling ? container.insertBefore(label, previousSibling.nextSibling) : container.appendChild(label); var field = document.createElement("textarea"); field.onclick = function () { if (layer.selectedFeatures.length) { this.innerHTML = new OpenLayers.Format.WKT().write( layer.selectedFeatures[0] ); } createCopy(input, this, addWKTInput); }; field.onblur = function() { input.data = field.value ? { complexData: { mimeType: "application/wkt", value: this.value } } : undefined; }; field.title = input["abstract"]; field.id = name; previousSibling && previousSibling.nextSibling ? container.insertBefore(field, previousSibling.nextSibling.nextSibling) : container.appendChild(field); } // helper function for xml input function addXMLInput(input, type) { var name = input.identifier; var field = document.createElement("input"); field.title = input["abstract"]; field.value = name + " (" + type + ")"; field.onblur = function() { input.data = field.value ? { complexData: { mimeType: type, value: this.value } } : undefined; }; document.getElementById("input").appendChild(field); } // helper function to dynamically create a WFS collection reference input function addWFSCollectionInput(input) { var name = input.identifier; var field = document.createElement("input"); field.title = input["abstract"]; field.value = name + " (layer on demo server)"; addValueHandlers(field, function() { input.reference = field.value ? { mimeType: "text/xml; subtype=wfs-collection/1.0", href: "http://geoserver/wfs", method: "POST", body: { wfs: { version: "1.0.0", outputFormat: "GML2", featureType: field.value } } } : undefined; }); document.getElementById("input").appendChild(field); } // helper function to dynamically create a raster (GeoTIFF) url input function addRasterInput(input) { var name = input.identifier; var field = document.createElement("input"); field.title = input["abstract"]; var url = window.location.href.split("?")[0]; field.value = url.substr(0, url.lastIndexOf("/")+1) + "data/tazdem.tiff"; document.getElementById("input").appendChild(field); (field.onblur = function() { input.reference = { mimeType: "image/tiff", href: field.value, method: "GET" }; })(); } // helper function to dynamically create a bounding box input function addBoundingBoxInput(input) { var name = input.identifier; var field = document.createElement("input"); field.title = input["abstract"]; field.value = "left,bottom,right,top (EPSG:4326)"; document.getElementById("input").appendChild(field); addValueHandlers(field, function() { input.boundingBoxData = { projection: "EPSG:4326", bounds: OpenLayers.Bounds.fromString(field.value) }; }); } // helper function to create a literal input textfield or dropdown function addLiteralInput(input, previousSibling) { var name = input.identifier; var container = document.getElementById("input"); var anyValue = input.literalData.anyValue; // anyValue means textfield, otherwise we create a dropdown var field = document.createElement(anyValue ? "input" : "select"); field.id = name; field.title = input["abstract"]; previousSibling && previousSibling.nextSibling ? container.insertBefore(field, previousSibling.nextSibling) : container.appendChild(field); if (anyValue) { var dataType = input.literalData.dataType; field.value = name + (dataType ? " (" + dataType + ")" : ""); addValueHandlers(field, function() { input.data = field.value ? { literalData: { value: field.value } } : undefined; createCopy(input, field, addLiteralInput); }); } else { var option; option = document.createElement("option"); option.innerHTML = name; field.appendChild(option); for (var v in input.literalData.allowedValues) { option = document.createElement("option"); option.value = v; option.innerHTML = v; field.appendChild(option); } field.onchange = function() { createCopy(input, field, addLiteralInput); input.data = this.selectedIndex ? { literalData: { value: this.options[this.selectedIndex].value } } : undefined; }; } } // if maxOccurs is > 1, this will add a copy of the field function createCopy(input, field, fn) { if (input.maxOccurs && input.maxOccurs > 1 && !field.userSelected) { // add another copy of the field - we don't check maxOccurs field.userSelected = true; var newInput = OpenLayers.Util.extend({}, input); // we recognize copies by the occurrence property newInput.occurrence = (input.occurrence || 0) + 1; process.dataInputs.push(newInput); fn(newInput, field); } } // helper function for adding events to form fields function addValueHandlers(field, onblur) { field.onclick = function() { if (!this.initialValue) { this.initialValue = this.value; this.value = ""; } }; field.onblur = function() { if (!this.value) { this.value = this.initialValue; delete this.initialValue; } onblur.apply(this, arguments); }; } // execute the process function execute() { var output = process.processOutputs[0]; var input; // remove occurrences that the user has not filled out for (var i=process.dataInputs.length-1; i>=0; --i) { input = process.dataInputs[i]; if ((input.minOccurs === 0 || input.occurrence) && !input.data && !input.reference) { OpenLayers.Util.removeItem(process.dataInputs, input); } } process.responseForm = { rawDataOutput: { identifier: output.identifier } }; if (output.complexOutput && output.complexOutput.supported.formats["application/wkt"]) { process.responseForm.rawDataOutput.mimeType = "application/wkt"; } OpenLayers.Request.POST({ url: wps, data: new OpenLayers.Format.WPSExecute().write(process), success: showOutput }); } // add the process's output to the page function showOutput(response) { var result = document.getElementById("output"); result.innerHTML = "

Output:

"; var features; var contentType = response.getResponseHeader("Content-Type"); if (contentType == "application/wkt") { features = new OpenLayers.Format.WKT().read(response.responseText); } else if (contentType == "text/xml; subtype=wfs-collection/1.0") { features = new OpenLayers.Format.WFST.v1_0_0().read(response.responseText); } if (features && (features instanceof OpenLayers.Feature.Vector || features.length)) { layer.addFeatures(features); result.innerHTML += "The result should also be visible on the map."; } result.innerHTML += ""; }