Làm cách nào tôi có thể thu thập dữ liệu cây thư mục và thay đổi Mxd tương đối thành đúng?


9

Tôi có một số lượng lớn các thư mục dự án trong đó mỗi thư mục dự án có thể có nhiều thư mục con. Các thư mục con này có thể chứa mxds, shapefiles, gdb's cá nhân và fgdb's. Trong nhiều trường hợp, người dùng quên kiểm tra "Sử dụng đường dẫn tương đối" trước khi lưu mxds, vì vậy khi thư mục được sao chép, các liên kết nguồn dữ liệu sẽ bị hỏng.

Tôi muốn viết một tập lệnh arcpy độc lập thu thập thông tin qua các thư mục, mở từng mxd, đặt RelPath thành true, sau đó lưu mxd. Có một kịch bản nào đó làm điều này ở đâu đó?

Thuộc tính RelPaths trên đối tượng MapDocument là chỉ đọc. Có một số cách khác để thay đổi điều này?


Tôi không chắc chắn về điều này là có thể hoặc không sử dụng quy trình công việc đó. Nhưng những gì tôi nghĩ có thể hoạt động là nếu bạn tự động mở từng .mxd, sao chép tất cả các nguồn dữ liệu và thông tin từ .mxd ban đầu đó vào một .mxd trống mới có các đường dẫn tương đối được kiểm tra, sau đó lưu lại một cái mới. Chỉ là một ý tưởng như một công việc xung quanh nếu cách đầu tiên của bạn kết thúc là không thể.
MLowry

Tôi không nghĩ rằng nó có thể. Bạn có thể nhận được một danh sách tất cả các tài liệu bằng cách sử dụng các đường dẫn tuyệt đối và các tác giả của chúng và SPAM chúng với một e-mail nghiêm khắc.
Sean

Câu trả lời:


6

Điều này có thể sử dụng tập lệnh python sau đây (với lời cảm ơn của Neil Clemmons tại diễn đàn ESRI ). Bạn sẽ cần thư viện comtypes và mô-đun Snippets từ 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

Đồng thời xem chủ đề chính tắc cục bộ để sử dụng mô-đun Snippets của Pierssen tại Làm cách nào để tôi truy cập ArcObjects từ Python?
matt wilkie

2

Không thể thực hiện trong 10.0 , nhưng tôi đã có một số thành công khi sử dụng ArcObjects trong Python cho các tác vụ tương đối đơn giản như thế này khi viết một ứng dụng .NET sẽ quá mức cần thiết, nhưng chức năng cần thiết không được bộc lộ trong các mô-đun arcpy / arcgisscripting. Sử dụng os.walk để thu thập thông tin phần cây thư mục.

Đối với bit ArcObjects, sử dụng IMapDocument.Open()để mở MXD (mà không cần phải mở trong ArcMap), chuyển sang IMxDocumentvà đặt RelativePathsthành true và sử dụng IMapDocument.Save()để lưu nó.


Bạn đã xác minh rằng điều này thực sự sửa chữa các đường dẫn đến tương đối?
Jason Scheirer

Tôi đã không thử nó bản thân mình, không, nhưng chủ đề này cho thấy cần làm việc: forums.esri.com/Thread.asp?c=93&f=1154&t=260812
blah238

Ngoài ra tôi đang chắc chắn Kirk đã biết làm thế nào để làm điều này: forums.esri.com/Thread.asp?c=93&f=992&t=64946 :)
blah238

@ blah238 Đó là VBA, thứ tôi cần là một tập lệnh arcpy độc lập.
Kirk Kuykendall

1
Câu hỏi liên quan đến việc làm điều này với arcpy chứ không phải .NET và theo tôi hiểu thì không thể thực hiện với arcpy ở 10.0 (xem liên kết đầu tiên trong câu trả lời của tôi).
blah238
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.