İlk etiket QGIS'ye uymuyorsa alternatif etikete mi geçiyorsunuz?


10

Yazdırmak için bir harita oluşturmaya çalışıyorum ve çokgenlerimin boyutu büyük ölçüde değişiyor. Bu bir referans haritası olacağı için her çokgeni etiketlemem gerekiyor, ancak bazı isimler çokgene sığmayacak. Bu durumlarda, bunun yerine özellik kimliğini kullanmak ve daha sonra kimliği ada bağlayan bir öznitelik tablosuna sahip olmak istiyorum.

Ne yapmak istiyorum haritada hangi etiketi ve öznitelik tablosuna dahil edilecek satırları seçmek için kullanabileceğiniz bir tür ifade var. Böyle bir şey isLabelledharita ölçeğini, etiket uzunluğunu, yazı tipi boyutunu vb. Dikkate alabilir.


2
Aynı özellik sınıfındaki çokgenler farklı şekillerde etiketlendiğinde ve ek olarak yalnızca bir kısmı bir nitelik tablosunda göründüğünde, haritanın kullanıcısı için kafa karıştırıcı olabileceğini unutmayın.
tallistroan

Ben GB ilçe haritası düşünüyorum
Ian Turton

Yazı tipini dinamik olarak sığacak şekilde değiştirmeye ne dersiniz? Özelliklerin boyutlarından en uzununu alabilir, etiket dizesindeki kaç karaktere bölebilir ve ölçeğe biraz matematik yapabilir veya sadece önceden ayarlanmış yazı tipi boyutunu değiştirmek için kullanabilirsiniz ... Alternatif olarak bu ölçüyü (en uzun özellik boyutu / dize) ve kimliğine sahip çok uzun bir etiketse
Jesse McMillan

çoğunlukla okunabilirlikle ilgileniyorum, bu yüzden yazı tipi boyutu ile uğraşmak istemiyorum
Ian Turton

1
Etiketi, yazı tipi boyutunu ve ölçeğini alan ve uygunsa true veya false döndüren bir Python özel ifadesi kullanabilirsiniz. Daha sonra ifade motorunda etiketleri değiştirmek için bir if cümlesi kullanın. Size daha sonra örneklerle bir cevap vereceğim.
Jesse McMillan

Yanıtlar:


8

İşte bunu yapmak için biraz yaklaşık (ama umarım etkili) bir yol.

Önce biraz matematik. Bir özelliğin yazı tipi boyutunda kaç karakter içerebileceğini bulmamız gerekir. İşte bilinmesi gereken şeyler / varsayımlar:

  • metrik birimler varsayarak, (ayak krizi için bu işe yarayabilecek küçük bir değişiklik eklendi.)
  • yazı tipi boyutu yazı tipi yüksekliğinin bir ölçüsüdür. Çoğu yazı tipi yüksek olduğu kadar yarı genişliğindedir.
  • yazı tipi yüksekliği için pt kullanarak, 1pt titizlikle 0.035CM
  • parsellerin kabaca dikdörtgen / düzenli olduğunu varsayarsak

Bir öğenin ekranda / baskıda ne kadar süre kaldığını bulmak için en uzun boyutunu (uzunluk veya yükseklik veya etiketleriniz yalnızca yataysa uzunluk) kullanabiliriz / ölçek * 100 (M'den CM'ye gitmek için)

Sonra etiketimizin uygun olup olmadığını görebiliriz.

Hepsini ifade motorunda yapabilirsiniz, ancak özel bir python ifadesi daha verimli olacaktır. İşte nasıl oluşturulacağına dair bir eğitim.

Özel ifadem:

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

Ardından etikette bu ifadeyi kullanın:

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

Tabii ki kullandığınız herhangi bir özelliği takmanız ve yazı tipi boyutunu 8'den kullandığınız özelliğe değiştirmeniz gerekir. Ayrıca, yazı tipleri biraz değiştiğinden, doğru görünene kadar biraz düzeltmeniz gerekebilir.

Bu ifadeyi, etiketin uyup uymadığına bağlı olarak rengi değiştirmek gibi şeyler yapmak için de kullanabilirsiniz.


Bu ifadeyi harita tuvalinin dışında kullanmak için (yani bir besteci etiketinde veya nitelik tablosunda) belirli bir harita öğesinin ölçeğini programlı olarak almanın bir yoluna ihtiyacımız vardır. Burada başka bir cevapta bunu gerçekleştirmek için kod yayınladım Burada yöntem bize bir ifade getScale ('composername', 'mapname') verir, böylece ifademize dahil etmek için:

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

1
Ben de benzer bir şey düşünüyordum. Özellikle harita birimleri ve metre cinsinden bir projeksiyon kullanılıyorsa. Yeni (ish) geometri operatörleri, etiketlerin merkezde ortalandığı varsayılarak da burada yardımcı olabilir. Bu, sabit genişlikli (tek aralıklı) bir yazı tipiyle orantılı bir yazı tipiyle daha iyi çalışır (Örneğin, 'W', 'i' den çok daha geniştir). Burada bir şey üzerinde çalışıyorsunuz, ancak orantılı yazı tiplerinin ve karakter aralığının karmaşıklık katacağından şüpheleniyorum.
Steven Kay

Pil'in imagefont.getsize () yöntemini kullanabilirsiniz. Bu, seçtiğiniz yazı tipinde oluşturulmuş bir dizenin tam genişliğini verecektir, ancak bunun büyük bir performans isabeti olacağını düşünüyorum. Yukarıdaki kaba matematik, özellikle ekranda yüzlerce etiketiniz varsa çok daha basit
Jesse McMillan

Tek küçük sorun, işlevin baskı oluşturucudaki öznitelik tablolarında bir filtre gibi görünmemesidir.
Ian Turton

Harita ölçeğiniz sayfadan sayfaya değişiyor mu? @Map_scale değişkeni yerine ölçeği el ile girmeyi deneyin. benim tahminim nitelik tablosunun harita ölçeğinizi bilmenin bir yolu yoktur. (Örneğin, bestecide farklı ölçeklerde birden fazla harita öğeniz olabilir)
Jesse McMillan

1
@iant Besteci haritanızın ölçeğini programlı olarak alacak başka bir özel ifadeye bağlantı gönderdim.
Jesse McMillan

3

Katmanı, semboloji içermeyen bir şekilde çoğaltın ve her biri için etiketler için farklı yakınlaştırma düzeyleri / engel ayarları yapın.


1

Bir yol katmanındaki her yolu etiketleme yükümlülüğü ile benzer bir durum yaşadım. Benim çözümüm tuvali daha büyük boyutta oluşturmak, PDF'ye dışa aktarmak ve ardından PDF'yi gereken boyuta yazdırmaktı.

Örneğin, bitmiş ürünün A3 olması gerekiyordu. A3'teki tuval üzerine tüm etiketleri sığdıramadım. Bu yüzden A2 tuvalini yaptım ve bu tüm etiketlerin görülmesine izin verdi. A2 boyutlu haritanın PDF'sini oluşturun ve A3 olarak yazdırın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.