My web app allow users to edit existing polygon features using the attribute inspector. I have been trying to use a query to create a summary statistics to report back the count of a specific attribute name. The app currently display the count of a specific feature but it does not automatically update when a change is made to the feature using the attribute inspector. How can I get the query to automatically update the statistics after each change in the attribute.
Here is part of my code:
var blocks = new FeatureLayer("http://gis.dekalb.k12.ga.us/arcgis_webadapter/rest/services/Redistricting/ES_Areas_Redist_Test/FeatureServer/0", {
mode: FeatureLayer.MODE_SNAPSHOT,
outFields: ["ES_Name", "ES_City", "DDP_ES_Name"]
});
var selectionSymbol = new SimpleFillSymbol().setColor(new Color([255, 255, 255, 0.5]));
blocks.setSelectionSymbol(selectionSymbol);
blocks.setRenderer(renderer);
map.addLayers([blocks]);
map.on("layers-add-result", initSelectToolbar);
//Code to store names for the query click
map.infoWindow.on('show', function(evt) {
setTimeout(function() {
var node = dojoQuery('.atiField', evt.domNode);
if (!node) {
return;
}
var selectWid = registry.getEnclosingWidget(node[1]);
//console.info(selectWid.get("store"));
var oNames = [];
array.map(uNames, function(fName) {
oNames.push({
id: fName,
name: fName
});
});
var data = {
label: 'name',
items: oNames
};
var store = new Memory({
data: data
});
selectWid.setAttribute("store", store);
}, 800);
});
function initSelectToolbar(evt) {
var blocks = evt.layers[0].layer;
var selectQuery = new Query();
map.on("click", function(evt) {
map.infoWindow.hide();
selectQuery.outFields = ["*"];
selectQuery.geometry = evt.mapPoint;
selectQuery.returnGeometry = true;
blocks.selectFeatures(selectQuery, FeatureLayer.SELECTION_NEW, function(features) {
uNames = [];
if (features.length > 0) {
var attrQuery = new Query();
attrQuery.geometry = features[0].geometry;
attrQuery.outFields = ["ES_Name"];
attrQuery.returnGeometry = false;
attrQuery.spatialRelationship = Query.SPATIAL_REL_TOUCHES;
blocks.queryFeatures(attrQuery, function(fset) {
array.map(fset.features, function(feat) {
var fname = feat.attributes.ES_Name;
if (uNames.indexOf(fname) === -1) {
uNames.push(fname);
}
});
});
//store the current feature
updateFeature = features[0];
title = "Study Area is " + features[0].attributes.DDP_ES_Name //InfoWindow Title with Attribute Name
map.infoWindow.setTitle(title);
map.infoWindow.show(evt.screenPoint, map.getInfoWindowAnchor(evt.screenPoint));
} else {
map.infoWindow.hide();
}
});
});
map.infoWindow.on("hide", function() {
blocks.clearSelection();
});
var layerInfos = [{
'featureLayer': blocks,
'showAttachments': false,
'isEditable': true,
'fieldInfos': [{
'fieldName': 'ES_City',
'isEditable': false,
'label': 'Current School:'
}, {
'fieldName': 'ES_Name',
'isEditable': true,
'label': 'Proposed School:'
}]
}];
//Initialize Attribute Inspector
var attInspector = new AttributeInspector({
layerInfos: layerInfos
}, domConstruct.create("div"));
//add an apply button for any changes
var saveButton = new Button({
label: "Apply",
"class": "saveButton"
}, domConstruct.create("div"));
domConstruct.place(saveButton.domNode, attInspector.deleteBtn.domNode, "after");
saveButton.on("click", function() {
updateFeature.getLayer().applyEdits(null, [updateFeature], null, function(result) {
console.log(result);
}, function(error) {
console.log(error);
});
map.infoWindow.hide();
blocks.clearSelection(selectionSymbol);
});
attInspector.on("attribute-change", function(evt) {
//store the updates to apply when the save button is clicked
updateFeature.attributes[evt.fieldName] = evt.fieldValue;
});
map.infoWindow.setContent(attInspector.domNode);
map.infoWindow.resize(350, 240);
}
map.on("update-end", function() {
var sqlExpression = "ES_Name";
// Object used to request the count of all block groups
var countStatDef = new StatisticDefinition();
countStatDef.statisticType = "count";
countStatDef.onStatisticField = sqlExpression;
countStatDef.outStatisticFieldName = "numBlockGroups";
var queryParams = new Query();
queryParams.where = "ES_Name = 'North'";
queryParams.outFields = ["*"];
queryParams.returnGeometry = true;
queryParams.outStatistics = [countStatDef];
blocks.queryFeatures(queryParams, showResults);
function showResults(results) {
// The return object of the query containing the statistics requested
var stats = results.features[0].attributes
dom.byId("countResult").innerHTML = Math.round(stats.numBlockGroups);
}
})