AE内存图层
2014-04-28 19:36
295 查看
由于要获得一个图层的选择集,并传出IFeatureClass的参数,纠结了好久,最后用创建一个内存图层解决了问题。
private IFeatureClass GetSelectFC(ILayer pLayer)
{
IFeatureLayer pFLayer = pLayer as IFeatureLayer;
IFeatureSelection mFeatureSelection = pFLayer as IFeatureSelection;
ISelection pSelection = axMapControl1.ActiveView.FocusMap.FeatureSelection;
IEnumFeature pEnumFeature = pSelection as IEnumFeature;
IEnumFeatureSetup pEnumFeatureSetup = pEnumFeature as IEnumFeatureSetup;
pEnumFeatureSetup.AllFields = true;
IFeature mFeature = pEnumFeature.Next();
while (mFeature != null)
{
mFeatureSelection.Add(mFeature);
mFeature = pEnumFeature.Next();
}
IEnumIDs penumIDs = mFeatureSelection.SelectionSet.IDs;
penumIDs.Reset();
int iID = penumIDs.Next();
IFeatureClass pFC = pFLayer.FeatureClass;
IGeoDataset pGeoDataset= pFC as IGeoDataset;
ISpatialReference pSpatialReference=pGeoDataset.SpatialReference;
private IFeatureClass GetSelectFC(ILayer pLayer)
{
IFeatureLayer pFLayer = pLayer as IFeatureLayer;
IFeatureSelection mFeatureSelection = pFLayer as IFeatureSelection;
ISelection pSelection = axMapControl1.ActiveView.FocusMap.FeatureSelection;
IEnumFeature pEnumFeature = pSelection as IEnumFeature;
IEnumFeatureSetup pEnumFeatureSetup = pEnumFeature as IEnumFeatureSetup;
pEnumFeatureSetup.AllFields = true;
IFeature mFeature = pEnumFeature.Next();
while (mFeature != null)
{
mFeatureSelection.Add(mFeature);
mFeature = pEnumFeature.Next();
}
IEnumIDs penumIDs = mFeatureSelection.SelectionSet.IDs;
penumIDs.Reset();
int iID = penumIDs.Next();
IFeatureClass pFC = pFLayer.FeatureClass;
IGeoDataset pGeoDataset= pFC as IGeoDataset;
ISpatialReference pSpatialReference=pGeoDataset.SpatialReference;
//创建内存图层,将选择集的feature一个个添加进去,返回它的featureclass IFeatureLayer pNewFL = CreateFeatureLayerInmemeory("TempLayer", "TempLayer", pSpatialReference, esriGeometryType.esriGeometryPolygon, pFC.Fields); IFeatureClass pNewFC = pNewFL.FeatureClass; while(iID!=-1) { IFeature pNewFeature = pNewFC.CreateFeature(); pNewFeature = pFC.GetFeature(iID); iID = penumIDs.Next(); } return pNewFC; } /// <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; }
相关文章推荐
- AE 创建内存图层
- AE开发使用内存图层
- AE创建内存图层
- 在AE中取得所有图层以及没某个图层选择要素的方法
- AE二次开发中,过滤后的图层,实现缩放至图层效果
- 在ArcEngine中创建内存图层
- AE构建获取栅格图层属性表(ITable)
- AE+C#通过多线程向GlobeControl中增加图层
- AE开发中栅格图层实现分级渲染
- C#+AE 调整TOCControl控件中图层的显示顺序
- C#+AE写的一段加载图层
- 在ArcEngine中创建内存图层[转]
- 在ArcEngine中创建内存图层 -hl3292注释
- C# + AE 判断图层类型
- AE中判断当前图层是点图层、线图层、还是面图层
- AE开发----图层操作
- 内工作空间,创建内存图层、图层透明度设置
- AE+C#开发问题之二——axTOCControl控件图层不显示问题
- 创建内存图层,并写入数据
- AE获得鼠标选择的图层信息