Memperbaiki sumber data dalam banyak MXD menggunakan ArcPy?

14

Saya memiliki sekitar 50 mxd dengan semua lapisan rusak yang telah saya lalui dan mengatur ulang secara manual.

Data dipindahkan dari komputer lain dan struktur folder diubah sehingga bukan hanya proses perubahan yang sederhana (contoh):

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

itu lebih seperti:

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

dan seterusnya untuk semua jenis data (batas, tutupan sayuran, jalan, dll.) masing-masing dalam sub-folder mereka sendiri.

Saya ingin membuat skrip yang dapat saya jalankan berulang kali setiap kali saya membuka salah satu mxd ini yang setidaknya akan memperbaiki beberapa lapisan yang lebih umum yang ditemukan di sebagian besar mxd saya, dan kemudian saya dapat memperbaiki sisanya secara manual. Dengan cara itu saya bisa setidaknya menyelamatkan diri beberapa waktu.

Saya telah menggunakan sesuatu di sepanjang baris:

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")

Idenya kemudian akan entah bagaimana menambahkan beberapa "ganti" skrip di atas untuk lapisan umum lainnya yang ada di mxd saya.

Namun skrip di atas bahkan tidak memperbaiki layer Rivers.

Bagaimana saya bisa membuatnya bekerja, dan juga menambahkan lapisan lain untuk diperbaiki yang memiliki jalur file berbeda?

Chaz
sumber

Jawaban:

14

Anda berada di jalur yang benar dengan skrip Anda. Sepertinya kebohongan masalah Anda dalam bagaimana Anda membandingkan Layerobjek, dengan Nama dari Layerdalam Daftar Isi .

Saat Anda menggunakan fungsi ListLayers , apa yang dikembalikan adalah Layerobjek. Anda tidak dapat membandingkan ini dengan a text stringuntuk melihat apakah mereka sama, Anda perlu mengakses Nama sebagai Layergantinya.

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")

Untuk menambahkan lebih banyak penyeleksi, Anda cukup memperluas if/thenbagian dari kode untuk mencari nama layer yang berbeda.

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")

Cukup lanjutkan memodifikasi namepemilih untuk menemukan lapisan unik tertentu di Anda .mxd, dan tambahkan replaceDataSourcefungsi untuk menanganinya. Harap perhatikan bahwa saya menggunakan lowerfungsi saat menguji nama. Ini juga digunakan oleh ESRI dalam dokumen bantuan mereka, dengan alasan kemungkinan bahwa ESRI menghilangkan kemungkinan inkonsistensi dalam kapitalisasi, menyebabkan ketidakcocokan dalam nama layer.

Berikut ini adalah artikel Bantuan ESRI tentang Memperbarui dan Memperbaiki Sumber Data dengan Pemetaan Arcpy

File Bantuan untuk ArcGIS secara umum sangat berguna karena mengandung penjelasan yang jelas, dan banyak contoh kode Python yang dapat Anda salin / tempel dan modifikasi sesuai dengan kebutuhan spesifik Anda.

Dapatkan Tata Ruang
sumber