Thay thế / cập nhật vĩnh viễn máy chủ / dịch vụ trong mỗi Lớp ArcSDE trong MXD?


8

Sử dụng phương thức mxd.findAndReplaceWorkspacePaths, nếu và MXD được cập nhật và đường dẫn tệp kết nối .sde di chuyển lại tất cả các nguồn dữ liệu sẽ lại bị hỏng.

Có phương pháp nào để cập nhật vĩnh viễn từng lớp SDE trong Mục lục MXD để lưu trữ vĩnh viễn Máy chủ và Dịch vụ SDE không? I E. Chỉ cần thay thế SERVER và INSTANCE cho mỗi lớp SDE trong MXD bằng python hoặc ArcObjects trong Pyhton?


Cho đến nay như tôi biết, ArcMap luôn luôn sử dụng các đường dẫn đến tập tin kết nối, ví dụ "Database Connections\Connection to Foobar.sde", và không có cách nào để chỉ cần vượt qua hoặc tiết kiệm các SERVER và DỊCH VỤ thông tin trực tiếp. Tôi sẽ rất vui mừng khi được chứng minh là sai. Tôi có thể tưởng tượng một hack để lưu trữ một tệp sde được tạo động trong cùng thư mục với mxd, hoặc thậm chí có lẽ bên trong mxd, và sau đó thay vào đó đề cập đến điều đó; không biết làm thế nào để thực hiện nó mặc dù.
matt wilkie

1
@matt, tôi không nghĩ điều đó hoàn toàn chính xác; ArcMap sẽ sử dụng các thuộc tính kết nối được duy trì trong lớp. Tệp kết nối SDE không bao giờ được nhìn lại, đường dẫn của nó chỉ là siêu dữ liệu. Vấn đề ở đây dường như là cụ thể đối với các phương pháp thay thế nguồn dữ liệu phức tạp. Bạn chắc chắn có thể đặt thuộc tính kết nối mà không cần sử dụng tệp kết nối với ArcObjects (ví dụ: sử dụng giao diện IWorkspaceName ). Tuy nhiên với arcpy bạn bị giới hạn trong các phương pháp được cung cấp.
blah238

@matt bạn đúng rồi. Tôi đang sử dụng các phương pháp Arcpy. Tôi không thể có được các thuộc tính kết nối cho mỗi lớp để 'lưu'. Sự phụ thuộc để có được các thuộc tính kết nối từ đường dẫn đến tệp kết nối vẫn còn sau mxd.save () hoặc mxd.saveACopy ()
MMV

Câu trả lời:


7

Tôi đã tìm thấy một giải pháp để phá vỡ sự phụ thuộc vào đường dẫn đến tệp kết nối .sde bằng ArcPy và phương thức sau.

Cách này hoạt động:

lyr.replaceDataSource(sdeConn, "SDE_WORKSPACE", lyr.datasetName, False)
table.replaceDataSource(sdeConn, "SDE_WORKSPACE", lyr.datasetName, False)

Bạn có thể đổi tên hoặc xóa tệp kết nối sau khi MXD đã được sửa chữa và lưu lại. Nó sẽ tiếp tục mở mà không gặp sự cố sau khi tệp kết nối không còn ở đó.

Những phương pháp này KHÔNG hoạt động:

mxd.findAndReplaceWorkspacePaths
lyr.findAndReplaceWorkspacePath

Bạn KHÔNG THỂ đổi tên hoặc xóa tệp kết nối sau khi MXD đã được sửa chữa. MXD sẽ tìm tệp kết nối .sde ở cùng một vị trí mỗi lần mở.


Tôi đang sử dụng lyr.replaceDataSource, tuy nhiên Dường như arcmap không thể phát hiện ra nguồn dữ liệu mới vì nó hiển thị "!" trước lớp, vì vậy tôi phải sửa chữa nguồn dữ liệu bằng tay. Đây là mã của tôi:
Smalis

nhập khẩu hồ quang; mxd = arcpy.micking.MapDocument (r "C: \ Users \ SMALIS \ Documents \ ArcGIS \ pythonSwitchSource.mxd"); cho lyr trong arcpy.micking.ListLayers (mxd): if lyr.supports ("DATASOURCE"): lyr.replaceDataSource ("C: \ Users \ SMALIS \ AppData \ Roaming \ ESRI \ Desktop10.2 \ ArcCatalog , "SDE_WORKSPACE", lyr.datasetName, Sai) mxd.saveACopy (r "C: \ Users \ SMALIS \ Documents \ ArcGIS \ 1.mxd"); del mxd;
Smalis

Nhận xét của bạn về các phương pháp dành cho bộ dữ liệu tính năng KHÔNG LÀM VIỆC đã giúp tôi tiết kiệm rất nhiều lần thất bại MỘT CÁM ƠN LỚN! Tôi đồng ý rằng điều này đã không làm việc cho tôi hoặc nó là một lỗi? lyr.workspacePath hiển thị bộ dữ liệu tính năng
woodwa

1

Bạn cần phải đi bộ các lớp nhóm lồng nhau sau đó sử dụng arcpy.CreateArcSDEConnectionFile_managementđể tạo sde mới bằng cách sử dụng các tham số từ lyr.servicePropertiesvà truyền tham số là servProp.gethoặc arcpy.GetParameterAsText(0).

Đừng quên sử dụng os.remove(temp_sde) if os.path.exsists(temp_sde) else None.

for maplayer in lyr_list:
    walknestedgroups(maplayer)
    servProp = maplayer.serviceProperties
    if maplayer.serviceProperties["ServiceType"] == "SDE":
        host = servProp.get('Server','N\A')
    if host in ("MyServer"):
        remap_sde(maplayer)

0

Điều này có thể quá đơn giản nhưng ...
Nếu bạn đổi tên kết nối cũ và đặt tên cho kết nối mới với tên cũ thì điều đó có đạt được kết quả tốt hơn không?


Nếu bạn trỏ lại mọi Lớp trong MXD để sử dụng tệp kết nối có tại '\\ corpshare \ sde \ corpsde.sde' thì mọi thứ đều hoạt động tốt. Tuy nhiên, nếu đường dẫn đó không khả dụng, mọi MXD sẽ bị hỏng. ' Tôi quan tâm nhiều hơn đến các thuộc tính kết nối SERVER và DỊCH VỤ trong tệp kết nối, hơn là đường dẫn đến nó. Về cơ bản, tôi muốn cập nhật từng lớp MÁY CHỦ và DỊCH VỤ, vì vậy nếu đường dẫn đó không khả dụng, MXD vẫn có thể truy cập máy chủ mà không cần đường dẫn đến tệp kết nối hợp lệ.
MMV

@MMV, bạn có chắc không? Tôi vừa thử: 1) Thêm một lớp để ánh xạ bằng tệp kết nối SDE 2) Lưu MXD và đóng ArcMap 3) Xóa / đổi tên tệp kết nối SDE 4) Mở MXD đã lưu. Các lớp tải mà không có vấn đề.
blah238

@ Blah238 đúng Tôi đã thấy điều này - nếu tệp sde không còn thì nó vẫn kết nối ??? Điều tôi nghĩ là nếu bạn thay đổi các thuộc tính kết nối trong tệp sde (để trỏ nó đến một máy chủ / dịch vụ khác mà nó sẽ tìm thấy nó (như ong khi bạn không mở và ngắt liên kết trước. Tôi sẽ thử và quay lại.
Brad Nesom

Chỉ cần đọc bài viết của blah238 ở trên. Tôi đã không nhận thức được điều đó. bởi vì tôi đã gặp vấn đề về mật khẩu trước đó và đã sửa chúng bằng cách thay đổi chuỗi kết nối. có lẽ mẹo là phá vỡ nó và sửa chữa nó bằng các chuỗi kết nối mới. nhưng để phá vỡ nó, bạn phải dừng dịch vụ hiện tại. ??
Brad Nesom

@ blah238 Bằng cách tạo thủ công MXD trong ArcMap, lưu nó và xóa tệp kết nối, mọi thứ sẽ tiếp tục hoạt động sau khi đường dẫn đến tệp .sde bị 'hỏng'. Cập nhật một MXD đã có sẵn bằng ArcPy, đó là nơi vẫn phụ thuộc vào đường dẫn đến tệp kết nối.
MMV
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.