Thay đổi thành nhãn thay thế nếu nhãn đầu tiên không phù hợp với QGIS?


10

Tôi đang cố gắng tạo một bản đồ để in ra và kích thước của đa giác của tôi rất khác nhau. Vì đây sẽ là bản đồ tham chiếu tôi cần gắn nhãn cho mọi đa giác, nhưng một số tên sẽ không phù hợp với đa giác. Trong những trường hợp đó, tôi muốn sử dụng id tính năng thay thế và sau đó có một bảng thuộc tính liên kết id với tên.

Những gì tôi muốn làm là có một số loại biểu thức mà tôi có thể sử dụng để chọn nhãn nào sẽ sử dụng trên bản đồ và các hàng sẽ bao gồm trong bảng thuộc tính. Một cái gì đó như thế isLabelledsẽ có thể đưa tỷ lệ bản đồ, chiều dài nhãn, kích thước phông chữ vv vào tài khoản.


2
Hãy nhớ rằng nó có thể gây nhầm lẫn cho người dùng bản đồ, khi các đa giác của cùng một lớp tính năng được gắn nhãn theo các cách khác nhau và ngoài ra chỉ một số trong số chúng xuất hiện trong bảng thuộc tính.
Tallistroan

Tôi đang nghĩ về bản đồ GB của quận
Ian Turton

Điều gì về động thay đổi phông chữ cho phù hợp? Bạn có thể lấy các kích thước tính năng dài nhất, chia cho bao nhiêu ký tự trong chuỗi nhãn và thực hiện một số phép toán theo tỷ lệ hoặc chỉ sử dụng số đó để thay đổi kích thước phông chữ đã đặt của bạn ... Hoặc bạn có thể sử dụng số đo đó (dài nhất tính năng kích thước / len của chuỗi) và nếu đó là nhãn quá dài với id.
Jesse McMillan

chủ yếu là tôi quan tâm đến khả năng đọc nên tôi không muốn gây rối với kích thước phông chữ
Ian Turton

1
Bạn có thể sử dụng biểu thức tùy chỉnh Python lấy nhãn, kích thước phông chữ và tỷ lệ và trả về đúng hoặc sai nếu nó phù hợp. Sau đó, trong công cụ biểu thức sử dụng mệnh đề if để chuyển nhãn. Tôi sẽ đưa ra câu trả lời cho bạn sau với các ví dụ.
Jesse McMillan

Câu trả lời:


8

Đây là một cách gần đúng (nhưng hy vọng hiệu quả) để làm điều đó.

Đầu tiên một số toán học. Chúng ta cần tìm hiểu có bao nhiêu ký tự ở một cỡ chữ nhất định mà một tính năng có thể chứa. Ở đây những điều / giả định cần biết:

  • giả sử các đơn vị số liệu, (được thêm một chút thay đổi dưới đây có thể giúp chúng tôi hoạt động tốt hơn.)
  • cỡ chữ là thước đo chiều cao phông chữ. Hầu hết các phông chữ rộng khoảng một nửa khi chúng cao.
  • sử dụng pt cho chiều cao phông chữ, 1pt là 0,035CM
  • giả sử bưu kiện của bạn là khoảng hình chữ nhật / thường xuyên

Để tìm thời gian một mục trên màn hình / bản in, chúng ta có thể sử dụng kích thước dài nhất của nó (chiều dài hoặc chiều cao hoặc chỉ chiều dài nếu nhãn của bạn chỉ nằm ngang) / tỷ lệ * 100 (để đi từ M đến CM)

Sau đó, chúng tôi có thể xem nếu nhãn của chúng tôi sẽ phù hợp.

Bạn có thể làm tất cả trong công cụ biểu thức, nhưng một biểu thức python tùy chỉnh sẽ hiệu quả hơn. Đây là một hướng dẫn về cách tạo ra một.

Biểu thức tùy chỉnh của tôi:

from qgis.core import *
from qgis.gui import *

@qgsfunction(args='auto', group='Custom')
def labelFits(labelStr, fontPt, scaleM, feature, parent):
    # returns true if a label will fit in the feature at a given
    # font size and scale

    bbox = feature.geometry().boundingBox()

    # for CRS in us foot
    # fontWidth = fontPt * 0.0875

    # for CRS in metric
    # 1pt = 0.035CM
    fontWidth = fontPt * 0.035 * 0.5

    # length of maximum dimension on-screen/print in CM
    labelRoom =  max(bbox.width(),bbox.height()) / scaleM * 100

    # approx length of our label in CM based on font height * 0.5
    labelLen = len(labelStr) * fontWidth

    if labelRoom > labelLen:
        return True
    else:
        return False

Sau đó, chỉ cần sử dụng biểu thức đó trong nhãn:

if(labelFits( "yourAttribute" , 8 , @map_scale ), "yourAttribute",$id)

Tất nhiên, bạn sẽ cần phải cắm bất cứ thuộc tính nào bạn thực sự sử dụng và thay đổi kích thước phông chữ từ 8 thành bất cứ thứ gì bạn đang sử dụng. Ngoài ra, vì phông chữ thay đổi khá nhiều, bạn có thể cần phải chỉnh nó một chút cho đến khi nó trông ổn.

Bạn cũng có thể sử dụng biểu thức đó để làm những việc như thay đổi màu sắc dựa trên việc nhãn có phù hợp hay không.


Để sử dụng biểu thức này bên ngoài khung vẽ bản đồ (nghĩa là trong nhãn của nhà soạn nhạc hoặc bảng thuộc tính), chúng ta cần một cách để lập trình lấy tỷ lệ của một mục bản đồ nhất định. Tôi đã đăng mã để thực hiện điều đó trong một câu trả lời khác ở đây Phương thức này cung cấp cho chúng tôi một biểu thức getScale ('tên người dùng', 'tên bản đồ') để kết hợp nó vào biểu thức của chúng tôi:

if(
    labelFits( "yourAttribute" , 8 , getScale('composername','mapname')),
    "yourAttribute",$id)

1
Tôi đã nghĩ về một cái gì đó tương tự quá. Đặc biệt nếu sử dụng các đơn vị bản đồ và một phép chiếu tính bằng mét. Các toán tử hình học (ish) mới cũng có thể giúp đỡ ở đây, giả sử các nhãn được tập trung vào tâm. Điều này sẽ hoạt động tốt hơn với phông chữ có chiều rộng cố định (đơn cách) so với phông chữ tỷ lệ (ví dụ: 'W' rộng hơn nhiều so với chữ 'i'). Bạn đang ở một cái gì đó ở đây, nhưng tôi nghi ngờ phông chữ tỷ lệ và k sâu sẽ thêm phức tạp.
Steven Kay

Bạn có thể sử dụng imagefont.getsize () của pil. Điều đó sẽ cung cấp cho bạn độ rộng chính xác của một chuỗi được hiển thị trong phông chữ bạn đã chọn, nhưng tôi nghĩ rằng nó sẽ có một hiệu suất lớn. Toán học sơ bộ ở trên đơn giản hơn nhiều, đặc biệt nếu bạn có hàng trăm nhãn trên màn hình
Jesse McMillan

Vấn đề nhỏ duy nhất là hàm dường như không hoạt động như một bộ lọc trong các bảng thuộc tính trong trình soạn thảo in.
Ian Turton

Có tỷ lệ bản đồ của bạn thay đổi từ trang này sang trang khác? Hãy thử đặt thủ công theo tỷ lệ thay vì biến @map_scale. Tôi đoán là bảng thuộc tính không có cách nào biết tỷ lệ bản đồ của bạn. (Vì ví dụ: bạn có thể có nhiều mục bản đồ trong nhà soạn nhạc ở các tỷ lệ khác nhau)
Jesse McMillan

1
@iant Tôi đã đăng một liên kết đến một biểu thức tùy chỉnh khác sẽ có tỷ lệ bản đồ nhà soạn nhạc của bạn theo chương trình.
Jesse McMillan

3

Sao chép lớp, một lớp không có ký hiệu và đặt các mức thu phóng / cài đặt chướng ngại vật khác nhau cho các nhãn cho mỗi nhãn.


1

Tôi đã có một tình huống tương tự với nghĩa vụ dán nhãn cho mỗi con đường trong một lớp đường. Giải pháp của tôi là tạo ra khung vẽ ở kích thước lớn hơn, xuất thành PDF và sau đó in PDF sang kích thước được yêu cầu.

Ví dụ, thành phẩm được yêu cầu là A3. Trên khung vẽ ở A3 tôi không thể vừa với tất cả các nhãn. Vì vậy, tôi đã tạo ra khung vẽ A2 và điều đó cho phép nhìn thấy tất cả các nhãn. Tạo một tệp PDF của bản đồ kích thước A2 và in dưới dạng A3.

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.