您的位置:首页 > 其它

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;
//创建内存图层,将选择集的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: