Thay đổi nguồn dữ liệu cho tất cả các lớp trong MXD?


25

Tôi có một MXD. Nó kết nối với khoảng 30 lớp trong một trong các cơ sở dữ liệu SDE của chúng tôi. Tôi muốn thay đổi cơ sở dữ liệu SDE mà họ kết nối.

Có cách nào để làm điều này mà không cần phải nhấp chuột phải vào mỗi lớp và thay đổi nó riêng lẻ không?

Câu trả lời:


37

Nhấp chuột phải vào mxd trong ArcCatalog, nhấp vào Đặt nguồn dữ liệu và thay đổi hàng loạt từ đó. Tuy nhiên, công cụ này cảnh báo:

Lưu ý: hộp thoại này chủ yếu dành cho việc chuẩn bị tài liệu bản đồ để xuất bản. Các tùy chỉnh (mã VBA, Điều khiển giao diện người dùng và thanh công cụ tùy chỉnh), biểu đồ và thuộc tính xuất hiện của cửa sổ bảng được xóa khỏi tệp .mxd khi bạn cập nhật nguồn dữ liệu của chúng bằng hộp thoại này. Để bảo toàn chúng, hãy cập nhật các nguồn dữ liệu trong ArcMap.

Bạn cũng có thể sử dụng thư viện python arcpy.micking :


Điều này dường như không hoạt động trong 10.1. Nguồn dữ liệu được thay đổi, nhưng (ít nhất là trong trường hợp kết nối SDE), liên kết được thay đổi thành "kết nối cơ sở dữ liệu", nghĩa là lớp không được trỏ đến nữa, làm đứt liên kết.
Michael Todd

16

Nếu bạn đang sử dụng ArcGIS 10 và quan tâm đến việc sử dụng Python, hãy xem trợ giúp về Cập nhật và sửa lỗi nguồn dữ liệu với arcpy.micking và các phương thức của đối tượng Layer .

Thí dụ:

import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project_SDE1.mxd")
mxd.findAndReplaceWorkspacePaths(r"Database Connections\Connection to GISSDE1.sde", 
                                r"Database Connections\Connection to GISSDE2.sde")
mxd.saveACopy(r"C:\Project\Project_SDE2.mxd")
del mxd

Nếu các lớp của bạn không cùng nguồn với cùng một tệp kết nối gốc hoặc tên lớp tính năng đích khác với SDE mới, bạn có thể cần phải sử dụng Layer.replaceDataSourcethay thế.


Điều này hoạt động hoàn hảo cảm ơn! Một điều cần thêm là "Kết nối cơ sở dữ liệu \ Kết nối với GISSDE1.sde" cũng có thể được thay thế bằng vị trí .gdb.
Jack Fairfield

Làm cách nào tôi có thể sử dụng điều này từ việc chuyển nguồn dữ liệu từ SAME SDE nhưng từ phiên bản 1 sang phiên bản 2?
NULL.Dude

3
  1. Tạo kết nối nguồn dữ liệu trong ArcCatalog.
  2. Mở MXD và mở rộng lớp và nhấp vào dấu chấm than màu đỏ trong bất kỳ lớp nào. Điều này sẽ mở một cửa sổ bật lên chứa nguồn dữ liệu với kết nối cơ sở dữ liệu.
  3. Chọn kết nối cơ sở dữ liệu mà bạn đã thực hiện, nhấp đúp vào đó và đi vào bên trong lớp mà bạn đã nhấp và chọn lớp đó và nhấn OK, Mở hoặc Thêm.

Điều này sẽ xóa tất cả dấu chấm than màu đỏ có chứa các lớp trong MXD và sẽ trỏ đến nguồn dữ liệu mới được tạo. Trong một lần bạn có thể làm điều này; không cần phải đi và nhấp mỗi lần vào dấu chấm than màu đỏ và nhấp và đặt nguồn dữ liệu.


Nó rất hữu ích. Xin vui lòng đi qua cái này một lần
Inderjeet singh bhambra

3
Điều này sẽ chỉ hoạt động nếu các kết nối bị hỏng, nếu không một trong những câu trả lời khác là phù hợp hơn.
blah238

1

http://arcscripts.esri.com/details.asp?dbid=14922

Liên kết là một Arcscript cũ gọi là công cụ GDK, có thể lấy được trên các trang web khác. Chương trình tạo một thanh công cụ trong arcmap nơi bạn có thể thay đổi nguồn trên các lớp đã chọn (bất kỳ lớp nào bạn muốn. Điều này hoạt động giữa các kết nối SDE hoặc SDE sang cơ sở dữ liệu địa lý tệp (không thể xử lý nguồn trong Arccatalog, vì tên trong SDE bắt đầu bằng người dùng SDE và sau đó chấm.

Điều này rất hữu ích, nhưng có lẽ chỉ trong arcgis 9.3


1
Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
BradHards

Tôi đã sửa đổi!
jonak kích hoạt

1

Nếu bạn đã mở .mxd, hãy làm những gì @ blah238 đã làm, nhưng sử dụng 'CURRENT'thay vì đường dẫn đầy đủ. Đừng quên rằng tìm kiếm và thay thế không phải là chuỗi đầy đủ:

import arcpy
mxd = arcpy.mapping.MapDocument('CURRENT')
mxd.findAndReplaceWorkspacePaths(r"scratch", 
                                r"project/draft")

Sau đó, bạn sẽ phải lưu và mở lại tệp .mxd.


1

Đối với một mxd, các công cụ ESRI mặc định có thể đủ. Nhưng sửa nhiều mxds với các liên kết bị hỏng có thể là một cơn ác mộng. Hãy dùng thử công cụ UpdateLayerRefs của tôi để sửa các MXD không giới hạn trong vài giây: https://github.com/jswagger/UpdateLayerRefs Chỉ cần cung cấp tên của MXD đầu vào của bạn dưới dạng danh sách ["Name1.mxd", "Name2.mxd", "Name3.mxd" "]


Rất vui được chia sẻ mã của bạn :) Bạn có thể giải thích một chút về cách người ta có thể sử dụng nó không?
gisnside

Hoàn toàn: 1. Điền vào tệp cấu hình JSON:
Jeremy Swagger

Bước đầu tiên, tôi đoán! Nhưng tôi đang tự hỏi về sau - Có vẻ như bình luận của bạn đã không được đưa ra cho phần còn lại của tin nhắn. Thay vào đó, bạn có thể nên chỉnh sửa câu trả lời của mình :) :)
gisnside

1
Xin lỗi, đã kéo ra một cái gì đó. Cập nhật tệp readme ngay bây giờ ....
Jeremy Swagger

1
Đúng rồi. Chạy python UpdateLayerRefs.py --config "update_layer_Vfs.config.json" cho phép bạn chạy nó trong bất kỳ thư mục nào.
Jeremy Swagger

0

Có vẻ như bài đăng này đã cũ, nhưng tôi không thể làm cho nó hoạt động: Mã như sau:

import arcpy, glob

#specify MXD location to change source data
mxd = arcpy.mapping.MapDocument(r"C:\\Users\\jrender\\Documents\\LandbaseEditing PreProd Pub Check.mxd")
workspaceCurrent = r"Database Connections\Connection to PP_GISLand_Landbase.sde"
workspaceTarget = r"Database Connections\Connection to PP_Publication_GISLand.sde" 

mxd.findAndReplaceWorkspacePaths(workspaceCurrent, workspaceTarget)

#save a new copy of MXD
mxd.saveACopy(r"C:\Users\jrender\Documents\LandbaseEditing PreProd Pub Check Repathed.mxd")

Chào mừng bạn đến với GIS SE. Nếu bạn chưa làm như vậy, vui lòng tham quan để tìm hiểu về định dạng Hỏi và Đáp này. Câu trả lời của bạn có thể được đăng lại tốt nhất như một câu hỏi của riêng mình. Hãy chắc chắn bao gồm bất kỳ thông báo lỗi bạn nhận được khi bạn chạy mã!
Andy
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.