Reparando fontes de dados em vários MXDs usando o ArcPy?

14

Eu tenho cerca de 50 mxd's com todas as camadas quebradas pelas quais andei passando e redefinindo manualmente.

Os dados foram movidos de outro computador e a estrutura da pasta foi alterada; portanto, não é apenas um processo simples de alteração (exemplo):

"F: \ Data \ Rivers.shp" para "C: \ Data \ Rivers.shp"

é mais como:

"F: \ Data \ Rivers.shp" para C: \ Data \ Park \ Water \ Rivers.shp

e assim por diante, para todos os tipos de dados (limites, cobertura vegetal, estradas, etc.), cada um em sua própria subpasta.

Quero criar um script que possa ser executado repetidamente sempre que abrir um desses mxds que consertaria pelo menos algumas das camadas mais comuns encontradas na maioria dos meus mxds e, em seguida, posso reparar manualmente o restante. Dessa forma, eu posso pelo menos me poupar algum tempo.

Eu tenho usado algo ao longo das linhas de:

import arcpy
mxd = arcpy.mapping.MapDocument("CURRENT")

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr == "Rivers": #Should this be the layner name in TOC or FC name?
        lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")

A idéia seria, de alguma forma, adicionar vários scripts de "substituição" acima para outras camadas comuns que estão nos meus mxd's.

No entanto, o script acima nem corrige a camada Rivers.

Como posso fazê-lo funcionar e também adicionar outras camadas a serem reparadas com caminhos de arquivo diferentes?

Chaz
fonte

Respostas:

14

Você está no caminho certo com seu script. Parece que seu problema está em como você está comparando o Layerobjeto com o Nome do Layerno Sumário .

Quando você usa a função ListLayers , o que é retornado é um Layerobjeto. Você não pode comparar isso com a text stringpara ver se eles são iguais; você precisa acessar o Nome do Layer.

import arcpy
mxd = arcpy.mapping.MapDocument("CURRENT")

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name.lower() == "rivers": #This should be the Layer name in the TOC?
        lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")

Para adicionar mais seletores, basta expandir a if/thenparte do código para procurar diferentes nomes de camadas.

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name.lower() == "rivers": #This should be the Layer name in the TOC?
        lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")
    elif lyr.name.lower() == "streets":
        lyr.replaceDataSource(r"C:\Data\Facilities\Streets", "SHAPEFILE WORKSPACE", "Streets")

Simplesmente continue a modificar o nameseletor para encontrar qualquer camada única em particular .mxde adicione uma replaceDataSourcefunção para lidar com isso. Observe que eu usei a lowerfunção ao testar o nome. Isso também é usado pela ESRI em seus documentos de ajuda, com o raciocínio provavelmente removendo a chance de inconsistências na capitalização, causando uma incompatibilidade no nome da camada.

Aqui está o artigo de ajuda da ESRI sobre atualização e correção de fontes de dados com o mapeamento do Arcpy

Os arquivos de Ajuda do ArcGIS em geral são muito úteis, pois contêm explicações claras e muitas amostras de código Python que você pode simplesmente copiar / colar e modificar para atender às suas necessidades específicas.

Get Spatial
fonte