Lỗi thay thế Arcpy của Arcpy


8

Tôi đã kiểm tra các câu trả lời khác ở đây và không có câu trả lời nào phù hợp với tôi ...

Đây là một vấn đề "đơn giản" trong việc tìm một lớp theo tên trong bản đồ và thay đổi nguồn dữ liệu của nó.

Đây là kịch bản của tôi:

    #-- New Source
    newSource = os.path.join(currDir, lyrZones + "_Dep" + dirNum + ".shp")

    #-- Validation
    if arcpy.Exists(newSource):
        print "The new source exists!"
    else:
        print "Not found!"

    #-- Find the layer and change its source            
    for lyr in arcpy.mapping.ListLayers(mxd):
        if lyr.name == lyrZones:
            print "Layer found!"
            print layers.dataSource
            print "  Replacing source..."
            lyr.replaceDataSource(currDir, "SHAPEFILE_WORKSPACE", newSource)
            print lyr.dataSource

Tôi chạy nó từ một kịch bản python bên ngoài ArcGIS.

nhập mô tả hình ảnh ở đây

Bạn có thể thấy rằng nguồn tồn tại, lớp được tìm thấy, tôi có thể truy cập vào nguồn dữ liệu của nó bằng cách in nó, nhưng lyr.replaceDataSource gây ra lỗi (Lỗi không mong muốn ... không giúp ích nhiều ...)

Tôi đã làm việc ở đó được 4-5 giờ và tôi không có giải pháp nào để thử. Bất kỳ ý tưởng những gì có thể gây ra vụ tai nạn?


1
Thoạt nhìn, có vẻ như bạn đã có một số ký tự kỳ lạ trong đường dẫn thư mục của mình. Hãy thử di chuyển shapefile vào một thư mục thử nghiệm D:\testvà xem nếu nó hoạt động.
Mintx

Không bao giờ có bất kỳ vấn đề với điều đó trước đây. Ký tự là "#" và đó chỉ là một thủ thuật sắp xếp cũ để các dự án của tôi sẽ xuất hiện đầu tiên. Tôi đã thử đưa dự án của mình vào D: / TEMP, nhưng nó không hoạt động ...
fgcartographix

Câu trả lời:


4

Tôi biết điều này khá cũ, nhưng tôi chỉ gặp phải vấn đề tương tự và rất ngạc nhiên vì thiếu giải pháp ngoài kia. Giải pháp rất đơn giản, nhưng bạn không có cách nào biết được nó dựa trên sự trợ giúp thực tế không tồn tại của ESRI:

Không bao gồm phần mở rộng shapefile. ...Đó là nó.

newSource = os.path.join(currDir, lyrZones + "_Dep" + dirNum + ".shp")

Nên đọc:

newSource = os.path.join(currDir, '{}_Dep{}'.format(lyrZones, dirNum))

1
Các câu hỏi và câu trả lời liên quan đến shapefiles. Tuy nhiên, tôi đã gặp một vấn đề tương tự với một lớp tính năng trong Cơ sở dữ liệu địa lý doanh nghiệp (còn gọi là SDE). Hóa ra arcpy.Exists yêu cầu một tên đủ điều kiện. Tuy nhiên, layer.replaceDataSource không thành công nếu bạn sử dụng tên đủ điều kiện, nhưng hoạt động nếu bạn chỉ sử dụng tên tính năng và bỏ qua cơ sở dữ liệu và tên người dùng.
dvdhns

1

Vui với gỡ lỗi! Thử cái này:

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name == lyrZones:
        if lyr.supports("DATASOURCE"):
            print lyr.dataSource
            print currDir
            print newSource
            lyr.replaceDataSource(currDir, "SHAPEFILE_WORKSPACE", newSource, TRUE)
            print "Did we crash yet?"
            print lyr.dataSource
        else:
            print "Layer isn't supported!"

Ít nhất tôi biết Datasource được hỗ trợ. Có thông báo lỗi tương tự. Sự cố trên "lyr.replaceDataSource (currentDir," SHAPEFILE_WORKSPACE ", newSource, True)". Không nhận được "Chúng ta đã sụp đổ chưa?". Bực bội ...
fgcartographix

Argh, thật tệ Mục tiêu cuối cùng mà bạn đang cố gắng đạt được là gì? Có lẽ có một cách khác để đi về điều này.
Mintx

Tôi có 5 mẫu và từ 14 đến 50 bản đồ mỗi loại cần làm (tổng cộng 128 bản đồ). Tôi có hai lớp để cập nhật trên mỗi lớp. Đầu tiên chỉ là một Def. Truy vấn mà tôi đã xử lý như một ông chủ;) (lyr.defTHERQuery = defQueryLines). Lớp kia là một lớp đa giác có ký hiệu màu tốt nghiệp, nhưng tệp phải thay đổi. Tôi đã viết một tập lệnh tạo đầu ra cho mỗi bản đồ và tôi cần cập nhật nguồn và thay đổi giá trị ký hiệu (nhưng tôi nghĩ đó là bản 10.1 đó. Tôi có 10.0) để tôi có thể giữ bản tượng trưng ...
fgcartographix

Hiện tại, tôi cập nhật tệp theo cách thủ công (lô đầu tiên có 20 bản đồ để không quá tẻ nhạt), nhưng bản tiếp theo sẽ có 50 bản đồ nên ...
fgcartographix

Công cụ có phải làm việc với tệp .lyr không? Có lẽ tôi có thể làm việc trực tiếp trên một .lyr nơi tôi có thể thay đổi là nguồn dữ liệu. Tôi không thấy bất kỳ thuộc tính nào để thay đổi valye symbology (trường được ký hiệu mặc dù ...)
fgcartographix

1

Tôi không biết điều này có giúp gì cho bạn hay không nhưng tôi đã gặp phải lỗi này khi cố gắng chuyển nguồn dữ liệu SDE cho một lớp. Những gì tôi tìm thấy là khi tôi chạy từ PyScripter, nó sẽ làm hỏng quá trình python.exe 64 bit. Tôi sẽ nhận được ValueError. Nếu tôi buộc tập lệnh chạy bằng python.exe 32 bit qua Dấu nhắc lệnh, tôi sẽ không gặp lỗi. Tôi không biết điều đó có giúp ích cho vấn đề của bạn hay không nhưng nó đáng để thử!


Cảm ơn. Tất cả đều là 32 bit, vì vậy đây không phải là vấn đề, nhưng tôi sẽ ghi nhớ điều đó khi tôi thử xử lý địa lý 64 bit. Hiện tại, tôi đã bỏ phần đó ra khỏi kịch bản của mình và thay thế nguồn bằng tay ... :(
fgcartographix

1

Hầu hết thông tin về điều này là ở đây . Nhưng để giải quyết điều này, tôi đã đi vào cửa sổ python trong ArcCatalog để kiểm tra các định nghĩa ESRI của từng tham số trong hàm .replaceDataSource.

.replaceDataSource (không gian làm việc, workspace_type, tập dữ liệu_name)

không gian làm việc = không gian làm việc của nguồn dữ liệu mới

workspace_type = loại không gian làm việc thực tế được liệt kê trong phần nguồn dữ liệu thay thế của trợ giúp được liên kết.

tập dữ liệu_name = tên tệp không có loại tệp (IE: .shp), không phải tên tập dữ liệu trong mục lục. Không cần cho thư mục ở phía trước của 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.