我目前正在一个项目中,当用户将其地图(mxd)加载到我们的系统中时,我们会为他们创建几个自定义的特征层。但是我的问题是,我不知道如何检查是否已经创建了这些图层(例如,用户加载了mxd,创建了图层,保存,重新加载了mxd,应该验证图层是否已经存在)。
ArcEngine10中的FeatuerLayerClass是否有一个唯一ID,FeatureLayerClass.FeatureClass中是否有OIDName和ObjectClassID,但是似乎不起作用(无法分配ObjectClassId,并且想对OIDName使用UniqueId)?
我像这样将图层创建为featurelayerclass业务对象。
码:
/// <summary>
/// Unique Route LayerId
/// </summary>
public static Guid RouteFeatureLayerId
{
get { return Guid.Parse("ba25a332-0e48-4ce5-a4c5-38dc36c0700c"); }
}
/// <summary>
/// Feature class that stores info on the routes
/// </summary>
public FeatureLayerClass RouteFeatureLayer
{
get
{
if (_routeFeatureClass == null)
{
IPropertySet property = new PropertySetClass();
property.SetProperty("Id", RouteFeatureLayerId);
_routeFeatureClass = new FeatureLayerClass();
_routeFeatureClass.FeatureClass = CreateFeatureClass(Workspace, null, ShapeType.Polylines.ToString(), CreateFields(ShapeType.Polylines, FeatureLayerType.Routes), null, null, "");
_routeFeatureClass.Name = "Routes";
_routeFeatureClass.Visible = true;
_routeFeatureClass.Cached = true;
_routeFeatureClass.AddExtension(property);
CustomLayers.Add(_routeFeatureClass);
}
return _routeFeatureClass;
}
set
{
_routeFeatureClass = value;
}
}
创建工作区
/// <summary>
/// Create a workspace for the shapefile or geodatabase
/// </summary>
private IWorkspace CreateWorkspace(string workspaceType, string workspaceDirectory)
{
Type factoryType = null;
IWorkspaceFactory workspaceFactory = null;
switch (workspaceType)
{
case "Shapefile":
// Instantiate a Shapefile workspace factory
factoryType = Type.GetTypeFromProgID("esriDataSourcesFile.ShapefileWorkspaceFactory");
break;
case "PersonalGeodatabase":
// Instantiate an Access workspace factory
factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.AccessWorkspaceFactory");
break;
case "FileGeodatabase":
// Instantiate a file geodatabase workspace factory
factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory");
break;
}
workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
//Create a directory hierarchy to seperate out datasets created for Points, Polylines, and Polygons
Directory.CreateDirectory(workspaceDirectory);
IWorkspaceName workspaceName = workspaceFactory.Create(workspaceDirectory + "\\", workspaceType, null, 0);
IName Name = (IName)workspaceName;
IWorkspace workspace = (IWorkspace)(Name.Open());
return workspace;
}
创建要素类
/// <summary>
/// Helper to create a Feature Class.
/// </summary>
private IFeatureClass CreateFeatureClass(IWorkspace workspace, IFeatureDataset featureDataset, string featureClassName, IFields fields, ESRI.ArcGIS.esriSystem.UID CLSID, ESRI.ArcGIS.esriSystem.UID CLSEXT, string configKeyword)
{
IFeatureClass featureClass = null;
IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace; // Explicit Cast
string shapeFieldName = String.Empty;
try
{
if (featureClassName == "")
{
return null; // name was not passed in
}
//else if (((IWorkspace2)workspace).get_NameExists(esriDatasetType.esriDTFeatureClass, featureClassName))
//{
// featureClass = featureWorkspace.OpenFeatureClass(featureClassName); // feature class with that name already exists
// return featureClass;
//}
// assign the class id value if not assigned
if (CLSID == null)
{
CLSID = new ESRI.ArcGIS.esriSystem.UIDClass();
CLSID.Value = "esriGeoDatabase.Feature";
}
// locate the shape field
for (Int32 j = 0; j < fields.FieldCount; j++)
{
if (fields.get_Field(j).Type == esriFieldType.esriFieldTypeGeometry)
{
shapeFieldName = fields.get_Field(j).Name;
}
}
// finally create and return the feature class
if (featureDataset == null)
{
// if no feature dataset passed in, create at the workspace level
featureClass = featureWorkspace.CreateFeatureClass(featureClassName, fields, CLSID, CLSEXT, esriFeatureType.esriFTSimple, shapeFieldName, configKeyword);
}
else
{
featureClass = featureDataset.CreateFeatureClass(featureClassName, fields, CLSID, CLSEXT, esriFeatureType.esriFTSimple, shapeFieldName, configKeyword);
}
}
catch (Exception ex)
{
Debug.Assert(false, ex.ToString());
Logger.Log.Debug(ex);
}
return featureClass;
}
代码获取图层
/// <summary>
/// Finds the layer
/// </summary>
/// <returns>the subcatchment layer</returns>
private IGeoFeatureLayer GetLayer(FeatureLayerClass featureLayer)
{
IGeoFeatureLayer layer = null;
ILayerExtensions layerExtension;
for (int x = 0; x < MapControl.LayerCount; x++)
{
layerExtension = ((ILayerExtensions)MapControl.get_Layer(x));
if (featureLayer.ExtensionCount > 0 && layerExtension.ExtensionCount > 0 &&
layerExtension.get_Extension(0) is PropertySetClass &&
featureLayer.get_Extension(0) is PropertySetClass &&
((PropertySetClass)layerExtension.get_Extension(0)).GetProperty("Id") == ((PropertySetClass)featureLayer.get_Extension(0)).GetProperty("Id"))
{
layer = MapControl.get_Layer(x) as IGeoFeatureLayer;
break;
}
}
return layer;
}
谢谢,凯文