arcgis-desktop – Cómo guardar un archivo de capa con una ruta relativa

Pregunta:

En VBA, ¿cómo se guarda un archivo de capa (.lyr) con una ruta relativa?

Tengo un código que carga un shapefile en ArcMap pero no estoy seguro de cómo utilizo este shapefile para luego guardar un archivo de capa en el disco que tiene una ruta relativa establecida.

La idea es que después de ejecutar mi código y generar todos los archivos de capa, puedo mover los shapefiles y sus archivos de capa asociados desde una unidad local que uso para procesar mis datos a otra ubicación donde otras personas pueden usarlos.

Respuesta:

Este tema se ha discutido anteriormente en el foro de ESRI, ver más abajo.

Exportar lyr a ruta relativa

El problema de que no puede subir más alto en la jerarquía de archivos es realmente molesto.

Pero hay una diferencia cuando guarda la capa a través de ArcMap:

Asegúrese de que "Almacenar nombres de ruta relativos a fuentes de datos" esté activo.

Haga clic con el botón derecho en una capa en la tabla de contenido, elija "Guardar como archivo de capa …") y almacene el .lyr en su disco.

La capa se almacena en un archivo lyr binario. Abra el archivo lyr con un editor de texto simple (por ejemplo, el Bloc de notas de Windows).

Puede averiguar la ruta a la fuente de datos almacenada en el archivo lyr.

Por ejemplo: . . \. . \. . \. . \ base de datos \ T est. gd b

Eso significa que en relación con el archivo lyr, la fuente de datos es cuatro carpetas más alta que la base de datos de la carpeta y allí Test.gdb.

Si guarda el archivo lyr con ArcObjects, se almacena la siguiente ruta: database \ T est. gdb

Es la ruta incorrecta a la fuente de datos.

¿Por qué no puedo guardar el archivo lyr con la ruta relativa correcta a la fuente de datos?

Usé el siguiente código (C #) para guardar el archivo lyr:

private void saveLyr(string lyrFileName, IFeatureLayer pFLayer)
        {
            try
            {
                if (String.IsNullOrEmpty(lyrFileName)) return;
                if (pFLayer == null) return;

                //Layer ermitteln
                IDataLayer2 pDataLayer = pFLayer as IDataLayer2;

                IName pname = pDataLayer.DataSourceName;
                IDatasetName2 datasetName = pname as IDatasetName2;
                IWorkspaceName workspaceName = datasetName.WorkspaceName;

                string pathToDB = Path.GetDirectoryName(workspaceName.PathName);

                pDataLayer.RelativeBase = pathToDB;

                saveToLayerFile(lyrFileName, pDataLayer as ILayer);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void saveToLayerFile(string layerFilePath, ILayer layer)
        {
            try
            {
                if (layer == null) return;

                //create a new LayerFile instance
                ILayerFile layerFile = new LayerFileClass();

                //make sure that the layer file name is valid
                if (Path.GetExtension(layerFilePath) != ".lyr")
                    return;
                if (layerFile.get_IsPresent(layerFilePath))
                    File.Delete(layerFilePath);

                //create a new layer file
                layerFile.New(layerFilePath);

                //attach the layer file with the actual layer
                layerFile.ReplaceContents(layer);

                //save the layer file
                layerFile.Save();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım