เปลี่ยนเป็นเลเบลสำรองหากเลเบลแรกไม่พอดีใน QGIS?


10

ฉันพยายามสร้างแผนที่เพื่อพิมพ์และขนาดของรูปหลายเหลี่ยมของฉันแตกต่างกันมาก เนื่องจากนี่จะเป็นแผนที่อ้างอิงฉันต้องติดป้ายทุกรูปหลายเหลี่ยม แต่ชื่อบางส่วนจะไม่พอดีกับรูปหลายเหลี่ยม ในกรณีเหล่านั้นฉันต้องการใช้รหัสคุณลักษณะแทนจากนั้นให้ตารางแอตทริบิวต์เชื่อมโยงรหัสกับชื่อ

สิ่งที่ฉันต้องการจะทำคือมีการแสดงออกบางอย่างที่ฉันสามารถใช้เพื่อเลือกป้ายกำกับที่จะใช้บนแผนที่และแถวที่จะรวมในตารางแอตทริบิวต์ บางอย่างเช่นisLabelledนั้นจะสามารถนำมาตราส่วนแผนที่ความยาวของฉลากขนาดตัวอักษรและอื่น ๆ มาพิจารณา


2
โปรดทราบว่าอาจสร้างความสับสนให้กับผู้ใช้แผนที่เมื่อรูปหลายเหลี่ยมของคลาสสถานที่เดียวกันมีป้ายกำกับด้วยวิธีที่ต่างกันและมีเพียงบางส่วนเท่านั้นที่ปรากฏในตารางคุณลักษณะ
tallistroan

ฉันกำลังนึกถึงแผนที่เขตของ GB
Ian Turton

สิ่งที่เกี่ยวกับการเปลี่ยนแบบอักษรให้พอดีแบบไดนามิก? คุณสามารถใช้มิติของฟีเจอร์ที่ยาวที่สุดหารด้วยจำนวนอักขระในสตริงป้ายกำกับและทำคณิตศาสตร์ด้วยสเกลหรือใช้เพื่อเปลี่ยนขนาดฟอนต์ที่ตั้งไว้ของคุณ ... หรือคุณอาจใช้การวัดนั้น (ที่ยาวที่สุด คุณลักษณะขนาด / len ของสตริง) และถ้าเป็นป้ายกำกับที่ยาวเกินไปด้วยรหัส
Jesse McMillan

ส่วนใหญ่ฉันกังวลกับการอ่านดังนั้นฉันไม่ต้องการยุ่งกับขนาดตัวอักษร
Ian Turton

1
คุณสามารถใช้นิพจน์ที่กำหนดเองของ Python โดยใช้เลเบลขนาดฟอนต์และสเกลและคืนค่าจริงหรือเท็จถ้ามันพอดี จากนั้นในนิพจน์เอ็นจิ้นใช้ถ้าประโยคเพื่อสลับป้าย ฉันจะหาคำตอบให้คุณในภายหลังพร้อมตัวอย่าง
Jesse McMillan

คำตอบ:


8

ต่อไปนี้เป็นวิธีโดยประมาณ (แต่หวังว่าจะมีประสิทธิภาพ)

ก่อนอื่นคณิตศาสตร์บางอย่าง เราจำเป็นต้องทราบว่าคุณลักษณะหนึ่งตัวสามารถบรรจุได้กี่ตัวอักษร นี่คือสิ่ง / สมมติฐานที่ควรทราบ:

  • สมมติว่าหน่วยการวัด (เพิ่มการเปลี่ยนแปลงเล็กน้อยด้านล่างซึ่งอาจทำให้การทำงานนี้สำหรับเราเริ่มไปแล้ว)
  • ขนาดตัวอักษรเป็นการวัดความสูงของตัวอักษร แบบอักษรส่วนใหญ่มีความกว้างประมาณครึ่งหนึ่งเท่าที่สูง
  • การใช้ pt สำหรับความสูงของตัวอักษร 1 พอยต์จะได้รับ 0.035CM
  • สมมติว่าพัสดุของคุณมีลักษณะเป็นสี่เหลี่ยม / ปกติ

เพื่อค้นหาระยะเวลาที่รายการบนหน้าจอ / การพิมพ์เราสามารถใช้มันเป็นมิติที่ยาวที่สุด (ความยาวหรือสูงหรือเพียงแค่ความยาวหากป้ายของคุณเป็นแนวนอนเท่านั้น) / มาตราส่วน * 100 (ไปจาก M ถึง CM)

จากนั้นเราสามารถดูว่าฉลากของเราเหมาะสมหรือไม่

คุณสามารถทำได้ทั้งหมดในเอ็นจิ้นนิพจน์ แต่นิพจน์หลามแบบกำหนดเองจะมีประสิทธิภาพมากกว่า นี่คือการสอนเกี่ยวกับวิธีการสร้าง

การแสดงออกที่กำหนดเองของฉัน:

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

จากนั้นใช้นิพจน์นั้นในฉลาก:

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

คุณจะต้องเสียบแอตทริบิวต์อะไรก็ตามที่คุณใช้จริงและเปลี่ยนขนาดตัวอักษรจาก 8 เป็นสิ่งที่คุณใช้ นอกจากนี้เนื่องจากฟอนต์แตกต่างกันเล็กน้อยคุณอาจต้องปรับแต่งเล็กน้อยจนกว่ามันจะดูถูกต้อง

คุณสามารถใช้นิพจน์นั้นเพื่อทำสิ่งต่าง ๆ เช่นเปลี่ยนสีตามความเหมาะสมของฉลากหรือไม่


หากต้องการใช้นิพจน์นี้นอกพื้นที่แผนที่ (เช่นในป้ายกำกับผู้แต่งหรือตารางแอตทริบิวต์) เราต้องการวิธีในการรับขนาดของรายการแผนที่ที่กำหนดโดยทางโปรแกรม ฉันได้โพสต์โค้ดเพื่อให้บรรลุว่าในคำตอบอื่นที่นี่ วิธีการที่ให้นิพจน์ getScale ('ชื่อผู้แต่ง', 'mapname') เพื่อรวมไว้ในนิพจน์ของเรา:

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

1
ฉันกำลังคิดถึงสิ่งที่คล้ายกันด้วย โดยเฉพาะอย่างยิ่งหากใช้หน่วยแผนที่และเครื่องฉายเป็นหน่วยเมตร ตัวดำเนินการรูปทรงเรขาคณิต (ish) ใหม่ยังสามารถช่วยได้ที่นี่โดยสมมติว่าป้ายกำกับอยู่กึ่งกลางของ centroid สิ่งนี้จะทำงานได้ดีขึ้นเมื่อใช้แบบอักษรที่มีความกว้างคงที่ (monospaced) มากกว่าแบบอักษรที่มีสัดส่วน (ที่ 'W' กว้างกว่า 'i' เป็นต้น) คุณกำลังเข้าสู่บางสิ่งบางอย่างที่นี่ แต่ฉันสงสัยว่าแบบอักษรตามสัดส่วนและการจัดช่องไฟจะเพิ่มความซับซ้อน
Steven Kay

คุณสามารถใช้ imagefont.getsize () ของ pil นั่นจะทำให้คุณมีความกว้างที่แน่นอนของสตริงที่แสดงในแบบอักษรที่คุณเลือก แต่ฉันคิดว่ามันจะมีผลการปฏิบัติงานที่สำคัญ คณิตศาสตร์คร่าวๆข้างต้นนั้นง่ายกว่ามากโดยเฉพาะถ้าคุณมีป้ายกำกับหลายร้อยรายการบนหน้าจอ
Jesse McMillan

ปัญหาเล็กน้อยเพียงอย่างเดียวคือฟังก์ชั่นดูเหมือนจะไม่ทำงานเป็นตัวกรองในตารางแอตทริบิวต์ในผู้แต่งสิ่งพิมพ์
Ian Turton

มาตราส่วนแผนที่ของคุณแตกต่างกันไปในแต่ละหน้าหรือไม่? ลองวางมาตราส่วนด้วยตนเองแทนตัวแปร @map_scale ฉันเดาว่าตารางแอตทริบิวต์จะไม่มีทางรู้ขนาดแผนที่ของคุณ (เพราะเช่นคุณสามารถมีรายการแผนที่หลายรายการในผู้แต่งในระดับที่แตกต่างกัน)
Jesse McMillan

1
@iant ฉันโพสต์ลิงก์ไปยังนิพจน์ที่กำหนดเองอื่นที่จะได้รับมาตราส่วนของแผนที่ผู้แต่งของคุณโดยทางโปรแกรม
Jesse McMillan

3

ทำซ้ำเลเยอร์ที่ไม่มีสัญลักษณ์และตั้งค่าระดับการซูม / อุปสรรคที่แตกต่างกันสำหรับฉลากแต่ละอัน


1

ฉันมีสถานการณ์ที่คล้ายกันโดยมีข้อผูกพันในการติดป้ายถนนทุกเส้นในเลเยอร์ถนน ทางออกของฉันคือการสร้างผืนผ้าใบที่มีขนาดใหญ่กว่าส่งออกเป็น PDF แล้วพิมพ์ PDF ตามขนาดที่ต้องการ

ตัวอย่างเช่นผลิตภัณฑ์สำเร็จรูปจำเป็นต้องเป็น A3 บนผืนผ้าใบที่ A3 ฉันไม่สามารถติดฉลากทั้งหมดได้ ดังนั้นฉันจึงทำผ้าใบ A2 และนั่นทำให้เห็นป้ายทั้งหมด สร้าง PDF ของแผนที่ขนาด A2 และพิมพ์เป็น A3

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.