在ArcEngine中創建內存圖層[轉]
2008-04-29 10:43
arcEngine9.2中新增了一個新的特徵,允許創建內存工作空間。當你需要一個這樣的圖層時,這個圖層的屬性數據或者幾何數據需要頻繁的更新,而又不希望因此而帶來效率上的問題,你就可以考慮使用內存圖層。
內存圖層的創建分爲五步:
1、設置屬性字段
2、設置空間參考和幾何字段
3、創建內存工作空間
4、在內存工作空間中創建特徵類
5、創建特徵圖層,並將上一步創建的特徵類設置爲這個特徵的圖層的特徵類
請看以下完整的示例代碼
/// <summary>
/// 在內存中創建圖層
/// </summary>
/// <param name="DataSetName">數據集名稱</param>
/// <param name="AliaseName">別名</param>
/// <param name="SpatialRef">空間參考</param>
/// <param name="GeometryType">幾何類型</param>
/// <param name="PropertyFields">屬性字段集合</param>
/// <returns>IfeatureLayer</returns>
public static IFeatureLayer CreateFeatureLayerInmemeory(string DataSetName, string AliaseName, ISpatialReference SpatialRef, esriGeometryType GeometryType, IFields PropertyFields)
{
IWorkspaceFactory workspaceFactory = new InMemoryWorkspaceFactoryClass();
ESRI.ArcGIS.Geodatabase.IWorkspaceName workspaceName = workspaceFactory.Create("", "MyWorkspace", null, 0);
ESRI.ArcGIS.esriSystem.IName name = (IName)workspaceName;
ESRI.ArcGIS.Geodatabase.IWorkspace inmemWor = (IWorkspace)name.Open();
IField oField = new FieldClass();
IFields oFields = new FieldsClass();
IFieldsEdit oFieldsEdit = null;
IFieldEdit oFieldEdit = null;
IFeatureClass oFeatureClass = null;
IFeatureLayer oFeatureLayer = null;
try
{
oFieldsEdit = oFields as IFieldsEdit;
oFieldEdit = oField as IFieldEdit;
for (int i = 0; i < PropertyFields.FieldCount; i++)
{
oFieldsEdit.AddField(PropertyFields.get_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 = (inmemWor as IFeatureWorkspace).CreateFeatureClass(DataSetName, oFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
(oFeatureClass as IDataset).BrowseName = DataSetName;
oFeatureLayer = new FeatureLayerClass();
oFeatureLayer.Name = AliaseName;
oFeatureLayer.FeatureClass = oFeatureClass;
}
catch
{
}
finally
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(oField);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oFields);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldsEdit);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldEdit);
System.Runtime.InteropServices.Marshal.ReleaseComObject(name);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workspaceFactory);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workspaceName);
System.Runtime.InteropServices.Marshal.ReleaseComObject(inmemWor);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oFeatureClass);
}
catch { }
GC.Collect();
}
return oFeatureLayer;
}
返回來的這個特徵圖層就是我們所需要的結果,操作這個內存圖層方式和操作物理圖層方式完全一樣。接下要做的事情就不必我說了吧。