Sửa chữa nguồn dữ liệu trong nhiều MXD bằng ArcPy?


14

Tôi có khoảng 50 mxd với tất cả các lớp bị hỏng mà tôi đã trải qua và đặt lại thủ công.

Dữ liệu được chuyển từ một máy tính khác và cấu trúc thư mục đã được thay đổi, vì vậy đây không chỉ là một quá trình thay đổi đơn giản (ví dụ):

"F: \ Data \ Rivers.shp" thành "C: \ Data \ Rivers.shp"

nó giống như:

"F: \ Data \ Rivers.shp" thành C: \ Data \ Park \ Water \ Rivers.shp

và v.v. cho tất cả các loại dữ liệu (ranh giới, bìa rau, đường, v.v.) mỗi loại trong thư mục con của riêng chúng.

Tôi muốn tạo một tập lệnh mà tôi có thể chạy liên tục bất cứ khi nào tôi mở một trong những mxd này ít nhất sẽ sửa chữa một số lớp phổ biến hơn được tìm thấy trong hầu hết các mxd của tôi, và sau đó tôi có thể tự sửa phần còn lại. Bằng cách đó tôi có thể tiết kiệm ít nhất bản thân mình một số thời gian.

Tôi đã sử dụng một cái gì đó dọc theo dòng:

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

Ý tưởng sau đó sẽ là bằng cách nào đó thêm nhiều tập lệnh "thay thế" ở trên cho các lớp phổ biến khác có trong mxd của tôi.

Tuy nhiên, đoạn script trên thậm chí không sửa được lớp Rivers.

Làm thế nào tôi có thể làm cho nó hoạt động, và cũng thêm vào các lớp khác để được sửa chữa có đường dẫn tệp khác nhau?

Câu trả lời:


14

Bạn đang đi đúng hướng với kịch bản của bạn. Dường như vấn đề dối trá của bạn trong cách bạn đang so sánh các Layerđối tượng, vào Tên của Layertrong Table of Contents .

Khi bạn sử dụng hàm ListLayers , những gì được trả về là một Layerđối tượng. Sau đó, bạn không thể so sánh điều này với a text stringđể xem chúng có bằng nhau không, bạn cần truy cập vào Tên của Layerthay thế.

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

Để thêm nhiều bộ chọn, bạn chỉ cần mở rộng if/thenphần mã để tìm các tên lớp khác nhau.

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

Chỉ cần tiếp tục sửa đổi namebộ chọn để tìm bất kỳ lớp duy nhất cụ thể nào trong bạn .mxdvà thêm một replaceDataSourcehàm để xử lý nó. Xin lưu ý rằng tôi đã sử dụng lowerchức năng khi kiểm tra tên. Điều này cũng được ESRI sử dụng trong các tài liệu trợ giúp của họ, với lý do có khả năng là nó sẽ loại bỏ cơ hội không nhất quán trong cách viết hoa, gây ra sự không khớp trong tên lớp.

Dưới đây là bài viết Trợ giúp ESRI về Cập nhật và Sửa lỗi Nguồn dữ liệu với Ánh xạ Arcpy

Các tệp Trợ giúp cho ArcGIS nói chung rất hữu ích vì chúng chứa các giải thích rõ ràng và rất nhiều mẫu mã Python mà bạn có thể chỉ cần sao chép / dán và sửa đổi cho phù hợp với nhu cầu cụ thể của mình.

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.