Phát hiện Tham gia lập trình bằng ArcPy?


10

Tôi có một số mã Python được khởi chạy từ trong một dự án ArcMap. Bất kỳ tham gia nào mà người dùng có thể đã tạo trong dự án phải được xóa để mã của tôi chạy. Thật không may, mã loại bỏ một tham gia Arcpy.RemoveJoin_man quản lý ("layer1", "layer2") cũng phá vỡ một số thuộc tính lớp quan trọng đối với ứng dụng của tôi (các trường được tô sáng, các trường chỉ đọc, v.v.).

Nếu các phép nối được loại bỏ bằng cách nhấp chuột phải vào lớp trong ArcMap và chọn ra Xóa Xóa Joins thì các thuộc tính của lớp vẫn còn nguyên.

Nếu tôi có thể phát hiện ra rằng một phép nối tồn tại từ bên trong mã của mình, tôi sẽ chỉ cần thoát mã và hiển thị thông báo rằng người dùng phải xóa thủ công các liên kết của họ trước khi thử chạy mã. Vì vậy, có thể phát hiện tham gia chương trình không?


Tôi hơi lạc lõng với cách thực hiện RemoveJoin thông qua arcpy gây ra vấn đề. Làm thế nào để nó phá hỏng một lĩnh vực chỉ đọc? Ngoài ra, việc sử dụng công cụ Remove Join trong ArcMap có gây ra vấn đề tương tự không?
Nathanus

Có lẽ một cách khác để giải quyết vấn đề này là làm cho mã python của bạn không nhạy cảm để tham gia?
Dan S.

@ Nathanus - Hướng dẫn Xóa Tham gia trong ArcMap không phá vỡ các thuộc tính lớp của tôi, công cụ GP cũng vậy. Dưới đây là một trích dẫn có liên quan từ Trợ giúp ESRI: "Vì các công cụ này thực hiện quá trình tham gia hậu trường thực tế hơi khác so với hộp thoại Tham gia dữ liệu, hãy sử dụng các công cụ nếu bạn gặp phải bất kỳ sự cố không mong muốn nào với chức năng nối trên hộp thoại đó. "
BrianPeasley

@ Dan S. - Tôi đang sử dụng con trỏ chèn và như vậy trong mã của tôi. Tôi không biết làm thế nào tôi có thể làm cho mã của tôi không nhạy cảm để tham gia.
BrianPeasley

1
tốt, nó đáng để hỏi ;) forum.esri.com/Thread.asp?c=93&f=1729&t=293173 dường như ngụ ý rằng bạn có thể cập nhật các giá trị trong bảng đã tham gia bằng cách thêm tiền tố tên cột theo tên bảng; có lẽ nó sẽ làm việc trên một chèn quá?
Dan S.

Câu trả lời:


8

Quá tệ, không có thuộc tính hasJoin trên lớp arcpy.Layer . Tôi nghĩ rằng bạn có thể kiểm tra sự tham gia bằng cách nhìn vào tên trường mặc dù. Đây là một bằng chứng đơn giản về khái niệm dữ liệu trong cơ sở dữ liệu địa lý tệp:

import arcpy, arcpy.mapping as arc

def joinCheck(lyr):
  fList = arcpy.Describe(lyr).fields
  for f in fList:
    if f.name.find(lyr.datasetName) > -1:
      return True
  return False

arcpy.env.workspace = r'<path_to_your_gdb>'
mxd = arc.MapDocument(r'<path_to_your_mxd>')
lyrs = arc.ListLayers(mxd)
for lyr in lyrs:
  # ignore group layers
  if not lyr.isGroupLayer:
    hasJoin = joinCheck(lyr)
    if hasJoin:
      print '\nFound a join: %s.' % lyr.datasetName
    else:
      print '\nNo join found on %s.' % lyr.datasetName

Điều này có vẻ đầy hứa hẹn! Tôi không hiểu thịt của những gì nó đang làm: "nếu f.name.find (lyr.datasetName)> -1:" nhưng tôi sẽ thử nó sau vài ngày và báo cáo lại (Tôi sắp bị tuyết rơi trong & mất điện!) ... Cảm ơn!
BrianPeasley

Vui mừng được giúp đỡ. Kiểm tra việc xây dựng trong phương pháp tìm cho chuỗi python: docs.python.org/library/string.html và cũng là doc cho các đối tượng lĩnh vực arcpy: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/ Trường / Khác tôi muốn cung cấp cho mã này một cú đánh với dữ liệu của bạn và xem nó có hoạt động không.
Derek Swingley

1
Cuối cùng tôi đã sử dụng một hàm rất giống với hàm này và nó hoạt động rất tốt ... Đối với mỗi lớp trong tài liệu của tôi, tôi lặp qua danh sách các trường và sử dụng Python để xác định xem có "dấu chấm" trong tên trường không.
BrianPeasley

1

Tôi nghĩ bạn sẽ thấy rằng không có cách chống đạn nào để làm điều này với các đối tượng GP, bạn sẽ cần sử dụng ArcObjects và comtypes. Dưới đây là một số thảo luận từ các diễn đàn ESRI về những khó khăn trong việc kiểm tra các liên kết với các công cụ / đối tượng GP tiêu chuẩn: https://geonet.esri.com/thread/20317


ArcObjects và comtypes sẽ không phải là giải pháp cho dự án này, chúng xa lạ với tôi và dự án này là do ngày hôm qua. Cảm ơn đã chỉ cho tôi chủ đề diễn đàn đó! Tôi sẽ thử ý tưởng được trình bày ở đó: "... kiểm tra xem bất kỳ trường nào trong tên trường.split (".) Sẽ dẫn đến 2 phần trong đó phần đầu tiên sẽ là bảng Tham gia! "
BrianPeasley
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.