| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- //OpenLayers.ProxyHost = "proxy.cgi?url=";
- OpenLayers.ProxyHost = "index.php?FUNCTION_INIT=OPEN_LAYERS_WPS&HEADER_NOT_INIT=YES&_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 = "<h3>Input:</h3>";
- 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<ii; ++i) {
- input = inputs[i];
- if (input.complexData) {
- var formats = input.complexData.supported.formats;
- if (formats["application/wkt"]) {
- addWKTInput(input);
- } else if (formats["text/xml; subtype=wfs-collection/1.0"]) {
- addWFSCollectionInput(input);
- } else if (formats["image/tiff"]) {
- addRasterInput(input);
- } else if (formats[sld]) {
- addXMLInput(input, sld);
- } else {
- supported = false;
- }
- } else if (input.boundingBoxData) {
- addBoundingBoxInput(input);
- } else if (input.literalData) {
- addLiteralInput(input);
- } else {
- supported = false;
- }
- if (input.minOccurs > 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 = '<span class="notsupported">' +
- "Sorry, the WPS builder does not support the selected process." +
- "</span>";
- }
- }
- // 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 = "<h3>Output:</h3>";
- 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 += "<textarea>" + response.responseText + "</textarea>";
- }
|