[GIS] Reading through contents of layer file using ArcPy

arcpyconvertlayer-filepythonraster

I have a collection of rasters (all in separate geodatabases) that I am trying to put into a MOSAIC using a python script. I have a bunch of these to make so I was thinking that the easiest way to do it would be to create a .lyr file containing all the rasters I want to add and then have a script read through that layer file and add the rasters using AddRastersToMosaicDataset_management. The problem is that I haven't been able to read through the contents of a layer file. This line seems to break my code: layerfile=arcpy.mapping.MapDocument(r"S:\path_to_layer.lyr"). I try to catch the error message with except: print arcpy.GetMessages() but nothing prints.

I thought I'd try the other approach and use an mxd instead of a layer file. I created an mxd with just the rasters I wanted to add, but I couldn't read the path of the raster (shapefiles did work though). Here is my code:

import arcpy
mxd=arcpy.mapping.MapDocument(r"S:\path_to_mxd.mxd")
dataframes=arcpy.mapping.ListDataFrames(mxd)
for dataframe in dataframes:
    for lyr in arcpy.mapping.ListLayers(mxd, "", dataframe):
        desc = arcpy.Describe(lyr)
        print desc.catalogPath
        #print(arcpy.Describe(lyr).catalogPath)

This will print a path to a shapefile, but gives IOError: "Raster_Name" does not exist when the layer is a raster.

At the moment my only working solution is to manually generate a text file with the path to each of the rasters and read through that line by line. I don't want to have to generate a text file for every MOSAIC I need to create. I feel like I've got 4 possible paths I could go down and I'm getting stuck on each one. Can anyone help me either;

  • read through a .lyr file or an mxd and extract the paths of the raster datasets; or
  • convert a .lyr or an mxd to a text file listing the paths of the datasets contained?

Best Answer

Your code tries to get the catalogPath property of the group layer containing your rasters, which doesn't exist. Instead, I would retrieve the dataSource property of the Layer, after testing that it is indeed applicable with the supports() method (group layers don't support this property).

Your code would look like this:

import arcpy
mxd=arcpy.mapping.MapDocument(r"S:\path_to_mxd.mxd")
dataframes=arcpy.mapping.ListDataFrames(mxd)
for dataframe in dataframes:
    for lyr in arcpy.mapping.ListLayers(mxd, "", dataframe):
        if lyr.supports(dataSource):
            print lyr.dataSource

See the help page for Layer properties and methods for more details.

If you want to follow @Hélène's suggestion and list all rasters in a gdb, use the arcpy.ListRasters() function. If all your rasters are in the same workspace, this would indeed be more straightforward than putting everything in an mxd to get your list.