Bagaimana saya bisa menjelajah pohon direktori dan mengubah relatifPaths Mxd ke true?

9

Saya memiliki banyak folder proyek di mana setiap folder proyek dapat memiliki banyak subfolder. Subfolder ini dapat berisi mxds, shapefile, gdb pribadi, dan fgdb. Dalam banyak kasus, pengguna lupa memeriksa "Use Relative Paths" sebelum menyimpan mxds, jadi ketika folder tersebut disalin, tautan sumber data menjadi rusak.

Saya ingin menulis skrip arcpy mandiri yang merayapi melalui direktori, membuka setiap mxd, menyetel relatifPaths menjadi true, lalu menyimpan mxd. Apakah ada skrip yang melakukan ini di suatu tempat?

Properti relativePaths pada objek MapDocument dibaca hanya. Apakah ada cara lain untuk mengubahnya?

Kirk Kuykendall
sumber
Saya tidak yakin apakah ini mungkin atau tidak menggunakan alur kerja itu. Tapi apa yang saya pikir bisa berfungsi adalah jika Anda secara otomatis membuka masing-masing .mxd, salin semua sumber data dan informasi dari .mxd yang asli ke dalam .mxd kosong baru yang memiliki jalur relatif diperiksa, dan kemudian simpan kembali yang baru. Hanya gagasan sebagai solusi jika cara pertama Anda berakhir tidak mungkin.
MLowry
Saya pikir itu tidak mungkin. Anda bisa mendapatkan daftar semua dokumen menggunakan jalur absolut dan penulisnya dan SPAM dengan email keras.
Sean

Jawaban:

6

Ini dimungkinkan menggunakan skrip python berikut (dengan terima kasih kepada Neil Clemmons di forum ESRI ). Anda akan memerlukan perpustakaan comtypes dan modul Snippets dari Pierssen Consulting.

from Snippets import GetLibPath, InitStandalone
from comtypes.client import GetModule, CreateObject
import os

m = GetModule(GetLibPath() + 'esriCarto.olb')
InitStandalone()
file_dir = r'C:\dir'
for filename in os.listdir(file_dir):
   fullpath = os.path.join(file_dir, filename)
   p = CreateObject(m.MapDocument, interface=m.MapDocument)
   p.Open(fullpath)
   newpath = os.path.join(file_dir,'Changed_' + filename)
   p.SaveAs(newpath,True,False)
   del p
Stev_k
sumber
Juga lihat utas kanonik lokal untuk menggunakan modul Cuplikan Pierssen di Bagaimana cara mengakses ArcObjects dari Python?
matt wilkie
2

Tidak mungkin dalam 10.0 , tapi saya telah berhasil menggunakan ArcObjects dengan Python untuk tugas-tugas yang relatif sederhana seperti ini di mana menulis aplikasi .NET akan berlebihan, tetapi fungsionalitas yang diperlukan tidak terpapar dalam modul arcpy / arcgisscripting. Gunakan os.walk untuk merayapi bagian pohon direktori.

Untuk bit ArcObjects, gunakan IMapDocument.Open()untuk membuka MXD (tanpa harus membukanya di ArcMap), masukkan ke IMxDocumentdan setel RelativePathske true, dan gunakan IMapDocument.Save()untuk menyimpannya.

blah238
sumber
Sudahkah Anda memverifikasi bahwa ini sebenarnya memperbaiki jalur ke relatif?
Jason Scheirer
Saya belum mencobanya sendiri, tidak, tetapi utas ini menyarankan itu harus berfungsi: forums.esri.com/Thread.asp?c=93&f=1154&t=260812
blah238
Saya juga yakin Kirk sudah tahu bagaimana melakukan ini: forums.esri.com/Thread.asp?c=93&f=992&t=64946 :)
blah238
@ blah238 Itu VBA, yang saya butuhkan adalah skrip arcpy mandiri.
Kirk Kuykendall
1
Pertanyaannya adalah mengacu pada melakukan ini dengan arcpy, bukan .NET, dan seperti yang saya pahami itu tidak mungkin dilakukan dengan arcpy di 10.0 (lihat tautan pertama dalam jawaban saya).
blah238