Dizin ağacını nasıl tarayabilirim ve Mxd relativePath'lerini nasıl true olarak değiştirebilirim?


9

Her proje klasörünün birçok alt klasörü olabileceği çok sayıda proje klasörü var. Bu alt klasörler mxds, şekil dosyaları, kişisel gdb'ler ve fgdb'ler içerebilir. Birçok durumda, kullanıcı mxds'ı kaydetmeden önce "Göreli Yolları Kullan" ı kontrol etmeyi unutur, böylece klasör kopyalandığında veri kaynağı bağlantıları kopar.

Ben dizinleri tarar, her mxd açar, relativePaths true olarak ayarlar, sonra mxd kaydeder bağımsız bir arcpy komut dosyası yazmak istiyorum. Bunu bir yerde yapan bir senaryo var mı?

MapDocument nesnesindeki relativePaths özelliği salt okunurdur . Bunu değiştirmenin başka bir yolu var mı?


Bunun mümkün olup olmadığından emin değilim veya bu iş akışını kullanmıyorum. Ancak, her bir .mxd'yi otomatik olarak açarsanız, o orijinal .mxd'deki tüm veri kaynaklarını ve bilgileri, göreli yolları kontrol edilmiş yeni bir boş .mxd'ye kopyalarsanız ve sonra yenisini yeniden kaydederseniz, işe yarayabileceğini düşünüyorum. Eğer ilk yolunuz mümkün değilse, sadece bir çözüm olarak bir fikir.
MLowry

Bunun mümkün olduğunu düşünmüyorum. Bununla birlikte, mutlak yolları ve yazarlarını kullanarak tüm belgelerin bir listesini alabilir ve sert bir e-posta ile SPAM yapabilirsiniz.
Sean

Yanıtlar:


6

Bu, aşağıdaki python komut dosyasını kullanarak mümkündür ( ESRI forumundaki Neil Clemmons sayesinde ). Pierssen Consulting'ten comtypes kütüphanesine ve Snippets modülüne ihtiyacınız olacak .

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

Ayrıca Pierssen'in Snippets modülünü kullanmak için yerel kanonik iş parçacığına bakın. Python'dan ArcObjects'e nasıl erişebilirim?
matt wilkie

2

10.0'da mümkün değil , ancak bir .NET uygulaması yazmanın aşırıya kaçacağı, ancak gerekli işlevin arcpy / arcgisscripting modüllerinde açıklanmadığı gibi nispeten basit görevler için Python'daki ArcObjects'i kullanarak bazı başarılar elde ettim. Dizin ağacı bölümünü taramak için os.walk komutunu kullanın .

ArcObjects biti için, IMapDocument.Open()MXD'yi (ArcMap'te açmaya gerek kalmadan) açmak, kullanın IMxDocumentve RelativePathstrue değerine ayarlamak için kullanın IMapDocument.Save()ve kaydetmek için kullanın .


Bunun gerçekten göreli yollarını düzelttiğini doğruladınız mı ?
Jason Scheirer

Kendim denemedim, hayır, ama bu konu işe yarayacağını gösteriyor: forums.esri.com/Thread.asp?c=93&f=1154&t=260812
blah238

Ayrıca eminim Kirk bunu nasıl yapacağını zaten biliyor: forums.esri.com/Thread.asp?c=93&f=992&t=64946 :)
blah238

@ blah238 Bu VBA, tek ihtiyacım olan bağımsız bir senaryo.
Kirk Kuykendall

1
Soru bunu .NET ile değil, arcpy ile yapmakla ilgiliydi ve anladığım kadarıyla arcpy ile 10.0'da yapmak mümkün değil (cevabımdaki ilk bağlantıya bakın).
blah238
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.