Thay đổi đường dẫn nguồn dữ liệu liên quan đến tập dữ liệu tính năng trong các tệp * .lyr bằng ArcPy?


11

Làm thế nào người ta có thể thay đổi đường dẫn dữ liệu nguồn cho mọi tệp lớp trong thư mục X bằng arcpy?

Tôi đã theo dõi Cập nhật và sửa các nguồn dữ liệu bằng arcpy.micking một cách tốt nhất có thể, nhưng tất cả những gì tôi nhận được là không hữu ích Runtime error <type 'exceptions.ValueError'>: Layer: Unexpected error, điều đó không đủ cho tôi để khắc phục những gì sai hoặc thiếu.

Đây là mã (được đơn giản hóa để kiểm tra một tệp lớp):

import arcpy, os

fname = r'K:\Layers\xxx.lyr'
lyr = arcpy.mapping.Layer(fname)
oldpath = lyr.workspacePath
print 'oldpath: ', oldpath
lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb')
print 'newpath: ', lyr.workspacePath

và kết quả:

oldpath:  K:\Canvec_Utility\Temp.gdb
Traceback (most recent call last):
  File "x10x.py", line 12, in <module>
    lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb')
  File "C:\ESRI\ArcGIS\Desktop10.0\arcpy\arcpy\utils.py", line 181, in fn_
    return fn(*args, **kw)
  File "C:\ESRI\ArcGIS\Desktop10.0\arcpy\arcpy\_mapping.py", line 601, in findAndReplaceWorkspacePath
    return convertArcObjectToPythonObject(self._arc_object.findAndReplaceWorkspacePath(*gp_fixargs((find_workspace_path, replace_workspace_path, validate), True
)))
ValueError: Layer: Unexpected error

((chuyển phần 'cập nhật' thành câu trả lời))


các Runtime error...trích dẫn ở trên là từ vỏ python tương tác trong ArcCatalog, mà không đưa ra một traceback. Các kết quả với truy nguyên được sao chép từ một vỏ lệnh.
matt wilkie

1
Bạn đang di chuyển dữ liệu vào hoặc ra khỏi bộ dữ liệu tính năng cũng như không gian làm việc?
geographika

@geographika: vâng, FDS đang thay đổi cũng như không gian làm việc. Tôi đã bị nhầm lẫn bởi tài liệu nói rằng không chỉ định FDS, và mxd và lyr đã bỏ qua chúng. Xác nhận mặt khác không bỏ qua chúng, hoặc ít nhất là không hoàn toàn (xem câu trả lời của tôi).
matt wilkie

Câu trả lời:


7

Có vẻ như phương thức chính xác để sử dụng khi chuyển đổi không gian làm việc VÀ bộ dữ liệu tính năng là lyr.replaceDataSource () . Đây là kịch bản làm việc của tôi:

''' Change the datasource path for the given layer file '''

import arcpy, os

# layer file to re-path
fname = arcpy.GetParameterAsText(0)
# new path to workspace containing the feature class
target_wspace = arcpy.GetParameterAsText(1)
# where to save the layer files
savedir = arcpy.GetParameterAsText(2)

lyr = arcpy.mapping.Layer(fname)

fixed_fname = os.path.join(savedir, lyr.longName)

print '\nOld layer properties (%s)' % (fname)
print 'workspace:\t', lyr.workspacePath
print 'full path:\t', lyr.dataSource

try:
    lyr.replaceDataSource(target_wspace, 'FILEGDB_WORKSPACE', lyr.datasetName, True)
    lyr.saveACopy(fixed_fname)
except:
    print arcpy.GetMessages()

print '\nNew layer properties (%s)' % (fixed_fname)
print 'workspace:\t', lyr.workspacePath
print 'full path:\t', lyr.dataSource

del lyr

Trong thử nghiệm, có vẻ như xác thực trong phương thức này lại khác: nó xác minh không gian làm việc mới là hợp lệ, nhưng bỏ qua lớp tính năng và bộ dữ liệu tính năng - có nghĩa là nó sẽ không trả về lỗi nếu không có FC đích.

Mặt khác, nếu FC mục tiêu có mặt, ngay cả trong một tập dữ liệu tính năng khác, đường dẫn nguồn dữ liệu mới được điều chỉnh phù hợp cho dù xác thực là đúng hay sai.

Cập nhật: bây giờ trên Github để cho phép chia sẻ và sửa đổi dễ dàng hơn.


Điều này có hoạt động khi tôi muốn thay thế tệp shp nguồn .lyr bằng một tệp mới không? Tôi nhận được ValueError: Layer: Lỗi không mong muốn.
GeorgeC

@GeorgeC - Tôi biết đây là một bài viết cũ nhưng trong trường hợp bất kỳ ai tìm thấy điều này thông qua công cụ tìm kiếm, giải pháp cho lỗi này có thể sẽ bỏ .shp từ tên tập dữ liệu. IOW arg thứ ba để thay thếDataSource cần phải là "newfile" chứ không phải "newfile.shp"
perrygeo 28/03

6

Không có ích unexpected errortrong trường hợp này có nghĩa là một cái gì đó như "con đường mới không tồn tại" . validateTham số tùy chọn mặc định là True nếu không được chỉ định. Với false, tập lệnh hoàn thành không có lỗi nhưng các tệp lớp kết quả vẫn bị hỏng ngay cả khi đường dẫn đích và lớp tính năng tồn tại.

...    
lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb', False)
...

kết quả

oldpath:  K:\code\Canvec\Scripts\Temp.gdb
newpath:  C:\some\other.gdb

Ngoài việc ban đầu không biết xác thực mặc định là đúng, một lỗi hoặc ít nhất là một số hành vi rất kỳ quặc khiến việc khắc phục sự cố này trở nên khó khăn. Cập nhật và sửa các nguồn dữ liệu bằng arcpy.micking cho biết Không bao gồm tên của các bộ dữ liệu tính năng trong đường dẫn không gian làm việc. Bộ dữ liệu tính năng là một phần của không gian làm việc. Ví dụ: nếu một lớp đối tượng được chuyển từ một lớp đối tượng độc lập sang tập dữ liệu tính năng, tài liệu bản đồ sẽ vẫn mở mà không bị phá vỡ lớp "" Nếu một lớp hoặc bảng trong tài liệu bản đồ hoặc tệp lớp được chuyển vào hoặc ra khỏi bộ dữ liệu tính năng, các liên kết của chúng không bị phá vỡ. "

Nó chỉ ra rằng xác nhận có một góc hơi khác về điều này. Có, không có vấn đề gì trong cơ sở dữ liệu địa lý mới (không gian làm việc) mà lớp tính năng đích cư trú , ở cấp cao nhất hoặc trong một bộ dữ liệu tính năng hoàn toàn khác. Tuy nhiên, không gian làm việc đích phải chứa một tập dữ liệu tính năng có cùng tên hoặc xác thực không thành công .

Các lớp bị hỏng và "cố định", khi chúng nhìn vào Arccatalog và Arcmap

Nguồn :

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.