Atualmente, estou trabalhando em um projeto em que, quando o usuário carrega seu mapa (mxd) em nosso sistema, criamos vários featuerlayers personalizados para eles. Meu problema é que não tenho idéia de como verificar se JÁ já criei essas camadas (digamos que o usuário carregue o mxd, as camadas criadas, salve, recarregue o mxd, verifique se as camadas já existem).
Existe um ID exclusivo para uma FeatuerLayerClass em ArcEngine10, existem OIDName e ObjectClassID em FeatureLayerClass.FeatureClass, mas eles parecem não funcionar (não podem atribuir ObjectClassId e desejam usar UniqueId para OIDName)?
Eu criei minha camada como objeto de negócios de classe de classe de destaque como este.
Código:
/// <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;
}
}
Criando espaço de trabalho
/// <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;
}
Criando FeatureClass
/// <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;
}
Código para obter a camada
/// <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;
}
Obrigado e cumprimentos, Kevin