Select to view content in your preferred language

Create FeaturLayer from Shape File without adding it to the Map

339
2
Jump to solution
Sunday
EugeneStaten
Occasional Contributor

Hi....

I am porting and old ArcMap add-in to ArcGIS Pro 3.6 using the SDK.

The previous code loads a FeatureLayer form a shape file without auto adding it to the Map.

Here is the Code:

 public static ILayer LoadShapeFile(string path)
 {
     ILayer layer = null;

     try
     {
         if (File.Exists(path))
         {
             string directory = Path.GetDirectoryName(path);
             string name = Path.GetFileNameWithoutExtension(path);

             // Create a new ShapefileWorkspaceFactory CoClass to create a new workspace
             ESRI.ArcGIS.Geodatabase.IWorkspaceFactory workspaceFactory = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass();
             ESRI.ArcGIS.Geodatabase.IFeatureWorkspace featureWorkspace = (ESRI.ArcGIS.Geodatabase.IFeatureWorkspace)workspaceFactory.OpenFromFile(directory, 0); // Explicit Cast

             ESRI.ArcGIS.Geodatabase.IFeatureClass featureClass = featureWorkspace.OpenFeatureClass(name);
             if (featureClass != null)
             {
                 ESRI.ArcGIS.Carto.IGeoFeatureLayer featureLayer = new ESRI.ArcGIS.Carto.FeatureLayerClass();
                 featureLayer.FeatureClass = featureClass;
                 featureLayer.Name = featureClass.AliasName;
                 layer = featureLayer;
             }
         }
     }
     catch (Exception ex)
     {
         DebugLog.Error(ex);
         throw;
     }

     return layer;
 }

 

ArcGIS Pro 2.6 wont let me do this, it forces me to add the layer to the Map:

Here is my code:

    public FeatureLayer LoadShapeFile(string shapefileFullPath)
    {
        if (File.Exists(shapefileFullPath))
        {
            return null;
        }

        FeatureLayer newLayer = QueuedTask.Run<FeatureLayer>( async () =>
        {
            try
            {
                string directory = Path.GetDirectoryName(shapefileFullPath)!;
                string shapeFileName = Path.GetFileName(shapefileFullPath)!;
                string featureClassName = Path.GetFileNameWithoutExtension(shapefileFullPath)!;

                // Run the geoprocessing tool to add a projection to the shape file
                IGPResult result = DefineShapeFileProjection(shapefileFullPath);
                if (result.IsFailed)
                {
                    return null;
                }
                var connectionPath =
                    new FileSystemConnectionPath(new Uri(directory), FileSystemDatastoreType.Shapefile);
                using (var datastore = new FileSystemDatastore(connectionPath))
                {

                    using (FeatureClass featureClass = datastore.OpenDataset<FeatureClass>(shapeFileName))
                    {
                        FeatureLayerCreationParams layerCreationParams =
                            new FeatureLayerCreationParams(featureClass)
                            {
                                Name = featureClassName, // Set a custom name for the new layer
                            };

                        // Create the layer and (add it to the map):-|
                        return LayerFactory.Instance.CreateLayer<FeatureLayer>(layerCreationParams,
                            MapView.Active.Map);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageHandling.ErrorMessage(ex);
                return null;
            }

            return null;
        }).GetAwaiter().GetResult();

        return newLayer;
    }

 

The LayerUtils.cs file allow adding a layer or many layers to the Map later.

We first do a little preprocessing before doing so.

Is there a way to create a FeatureLayer without adding it to the map.

send null inplace of the Map container will throw an exception.

0 Kudos
1 Solution

Accepted Solutions
UmaHarano
Esri Regular Contributor

@EugeneStaten 

Hi, Check out the Layer files and Layer Package section of the ProConcepts: Map Authoring wiki.

Using the LayerDocument class, you have the ability to access and modify the contents of a layer file. You can then alter the layer file properties prior to adding it to the map.

Code snippets are provided to show how to accomplish this.

Please reach out if you run into any issues or have questions.

Thanks!

Uma

View solution in original post

2 Replies
UmaHarano
Esri Regular Contributor

@EugeneStaten 

Hi, Check out the Layer files and Layer Package section of the ProConcepts: Map Authoring wiki.

Using the LayerDocument class, you have the ability to access and modify the contents of a layer file. You can then alter the layer file properties prior to adding it to the map.

Code snippets are provided to show how to accomplish this.

Please reach out if you run into any issues or have questions.

Thanks!

Uma

EugeneStaten
Occasional Contributor

This is exactly what I wanted, UmaHarano.  Thank you very much!!!