/** * Performs edits to the geodatabase powering the map service that this SOE * extends * * @param feature * @param featureJSON * @throws Exception */ private byte[] addFeature(JsonObject featureJSON, out IFeature feature) { feature = null; IDataset fsDataset = (IDataset)this.fc; IWorkspace ws = fsDataset.Workspace; IWorkspaceEdit wsEdit = (IWorkspaceEdit)ws; try { // start an edit transaction to add a new feature to feature class wsEdit.StartEditing(false); wsEdit.StartEditOperation(); feature = fc.CreateFeature(); // set attributes if (this.editLayerInfo == null) { this.editLayerInfo = this.layerInfos.get_Element(this.layerId); if (!this.editLayerInfo.IsFeatureLayer) { return createErrorObject( 403, "The layerId property of this SOE currently points to a layer (id: " + this.layerId + ") that is not a feature layer.", new String[] { "Only feature layers can be edited by this SOE.", "Modify SOE's layerId property using ArcGIS Manager or ArcGIS Desktop's Service Editor." }); } } IFields fields = this.editLayerInfo.Fields; JsonObject attributesJSON = null; featureJSON.TryGetJsonObject("attributes", out attributesJSON); System.Collections.IEnumerator itKeys = attributesJSON.GetEnumerator(); while (itKeys.MoveNext()) { KeyValuePair<string, object> kv = (KeyValuePair<string, object>)itKeys.Current; String key = kv.Key; int fieldId = fields.FindField(key); IField field = fields.get_Field(fieldId); object fieldValue = null; if (field.Editable) { //not using specific types based on field type, since can't assign value of any type to C# object attributesJSON.TryGetObject(key, out fieldValue); // set attribute field value feature.set_Value(fieldId, fieldValue); } } // retrieve geometry as json and convert it to ArcObject geometry JsonObject geometryJSON = null; featureJSON.TryGetJsonObject("geometry", out geometryJSON); IJSONConverterGeometry iConverter = new JSONConverterGeometryClass(); IJSONObject obj = new JSONObjectClass(); obj.ParseString(geometryJSON.ToJson()); IGeometry geometry = null; switch (this.fc.ShapeType) { case esriGeometryType.esriGeometryPoint: geometry = iConverter.ToPoint(obj); break; case esriGeometryType.esriGeometryMultipoint: geometry = iConverter.ToMultipoint(obj, false, false); break; case esriGeometryType.esriGeometryPolyline: geometry = iConverter.ToPolyline(obj, false, false); break; case esriGeometryType.esriGeometryPolygon: geometry = iConverter.ToPolygon(obj, false, false); break; } // set geometry feature.Shape = geometry; // store feature in feature class feature.Store(); // end edit transaction wsEdit.StopEditOperation(); wsEdit.StopEditing(true); } catch (Exception e) { if (wsEdit != null && wsEdit.IsBeingEdited()) { wsEdit.StopEditing(false); } return createErrorObject(500, "Error occured while editing layer " + this.layerId + ".", new String[] { "Error details:", e.Message }); } return Encoding.UTF8.GetBytes(System.Boolean.TrueString); }
/** * Performs edits to the geodatabase powering the map service that this SOE * extends * * @param feature * @param featureJSON * @throws Exception */ private byte[] addFeature(JsonObject featureJSON, out IFeature feature) { feature = null; IDataset fsDataset = (IDataset)this.fc; IWorkspace ws = fsDataset.Workspace; IWorkspaceEdit wsEdit = (IWorkspaceEdit)ws; try { // start an edit transaction to add a new feature to feature class wsEdit.StartEditing(false); wsEdit.StartEditOperation(); feature = fc.CreateFeature(); // set attributes if (this.editLayerInfo == null) { this.editLayerInfo = this.layerInfos.get_Element(this.layerId); if (!this.editLayerInfo.IsFeatureLayer) { return(createErrorObject( 403, "The layerId property of this SOE currently points to a layer (id: " + this.layerId + ") that is not a feature layer.", new String[] { "Only feature layers can be edited by this SOE.", "Modify SOE's layerId property using ArcGIS Manager or ArcGIS Desktop's Service Editor." })); } } IFields fields = this.editLayerInfo.Fields; JsonObject attributesJSON = null; featureJSON.TryGetJsonObject("attributes", out attributesJSON); System.Collections.IEnumerator itKeys = attributesJSON.GetEnumerator(); while (itKeys.MoveNext()) { KeyValuePair <string, object> kv = (KeyValuePair <string, object>)itKeys.Current; String key = kv.Key; int fieldId = fields.FindField(key); IField field = fields.get_Field(fieldId); object fieldValue = null; if (field.Editable) { //not using specific types based on field type, since can't assign value of any type to C# object attributesJSON.TryGetObject(key, out fieldValue); // set attribute field value feature.set_Value(fieldId, fieldValue); } } // retrieve geometry as json and convert it to ArcObject geometry JsonObject geometryJSON = null; featureJSON.TryGetJsonObject("geometry", out geometryJSON); IJSONConverterGeometry iConverter = new JSONConverterGeometryClass(); IJSONObject obj = new JSONObjectClass(); obj.ParseString(geometryJSON.ToJson()); IGeometry geometry = null; switch (this.fc.ShapeType) { case esriGeometryType.esriGeometryPoint: geometry = iConverter.ToPoint(obj); break; case esriGeometryType.esriGeometryMultipoint: geometry = iConverter.ToMultipoint(obj, false, false); break; case esriGeometryType.esriGeometryPolyline: geometry = iConverter.ToPolyline(obj, false, false); break; case esriGeometryType.esriGeometryPolygon: geometry = iConverter.ToPolygon(obj, false, false); break; } // set geometry feature.Shape = geometry; // store feature in feature class feature.Store(); // end edit transaction wsEdit.StopEditOperation(); wsEdit.StopEditing(true); } catch (Exception e) { if (wsEdit != null && wsEdit.IsBeingEdited()) { wsEdit.StopEditing(false); } feature = null; return(createErrorObject(500, "Error occured while editing layer " + this.layerId + ".", new String[] { "Error details:", e.Message })); } return(Encoding.UTF8.GetBytes(System.Boolean.TrueString)); }