arcgis使用ao的渲染如果是在数据库中添加字段来做的话,就会遇到一个问题,当多个用户同时在渲染时,有没可能会发生错误。本人在研究动态关联外表时,伤透了脑筋都始终不得成功,于是想到用复制图层的方式来做,比如我们要在某个图层上作渲染,就在数据库中图层对应的表增加字段,一般是增加string类型的字段一个, double类型的字段2-3个, int类型的字段2-3个,先解释一下,string类型的字段用于string类型的单值专题图, double,int类型的字段用作柱图饼图,也可以单独取一个用作单值专题图。在程序中,我们可以这个图层进行复制,复制包括了对featureClass中每个字段和每个数据的复制,然后把这个内存图层添加到地图中,作渲染。
复制的主要代码如下:
public static ILayer CopyLayer(this ESRI.ArcGIS.ADF.Web.UI.WebControls.Map map, string resourceName, string sourceLayerName)
{
IFeatureLayer sourceLayer = map.GetLayerByLayerName(resourceName, sourceLayerName) as IFeatureLayer;
IWorkspaceFactory workspaceFactory = map.AoObjectFactory<IWorkspaceFactory>("esriDataSourcesGDB.InMemoryWorkspaceFactory", resourceName);
IWorkspaceName workspaceName = workspaceFactory.Create("", "MyWorkspace", null, 0);
IName name = (IName)workspaceName;
IWorkspace inmemWor = (IWorkspace)name.Open();
IClone mClone = sourceLayer.FeatureClass.Fields as IClone;
IFields newFlds = mClone.Clone() as IFields;
//IFieldEdit oFieldEdit = new FieldClass() as IFieldEdit;
IFieldChecker fieldChecker = map.AoObjectFactory<IFieldChecker>("esriGeodatabase.FieldChecker", resourceName);
IFields validatedFields = null;
IEnumFieldError enumFieldError = null;
fieldChecker.Validate(newFlds, out enumFieldError, out validatedFields);
//if (enumFieldError != null)
//{
// IFieldError fieldError = null;
// while ((fieldError = enumFieldError.Next()) != null)
// {
// IField errorField = newFlds.get_Field(fieldError.FieldIndex);
// }
// return;
//}
IFeatureClass oFeatureClass = (inmemWor as IFeatureWorkspace).CreateFeatureClass("copyClass", newFlds, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
IFeatureLayer newLayer = map.AoObjectFactory<IFeatureLayer>("esriCarto.FeatureLayer", resourceName);
ESRI.ArcGIS.Geodatabase.IFeatureCursor feaCursor = oFeatureClass.Insert(true);
ESRI.ArcGIS.Geodatabase.IFeatureCursor _sourceFeaCursor = sourceLayer.FeatureClass.Search(null, false);
ESRI.ArcGIS.Geodatabase.IFeature tFea = _sourceFeaCursor.NextFeature();
while (tFea != null)
{
feaCursor.InsertFeature(tFea as ESRI.ArcGIS.Geodatabase.IFeatureBuffer);
tFea = _sourceFeaCursor.NextFeature();
}
feaCursor.Flush();
newLayer.FeatureClass = oFeatureClass;
IMap pMap = ConvertToIMap(map, resourceName);
pMap.AddLayer(newLayer);
map.RefreshLocalServerObj(resourceName);
//refreshLocal
return newLayer;
}