1

Im looking for a way to get the name and path of a layer file which is used in an MXD. I know once a layer file is added to a MXD, the path info is not stored, which is problematic.

Essentially the end goal is to use arcpy.mapping module to update a bunch of layers within any MXD. using the following code

arcpy.mapping.UpdateLayer(maindataframe, updateLayer, sourceLayer, True)

We have a folder structure where all our layer files are connected to a mix of SDE and GDB's. And to find a way to make a table of all the layers with the paths would be a godsend.

The question is, is there a way to programmaticly run though each folder and sub folders (maybe using os.walk?) and get the layer name used in ArcMap (in this case, the updatelayer), and the path (sourcelayer) to get this format -> [River System,r'C:\Catchments\Area\River_Catchments.lyr']

Edit: I should point out that this is not to update the datasource, but the path of where it is found. The reason I need this is that there are old MXD's that contain old/dated symbology and need to be updated. By updating the layer with the one in the folder structure I can update multiple MXD's at once.

asked Feb 7, 2017 at 1:35
3
  • 1
    There is no requirement that a layer have a layer file. The source information is retained in the MXD, and some of it may be available (password to enterprise geodatabase connections, for instance, is not). It sounds like you just need to use arcpy.mapping.ListLayers() Commented Feb 7, 2017 at 1:54
  • 1
    Full paths to datasources are only lost if you check 'Relative Paths' resources.arcgis.com/en/help/main/10.2/index.html#//… in ArcMap and save the MXD in a root folder of your data. If your layers are broken the value of the datasource may be inaccessible to python but it's still stored, check out Change Layer Paths resources.arcgis.com/en/help/main/10.2/index.html#//… tool... it might do what you want without needing a script. Commented Feb 7, 2017 at 3:05
  • I've just added to the original post to give some clarification. This is to update the layer information (new colours, symbol classes, etc) as opposed to the datasouces, my concern is that if I have a layer within an MXD which has the same name as layer within a folder structure, I effectively want to update the MXD layer with the one in the folder, if that makes sense. Commented Feb 7, 2017 at 4:10

1 Answer 1

1

Assuming that you "have a folder structure where all [your] layer files are connected to a mix of SDE and GDB's", and that you are talking about *.lyr files and not talking about layers stored in map documents (*.mxd files), the code you need to write just needs to:

  1. Use arcpy.da.Walk to walk through the folder structure looking for *.lyr files.
  2. For each layer file found create a layer object using arcpy.mapping.Layer().
  3. View the layer objects name using the name property and its data source using the dataSource property.
  4. When you write a list of the above as tuples you could also store the name of the layer file as a third item in each tuple.
answered Feb 7, 2017 at 2:17
1
  • Testing this now, seems promising Commented Feb 7, 2017 at 8:02

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.