Thay đổi kiểu nhãn (phông chữ, màu sắc, kích thước, v.v.) bằng ArcPy?


9

Tôi đang cố gắng viết một macro python cho ArcGIS 10.2 để tự động hóa quá trình ghi nhãn điểm trong một lớp dựa trên các loại căn hộ khác nhau. Ví dụ: một kiểu căn hộ sẽ có hình vuông màu xanh với chữ in đậm màu trắng làm một nhãn; một cái khác sẽ có một hình vuông màu hồng với chữ đậm màu đen; một cái khác sẽ có hình vuông màu đỏ với chữ in đậm màu trắng, v.v.

Biểu thức hoặc chức năng nào bạn sẽ sử dụng trong arcpy để thay đổi kiểu của các nhãn này?

Hiện tại, kịch bản gắn nhãn các căn hộ theo mã bản đồ và thay đổi tên của nó trong TOC thành căn hộ.

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

Bây giờ tôi muốn thay đổi phông chữ, đồ họa và kích thước của các nhãn để tạo một nhãn duy nhất cho mỗi nhãn, sau đó tạo nút để nhấn và tự động hóa quy trình bất cứ khi nào chúng tôi phải thực hiện một trong các lớp này.

Có cách nào để thay đổi phông chữ, nhãn và đồ họa bằng cách sử dụng tập lệnh Python (ArcPy, IDLE, v.v.) không?


Tôi quyết định chỉnh sửa bài đăng này để đưa ra một mô tả cuối cùng về những gì tôi sẽ làm ở đây để không có sự nhầm lẫn. Về cơ bản, các điểm trên bản đồ sẽ đi từ trông giống như hình trên đến đây:

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


Tôi đã thử sử dụng lblClass.expressionchức năng, tuy nhiên mã tôi đang cố sử dụng không hoạt động. Tôi nghĩ rằng đó có thể là bước đi đúng hướng. Dưới đây là một số mã mà tôi đã cố gắng sử dụng chỉ để lấy nhãnClass.expression để thay đổi phông chữ của nhãn.

for lblClass in aptLayer.labelClasses:
lblClass.showClassLabels = True
def getLabel (Code, Type):
if Type == "MRR":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TAX":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "MRT":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "GSS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TGS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
else:
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"

lblClass.expression = getLabel( [Map_Code],[Type])

Câu trả lời:


7

API arcpy.micking chỉ cung cấp quyền truy cập vào một số thuộc tính lớp giới hạn có thể được sửa đổi trực tiếp nhưng tất cả các thuộc tính được tìm thấy trong hộp thoại Thuộc tính lớp có thể được sửa đổi bằng cách sử dụng chức năng UpdateLayer. Thông tin được trích xuất từ ​​một lớp nguồn và được áp dụng cho lớp trong tài liệu bản đồ cần được cập nhật. Source_layer có thể là tệp lớp (.lyr) hoặc lớp trong tài liệu bản đồ. UpdateLayer là một chức năng mạnh mẽ bởi vì nó có thể được sử dụng theo nhiều cách khác nhau để tạo ra các kết quả khác nhau.

Bạn cần tạo ký hiệu / nhãn theo cách bạn muốn và lưu nó vào một tệp lớp. Sau đó tải tập tin lớp đó bằng arcpy.micking.UpdateLayer () .

Nếu nhiều người cần chạy bổ trợ python, thì bạn cần làm cho tệp lớp có thể truy cập được cho mọi người, chẳng hạn như ổ đĩa mạng công cộng.


Tôi đã kết thúc việc tạo một hộp công cụ Thuộc tính lớp cập nhật tùy chỉnh . Nó cho phép bạn chọn một lớp trong ArcMap TOC, sau đó chọn tệp lớp đầu vào. Sau đó, nó cập nhật lớp với tất cả các thuộc tính trong tệp lớp và nguồn lại cho lớp tính năng ban đầu. Nó sẽ hoạt động với dữ liệu trong gdb, mdb, shp hoặc sde.

Xem mã nguồn

Hãy cho tôi biết nếu bạn có bất cứ thắc mắc nào.

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


Tôi đã tạo một tệp lớp riêng biệt từ một lớp dữ liệu dựa trên điểm khác với tất cả mọi thứ được đặt (ký hiệu và nhãn), nhưng nó thực hiện, nhưng tất cả những gì nó làm là thay thế hoàn toàn tệp căn hộ không gắn nhãn (bất kỳ tệp nào tôi chọn để thêm) bằng file căn hộ nguồnLayer. Tôi cho rằng điều này là do Sai trong phần "chỉ cập nhật ký hiệu". Có cách nào để điều này có thể được thực thi để nó sẽ chỉ áp dụng ký hiệu và nhãn nhưng không di chuyển các điểm đến một vị trí khác không?
Tyler Spears

Những loại chức năng nào tôi sẽ tìm kiếm để làm điều đó? Tôi không quá quen thuộc với việc tìm nguồn cung ứng lại. Nhân tiện, tôi đánh giá cao sự giúp đỡ của bạn.
Tyler Spears

Tôi đã cố gắng điều chỉnh điều này để phù hợp với mã của tôi. Nó hoạt động thông qua chức năng UpdateLayer, nhưng ở dòng 35: refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]nó đưa ra một lỗi cho biết chỉ mục nằm ngoài phạm vi.
Tyler Spears

Điều đó có nghĩa là arcpy.mapping.ListLayersphương thức không tìm thấy một lớp trong mxd hiện tại có cùng tên với bạn input_layer_file(một chỉ mục [0]trả về chỉ mục ngoài phạm vi có nghĩa là không có mục nào trong danh sách).
XIY

Tôi đã làm và tôi cảm thấy như thế này rất gần, nhưng vấn đề là, sau khi phần UpdateLayer kết thúc, nó sẽ đưa ra lỗi sau: Traceback (most recent call last): File "E:\_Tyler Temp\Python\IanTest.py", line 30, in <module> refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0] IndexError: list index out of range
Tyler Spears

6

Một tùy chọn khác là đặt biểu thức nhãn tùy chỉnh trên lớp (thay đổi kích thước và màu sắc..vv) bằng python:

ví dụ

def FindLabel ( [NAME], [POPULATION] ):
  if long([POPULATION]) >= 250000:
    return "<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>"
  else:
    return [NAME]

Xây dựng biểu thức nhãn

Chúng có thể được đặt qua:

LabelClass (arcpy.micking)

BIÊN TẬP:

Thử đi:

def FindLabel ([Code], [Type]):
  if [Type] == "MRR":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TAX":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "MRT":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "GSS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TGS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  else:
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"

Bạn có thể xóa các câu lệnh dòng khác của mình (cho vòng lặp, labClass và gọi hàm). Ngoài ra, hàm cần được gọi là FindLabel.


Tôi đã cố gắng sử dụng một cái gì đó tương tự như một chức năng như thế này. Tôi đã tạo một định nghĩa được gọi def getLabel (Code, Type)và sau đó sau khi thiết lập các câu lệnh if-other cho các mã bản đồ khác mà tôi sử dụng, sau đó tôi đặt 'lblClass.expression = getLabel ("[Map_Code]", "[Type]")', chỉ trả về một lỗi TypeError: unsupported operand type(s) for &: 'str' and 'str'về cơ bản là tôi đang theo dõi các ví dụ của trang web Esri. Nếu tôi có thể đơn giản chứng minh rằng tôi có thể thay đổi phông chữ, thì tôi có thể chuyển sang điều chỉnh các khía cạnh khó khăn hơn (chẳng hạn như hình dạng, nền và màu sắc của nhãn).
Tyler Spears

@Tyler Spears, Hãy thử xóa dấu ngoặc kép xung quanh tên trường.
nghệ thuật21

Khi tôi làm điều đó, nó nói rằng các tham số không được xác định.
Tyler Spears

@Tyler Spears, bạn có thể gửi mã của bạn trong câu hỏi của bạn? Bạn có một trích dẫn bên ngoài dấu ngoặc đơn hàm.
nghệ thuật21

Hoàn toàn, tôi đã cập nhật câu hỏi của tôi để hiển thị mã của tôi.
Tyler Spears
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.