public class MyMemoryWorkspace : IDisposable
{
public static IWorkspace MyWorkspace { get; private set; }
private readonly Dictionary<string, IFeatureClass> _featureClasses;
public MyMemoryWorkspace()
{
_featureClasses = new Dictionary<string, IFeatureClass>();
}
public MyMemoryWorkspace CreateMemoryWorkspace(string memoryWorkspaceName = "memoryWorkspace")
{
Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.InMemoryWorkspaceFactory");
IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)
Activator.CreateInstance(factoryType);
IWorkspaceName workspaceName = workspaceFactory.Create("", memoryWorkspaceName,
null, 0);
IName name = (IName)workspaceName;
MyWorkspace = (IWorkspace)name.Open();
return this;
}
public MyMemoryWorkspace CreateMemoryFeatureClass(string dataSetName,
string aliasName,
ISpatialReference spatialRef,
esriGeometryType geometryType,
IFields propertyFields)
{
IField oField = new FieldClass();
IFields oFields = new FieldsClass();
IFieldsEdit oFieldsEdit = null;
IFieldEdit oFieldEdit = null;
IFeatureClass oFeatureClass;
try
{
oFieldsEdit = (IFieldsEdit)oFields;
oFieldEdit = (IFieldEdit)oField;
if (propertyFields != null)
for (int i = 0; i < propertyFields.FieldCount; i++)
oFieldsEdit.AddField(propertyFields.Field[i]);
IGeometryDef geometryDef = new GeometryDefClass();
IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
geometryDefEdit.AvgNumPoints_2 = 5;
geometryDefEdit.GeometryType_2 = geometryType;
geometryDefEdit.GridCount_2 = 1;
geometryDefEdit.HasM_2 = false;
geometryDefEdit.HasZ_2 = false;
geometryDefEdit.SpatialReference_2 = spatialRef;
oFieldEdit.Name_2 = "SHAPE";
oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
oFieldEdit.GeometryDef_2 = geometryDef;
oFieldEdit.IsNullable_2 = true;
oFieldEdit.Required_2 = true;
oFieldsEdit.AddField(oField);
oFeatureClass = ((IFeatureWorkspace)MyWorkspace).CreateFeatureClass(dataSetName, oFields, null, null,
esriFeatureType.esriFTSimple, "SHAPE", "");
((IDataset)oFeatureClass).BrowseName = dataSetName;
}
finally
{
try
{
Marshal.ReleaseComObject(oField);
Marshal.ReleaseComObject(oFields);
if (oFieldsEdit != null)
Marshal.ReleaseComObject(oFieldsEdit);
if (oFieldEdit != null)
Marshal.ReleaseComObject(oFieldEdit);
}
catch
{
}
GC.Collect();
}
_featureClasses.Add(aliasName, oFeatureClass);
return this;
}
public MyMemoryWorkspace CreateDefaultMemoryFeatureClass(string dataSetName,
string aliasName,
ISpatialReference spatialRef,
esriGeometryType geometryType,
IFields propertyFields)
{
IField oField = new FieldClass();
IFields oFields = new FieldsClass();
IFieldsEdit oFieldsEdit = null;
IFieldEdit oFieldEdit = null;
IFeatureClass oFeatureClass;
try
{
oFieldsEdit = (IFieldsEdit)oFields;
oFieldEdit = (IFieldEdit)oField;
IField field = new FieldClass();
IFieldEdit fieldEdit = (IFieldEdit)field;
fieldEdit.Name_2 = "OBJECTID";
fieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
fieldEdit.IsNullable_2 = false;
fieldEdit.Required_2 = false;
oFieldsEdit.AddField(field);
if (propertyFields != null)
for (int i = 0; i < propertyFields.FieldCount; i++)
oFieldsEdit.AddField(propertyFields.Field[i]);
IGeometryDef geometryDef = new GeometryDefClass();
IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
geometryDefEdit.AvgNumPoints_2 = 5;
geometryDefEdit.GeometryType_2 = geometryType;
geometryDefEdit.GridCount_2 = 1;
geometryDefEdit.HasM_2 = false;
geometryDefEdit.HasZ_2 = false;
geometryDefEdit.SpatialReference_2 = spatialRef;
oFieldEdit.Name_2 = "SHAPE";
oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
oFieldEdit.GeometryDef_2 = geometryDef;
oFieldEdit.IsNullable_2 = true;
oFieldEdit.Required_2 = true;
oFieldsEdit.AddField(oField);
oFeatureClass = ((IFeatureWorkspace)MyWorkspace).CreateFeatureClass(dataSetName, oFields, null, null,
esriFeatureType.esriFTSimple, "SHAPE", "");
((IDataset)oFeatureClass).BrowseName = dataSetName;
}
finally
{
try
{
Marshal.ReleaseComObject(oField);
Marshal.ReleaseComObject(oFields);
if (oFieldsEdit != null)
Marshal.ReleaseComObject(oFieldsEdit);
if (oFieldEdit != null)
Marshal.ReleaseComObject(oFieldEdit);
}
catch
{
}
GC.Collect();
}
_featureClasses.Add(aliasName, oFeatureClass);
return this;
}
public MyMemoryWorkspace InsertFeature(string featureClassName, MyFeature myFeature)
{
if (featureClassName == null) throw new ArgumentNullException(nameof(featureClassName));
if (myFeature == null) throw new ArgumentNullException(nameof(myFeature));
IFeatureClass featureClass;
_featureClasses.TryGetValue(featureClassName, out featureClass);
if (featureClass == null) return this;
try
{
using (ComReleaser comReleaser = new ComReleaser())
{
IFeatureCursor insertCursor = featureClass.Insert(true);
comReleaser.ManageLifetime(insertCursor);
IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer();
comReleaser.ManageLifetime(featureBuffer);
featureBuffer.Shape = myFeature.Geometry;
foreach (KeyValuePair<string, object> row in myFeature.RowData)
{
int fieldIndex = featureBuffer.Fields.FindField(row.Key);
featureBuffer.set_Value(fieldIndex, row.Value);
}
insertCursor.InsertFeature(featureBuffer);
insertCursor.Flush();
}
}
catch (Exception)
{
}
return this;
}
public MyMemoryWorkspace InsertFeature(string featureClassName, IEnumerable<MyFeature> myFeature)
{
if (featureClassName == null) throw new ArgumentNullException(nameof(featureClassName));
if (myFeature == null) throw new ArgumentNullException(nameof(myFeature));
IFeatureClass featureClass;
_featureClasses.TryGetValue(featureClassName, out featureClass);
if (featureClass == null) return this;
try
{
using (ComReleaser comReleaser = new ComReleaser())
{
IFeatureCursor insertCursor = featureClass.Insert(true);
comReleaser.ManageLifetime(insertCursor);
Dictionary<string, int> fieldIndexDic = new Dictionary<string, int>();
if (myFeature.FirstOrDefault().RowData.Count > 0)
{
IFields fields = insertCursor.Fields;
foreach (string fieldName in myFeature.FirstOrDefault() != null ? myFeature.FirstOrDefault().RowData.Keys : null)
{
if ("OBJECTID".Equals(fieldName.ToUpper())
|| "FID".Equals(fieldName.ToUpper())
|| "SHAPE.AREA".Equals(fieldName.ToUpper())
|| "SHAPE.LEN".Equals(fieldName.ToUpper()))
continue;
int fieldIndex = fields.FindField(fieldName);
if (fieldIndex < 0) continue;
fieldIndexDic.Add(fieldName, fieldIndex);
}
ComReleaser.ReleaseCOMObject(fields);
}
foreach (MyFeature feature in myFeature)
{
IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer();
comReleaser.ManageLifetime(featureBuffer);
featureBuffer.Shape = feature.Geometry;
foreach (KeyValuePair<string, object> row in feature.RowData)
{
int index;
bool isTrue = fieldIndexDic.TryGetValue(row.Key, out index);
if (isTrue)
featureBuffer.set_Value(index, row.Value);
}
insertCursor.InsertFeature(featureBuffer);
}
insertCursor.Flush();
}
}
catch (Exception)
{
}
return this;
}
public IFeatureClass BuildFeatureClass()
{
return _featureClasses.Count > 0 ? _featureClasses.Values.First() : null;
}
public Dictionary<string, IFeatureClass> BuildFeatureClasses()
{
return _featureClasses;
}
#region IDisposable
private void ReleaseUnmanagedResources()
{
if (MyWorkspace != null)
ComReleaser.ReleaseCOMObject(MyWorkspace);
if (_featureClasses.Count > 0)
foreach (IFeatureClass value in _featureClasses.Values)
ComReleaser.ReleaseCOMObject(value);
_featureClasses.Clear();
}
protected virtual void Dispose(bool disposing)
{
ReleaseUnmanagedResources();
if (disposing)
{
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
}
public class MyFeature
{
public MyFeature()
{
RowData = new Dictionary<string, object>();
}
public IGeometry Geometry { get; set; }
public Dictionary<string, object> RowData { get; set; }
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?