This sample demonstrates how to run a geoprocessing tool from a popup window. The popup class extends the default info window to provide additional capabilities including the ability to associate feature(s) with an info window. In this sample, a link is added to each popup window that use the Population geoprocessing service to calculate the population summary for the selected feature.
To run the geoprocessing task, a new link is added to the bottom of the popup in the 'actions list' section next to the zoom link. After creating the link, a function is registered that will run each time someone clicks on the link. The function, calculatePopulation, sets up and runs the geoprocessing task using the selected feature.
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"> <title>Extend Popup</title> <link rel="stylesheet" href="https://js.arcgis.com/3.29/esri/css/esri.css"> <style> html,body, #mapDiv{ height:100%; width:100%; margin:0; padding:0; } </style> <script src="https://js.arcgis.com/3.29/"></script> <script> var map; require([ "esri/map", "esri/arcgis/utils", "esri/tasks/Geoprocessor", "esri/tasks/GeometryService", "esri/tasks/BufferParameters", "esri/geometry/webMercatorUtils", "esri/SpatialReference", "esri/tasks/FeatureSet", "esri/symbols/SimpleFillSymbol", "esri/graphic", "esri/config", "dojo/dom-construct", "dojo/query", "dojo/on", "dojo/dom-attr", "dojo/dom", "esri/Color", "dojo/domReady!" ], function( Map, arcgisUtils, Geoprocessor, GeometryService, BufferParameters, webMercatorUtils, SpatialReference, FeatureSet, SimpleFillSymbol, Graphic, config, domConstruct, query, on, domAttr, dom, Color ) { //This service is for development and testing purposes only. We recommend that you create your own geometry service for use within your applications. config.defaults.geometryService = new GeometryService("https://sampleserver6.arcgisonline.com/arcgis/rest/services/Utilities/Geometry/GeometryServer"); config.defaults.io.proxyUrl = "/proxy/"; //create the map based on an arcgis online webmap id arcgisUtils.createMap("a193c5459e6e4fd99ebf09d893d65cf0", "mapDiv").then(function(response){ window.map = response.map; //setup the geoprocessing tool that will run when users click the new link. This tool //calculates the population in the specified area. window.gp = new Geoprocessor("https://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Population_World/GPServer/PopulationSummary"); //create a link that we'll the map's popup window. //The link section of the popup has a class called actionList assigned so we can //use dojo/query to find the elements with this class name. var link = domConstruct.create("a",{ "class": "action", "id": "statsLink", "innerHTML": "Population", //text that appears in the popup for the link "href": "javascript: void(0);" }, query(".actionList", window.map.infoWindow.domNode)[0]); //when the link is clicked register a function that will run on(link, "click", calculatePopulation); }); function calculatePopulation(evt){ //display a message so user knows something is happening domAttr.set(dom.byId("statsLink"), "innerHTML", "Calculating..."); //Get the feature associated with the displayed popup and use it as //input to the geoprocessing task. The geoprocessing task will calculate //population statistics for the area within the specified buffer distance. var feature = window.map.infoWindow.getSelectedFeature(); var param = new BufferParameters(); param.geometries = [webMercatorUtils.webMercatorToGeographic(feature.geometry)]; param.distances = [10]; //buffer distance param.unit = GeometryService.UNIT_KILOMETER; param.bufferSpatialReference = new SpatialReference({"wkid": 4326}); param.outSpatialReference = new SpatialReference({"wkid": 102100}); param.geodesic = true; config.defaults.geometryService.buffer(param, function(geometries){ var graphic = new Graphic(geometries[0]); graphic.setSymbol(new SimpleFillSymbol().setColor(new Color([0,255,255,0.25]))); window.map.graphics.add(graphic); //Use the buffered geometry as input to the GP task var featureSet = new FeatureSet(); featureSet.geometryType = "esriGeometryPolygon"; featureSet.features = [graphic]; var taskParams = { "inputPoly": featureSet }; window.gp.execute(taskParams, gpResultAvailable, gpFailure); }); } function gpResultAvailable(results, messages){ domAttr.set(dom.byId("statsLink"),"innerHTML", "Population"); //clear any existing features displayed in the popup window.map.infoWindow.clearFeatures(); //display the query results var content = ""; if(results.length > 0){ content = "Population = " + results[0].value.features[0].attributes.SUM; }else{ content = "No Results Found"; } window.map.infoWindow.setContent(content); } function gpFailure(error){ domAttr.set(dom.byId("statsLink"),"innerHTML", "Population"); var details = domConstruct.create("div", { "innerHTML": "Population = " + error }, query(".break", window.map.infoWindow.domNode)[0],"after" ); console.error("Error occurred: ", error); } }); </script> </head> <body> <div id="mapDiv"></div> </body> </html>