Hello All,
I'm trying to update one attribute value using Polygon Area in Edit Widget. I'm using before-apply-edits event to do so. For calculating area of polygon I'm using geometry service. Please find the code below:
onBeforeApplyEdits: function (evt) {
if (evt.adds != null) {
var feat = evt.adds[0];
var geometry = feat.geometry
var geometryService = new GeometryService("https://sampleserver6.arcgisonline.com/arcgis/rest/services/Utilities/Geometry/GeometryServer");
//geometryService.on("areas-and-lengths-complete", outputAreaAndLength);
var areasAndLengthParams = new AreasAndLengthsParameters();
areasAndLengthParams.areaUnit = GeometryService.UNIT_SQUARE_METERS;
areasAndLengthParams.calculationType = "planar";
geometryService.simplify([geometry], lang.hitch(this, function (simplifiedGeometries) {
areasAndLengthParams.polygons = simplifiedGeometries;
geometryService.areasAndLengths(areasAndLengthParams);
}));
geometryService.on("areas-and-lengths-complete", lang.hitch(this, function (evtObj) {
var result = evtObj.result;
console.log(result.areas[0]);
var feat = evt.adds[0];
area = result.areas[0];
feat.attributes.no_of_areas = Math.round(area / 25);
setTimeout(lang.hitch(this, function () {
evt.target.applyEdits(null, [feat], null);
}), 100);
debugger;
}));
}
},
Attributes are getting updated but unable to save. Please suggest how to proceed.
Regards,
Krish
Solved! Go to Solution.
Krish,
This is what I have working (tested):
add new requires:
define([
'dojo/_base/declare',
...
'esri/tasks/AreasAndLengthsParameters',
'esri/tasks/GeometryService'
],
function(declare,
...
AreasAndLengthsParameters, GeometryService) {
Attach the before edit event lines (30 - 39) in _getTemplatePicker:
_getTemplatePicker: function(layerInfos) {
this._layerObjectsParaForTempaltePicker = [];
array.forEach(layerInfos, function(layerInfo) {
if(layerInfo.featureLayer &&
layerInfo.featureLayer.getEditCapabilities &&
layerInfo.featureLayer.getEditCapabilities().canCreate) {
this._layerObjectsParaForTempaltePicker.push(layerInfo.featureLayer);
}
}, this);
// change string of templatePicker is empty
this._defaultTempaltePickerEmpeyStr =
esriBundle.widgets.templatePicker.creationDisabled;
if(this._canCreateLayersAreAllInvisibleFlag) {
esriBundle.widgets.templatePicker.creationDisabled =
this.nls.noCanCreateLayerAreCurrentlyVisible;
}
var bottomStyle = this._configEditor.toolbarVisible ? "" : "bottom: 0px";
var topStyle = this._configEditor.useFilterEdit ? "top: 115px" : "top: 18px";
var templatePicker = new TemplatePicker({
featureLayers: this._layerObjectsParaForTempaltePicker,
grouping: true,
rows: "auto",
columns: "auto",
style: bottomStyle + ";" + topStyle
}, html.create("div", {}, this.domNode));
templatePicker.startup();
templatePicker.on("selection-change", lang.hitch(this, function(evt){
var selected = evt.target.getSelected();
if (selected) {
var featureLayer = selected.featureLayer;
if(this.evtHandler){
this.evtHandler.remove();
}
this.evtHandler = on(featureLayer, 'before-apply-edits', lang.hitch(this, this.onBeforeApplyEdits));
}
}));
return templatePicker;
},
onBeforeApplyEdits function (I did make a change line 5):
onBeforeApplyEdits: function(evt) {
if(evt.adds != null) {
var feat = evt.adds[0];
var geometry = feat.geometry
var geometryService = jimuUtils.getArcGISDefaultGeometryService();
var areasAndLengthParams = new AreasAndLengthsParameters();
areasAndLengthParams.areaUnit = GeometryService.UNIT_SQUARE_METERS;
areasAndLengthParams.calculationType = "planar";
geometryService.simplify([geometry], lang.hitch(this, function(simplifiedGeometries) {
areasAndLengthParams.polygons = simplifiedGeometries;
geometryService.areasAndLengths(areasAndLengthParams);
}));
geometryService.on("areas-and-lengths-complete", lang.hitch(this, function(evtObj) {
var result = evtObj.result;
console.log(result.areas[0]);
var feat = evt.adds[0];
area = result.areas[0];
feat.attributes.no_of_areas = Math.round(area / 25);
setTimeout(lang.hitch(this, function() {
evt.target.applyEdits(null, [feat], null);
}), 100);
}));
}
}
Kirsh,
So are you saying it is failing at line 28?
Hi Robert,
Yes. applyEdits is not working and I don't see any errors in console. "areas-and-lengths-complete" is asynchronous and this fires after edits are completed.
Regards,
Krish
Krish,
Is it complaining that evt.target is undefined or null or that evt.target.applyEdits is not a function. What is the error?
Robert,
I don't see any error message. This lines runs but the attributes are not getting updated in the feature layer.
Krish,
Hmm.. Try adding this line 2 so we can be sure you still have a reference to a FeatureLayer:
setTimeout(lang.hitch(this, function () {
console.info(evt.target);
evt.target.applyEdits(null, [feat], null);
}), 100);
Krish,
So how are you testing that the edits are not getting applied?
Hi rscheitlinGISP,
After capturing new feature, I'm refreshing the browser and clicking on captured feature to see updated attributes in pop up.
Thanks,
Krish
Krish,
This is what I have working (tested):
add new requires:
define([
'dojo/_base/declare',
...
'esri/tasks/AreasAndLengthsParameters',
'esri/tasks/GeometryService'
],
function(declare,
...
AreasAndLengthsParameters, GeometryService) {
Attach the before edit event lines (30 - 39) in _getTemplatePicker:
_getTemplatePicker: function(layerInfos) {
this._layerObjectsParaForTempaltePicker = [];
array.forEach(layerInfos, function(layerInfo) {
if(layerInfo.featureLayer &&
layerInfo.featureLayer.getEditCapabilities &&
layerInfo.featureLayer.getEditCapabilities().canCreate) {
this._layerObjectsParaForTempaltePicker.push(layerInfo.featureLayer);
}
}, this);
// change string of templatePicker is empty
this._defaultTempaltePickerEmpeyStr =
esriBundle.widgets.templatePicker.creationDisabled;
if(this._canCreateLayersAreAllInvisibleFlag) {
esriBundle.widgets.templatePicker.creationDisabled =
this.nls.noCanCreateLayerAreCurrentlyVisible;
}
var bottomStyle = this._configEditor.toolbarVisible ? "" : "bottom: 0px";
var topStyle = this._configEditor.useFilterEdit ? "top: 115px" : "top: 18px";
var templatePicker = new TemplatePicker({
featureLayers: this._layerObjectsParaForTempaltePicker,
grouping: true,
rows: "auto",
columns: "auto",
style: bottomStyle + ";" + topStyle
}, html.create("div", {}, this.domNode));
templatePicker.startup();
templatePicker.on("selection-change", lang.hitch(this, function(evt){
var selected = evt.target.getSelected();
if (selected) {
var featureLayer = selected.featureLayer;
if(this.evtHandler){
this.evtHandler.remove();
}
this.evtHandler = on(featureLayer, 'before-apply-edits', lang.hitch(this, this.onBeforeApplyEdits));
}
}));
return templatePicker;
},
onBeforeApplyEdits function (I did make a change line 5):
onBeforeApplyEdits: function(evt) {
if(evt.adds != null) {
var feat = evt.adds[0];
var geometry = feat.geometry
var geometryService = jimuUtils.getArcGISDefaultGeometryService();
var areasAndLengthParams = new AreasAndLengthsParameters();
areasAndLengthParams.areaUnit = GeometryService.UNIT_SQUARE_METERS;
areasAndLengthParams.calculationType = "planar";
geometryService.simplify([geometry], lang.hitch(this, function(simplifiedGeometries) {
areasAndLengthParams.polygons = simplifiedGeometries;
geometryService.areasAndLengths(areasAndLengthParams);
}));
geometryService.on("areas-and-lengths-complete", lang.hitch(this, function(evtObj) {
var result = evtObj.result;
console.log(result.areas[0]);
var feat = evt.adds[0];
area = result.areas[0];
feat.attributes.no_of_areas = Math.round(area / 25);
setTimeout(lang.hitch(this, function() {
evt.target.applyEdits(null, [feat], null);
}), 100);
}));
}
}