/// <summary> /// Saves the spatial and attribute data to a geodatabase. /// </summary> /// <param name="featureMemberElements">The root node of the feature element list</param> /// <param name="envelope"></param> public void SaveFeatureMembers(IEnumerable <XElement> featureMemberElements, IEnvelope envelope) { // ReSharper disable PossibleMultipleEnumeration if ((featureMemberElements != null) && featureMemberElements.Any()) { if (FeatureClass == null) { IMappedFeature feature = CreateMappedFeature(null); XName name = feature.Name; foreach (var featureMemberElement in featureMemberElements) { IEnumerable <XElement> mappedFeatureElements = featureMemberElement.Descendants(name); foreach (var mappedFeatureElement in mappedFeatureElements) { CreateMappedFeature(mappedFeatureElement); } } if (FeatureClass != null) { var featureLayer = _layer as FeatureLayer; if (featureLayer != null) { featureLayer.FeatureClass = FeatureClass; } } } IMappedFeature mapFeature = CreateMappedFeature(null); var fieldIds = mapFeature.Fields.ToDictionary(field => FeatureClass.FindField(field.Key), field => field.Key); string idField = mapFeature.ObjectId; XName objectName = mapFeature.Name; IFeatureWorkspace featureWorkspace = _cycloMediaGroupLayer.FeatureWorkspace; var workspaceEdit = featureWorkspace as IWorkspaceEdit; var spatialCacheManager = featureWorkspace as ISpatialCacheManager3; if (workspaceEdit != null) { var exists = new Dictionary <string, IFeature>(); if (FeatureClass != null) { ISpatialFilter spatialFilter = new SpatialFilterClass { Geometry = envelope, GeometryField = FeatureClass.ShapeFieldName, SpatialRel = esriSpatialRelEnum.esriSpatialRelContains, SubFields = idField }; workspaceEdit.StartEditing(false); var existsResult = FeatureClass.Search(spatialFilter, false); var existsCount = FeatureClass.FeatureCount(spatialFilter); var imId = existsResult.FindField(idField); // ReSharper disable UseIndexedProperty for (int i = 0; i < existsCount; i++) { IFeature feature = existsResult.NextFeature(); var recValue = feature.get_Value(imId) as string; if ((recValue != null) && (!exists.ContainsKey(recValue))) { exists.Add(recValue, feature); } } } if (FeatureClass != null) { foreach (XElement featureMemberElement in featureMemberElements) { IEnumerable <XElement> mappedFeatureElements = featureMemberElement.Descendants(objectName); foreach (var mappedFeatureElement in mappedFeatureElements) { IMappedFeature mappedFeature = CreateMappedFeature(mappedFeatureElement); if (mappedFeature.Shape != null) { if (mappedFeature.Shape.Type == ShapeType.Point) { if (!exists.ContainsKey((string)mappedFeature.FieldToItem(idField))) { var shapePoint = mappedFeature.Shape as ShapePoint; if ((shapePoint != null) && Filter(mappedFeature)) { IPoint point = new Point(); point.PutCoords(shapePoint.X, shapePoint.Y); IFeature feature = FeatureClass.CreateFeature(); feature.Shape = point; foreach (var fieldId in fieldIds) { feature.set_Value(fieldId.Key, mappedFeature.FieldToItem(fieldId.Value)); } feature.Store(); } } else { if (Filter(mappedFeature)) { exists.Remove((string)mappedFeature.FieldToItem(idField)); } } } } } } } foreach (var feature in exists) { feature.Value.Delete(); } workspaceEdit.StopEditing(true); if ((spatialCacheManager != null) && (envelope != null)) { spatialCacheManager.FillCache(envelope); } // ReSharper restore UseIndexedProperty } } // ReSharper restore PossibleMultipleEnumeration }