使用IWorkspaceFactory,IWorkspaceName,IName,IWorkspace等接口以及InMemoryWorkspaceFactoryClass对象创建在程序运行时的内存中的矢量要素层
直接上代码:
///<summary>///
在程序运行时的内存中创建矢量要素层,并加到地图控件最顶端
///</summary>
///
<param
name="pMapCtrl">地图控件</param>
///<returns>IFeatureLayer
新加的要素层</returns>
private IFeatureLayer AddFeatureLayerByMemoryWS(AxMapControl pMapCtrl,
ISpatialReference pSReference)
{
try
{
if (pMapCtrl ==
null)
return null;
//创建新的内存工作空间
IWorkspaceFactory pWSF = new
InMemoryWorkspaceFactoryClass();
IWorkspaceName pWSName =
pWSF.Create("","Temp",null,0);
IName pName = (IName)pWSName;
IWorkspace
pMemoryWS = (IWorkspace)pName.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;
oFieldEdit.Name_2 = "OBJECTID";
oFieldEdit.Type_2 =
esriFieldType.esriFieldTypeOID;
oFieldEdit.IsNullable_2 =
false;
oFieldEdit.Required_2 =
false;
oFieldsEdit.AddField(oField);
oField = new
FieldClass();
oFieldEdit = oField as IFieldEdit;
IGeometryDef pGeoDef =
new GeometryDefClass();
IGeometryDefEdit pGeoDefEdit =
(IGeometryDefEdit)pGeoDef;
pGeoDefEdit.AvgNumPoints_2 =
5;
pGeoDefEdit.GeometryType_2 =
esriGeometryType.esriGeometryPolygon;
pGeoDefEdit.GridCount_2 =
1;
pGeoDefEdit.HasM_2 = false;
pGeoDefEdit.HasZ_2 =
false;
pGeoDefEdit.SpatialReference_2 = pSReference;
oFieldEdit.Name_2 =
"SHAPE";
oFieldEdit.Type_2 =
esriFieldType.esriFieldTypeGeometry;
oFieldEdit.GeometryDef_2 =
pGeoDef;
oFieldEdit.IsNullable_2 = true;
oFieldEdit.Required_2 =
true;
oFieldsEdit.AddField(oField);
oField = new
FieldClass();
oFieldEdit = oField as IFieldEdit;
oFieldEdit.Name_2 =
"Code";
oFieldEdit.Type_2 =
esriFieldType.esriFieldTypeSmallInteger;
oFieldEdit.IsNullable_2 =
true;
oFieldsEdit.AddField(oField);
//创建要素类
oFeatureClass =
(pMemoryWS as IFeatureWorkspace).CreateFeatureClass("Temp", oFields, null, null,
esriFeatureType.esriFTSimple, "SHAPE", "");
oFeatureLayer = new
FeatureLayerClass();
oFeatureLayer.Name =
"TransTemp";
oFeatureLayer.FeatureClass =
oFeatureClass;
//创建唯一值符号化对象
IUniqueValueRenderer pURender = new
UniqueValueRendererClass();
pURender.FieldCount = 1;
pURender.set_Field(0,
"Code");
pURender.UseDefaultSymbol = false;
ISimpleFillSymbol pFillSym =
new SimpleFillSymbolClass();
pFillSym.Style =
esriSimpleFillStyle.esriSFSSolid;
//半透明颜色
IRgbColor pColor = new
RgbColorClass();
pColor.Red = 255;
pColor.Green = 255;
pFillSym.Color =
pColor;
pURender.AddValue("1", "", pFillSym as ISymbol);
pFillSym = new
SimpleFillSymbolClass();
pFillSym.Style =
esriSimpleFillStyle.esriSFSSolid;
//唯一值符号化内存图层
(oFeatureLayer as
IGeoFeatureLayer).Renderer = pURender as IFeatureRenderer;
ILayerEffects
pLyrEffect = oFeatureLayer as ILayerEffects;
//透明度
pLyrEffect.Transparency
= 80;
}
catch (Exception
Err)
{
MessageBox.Show(Err.Message);
}
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(pName);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pWSF);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pWSName);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pMemoryWS);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oFeatureClass);
}
catch
{
}
GC.Collect();
}
return
oFeatureLayer;
}
catch (Exception
Err)
{
MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK,
MessageBoxIcon.Information);
return
null;
}
}