Ich versuche, eine Karte zum Ausdrucken zu erstellen, und die Größe meiner Polygone variiert stark. Da dies eine Referenzkarte ist, muss ich jedes Polygon beschriften, aber einige der Namen passen nicht in das Polygon. In diesen Fällen möchte ich stattdessen die Feature-ID verwenden und dann eine Attributtabelle die ID mit dem Namen verknüpfen lassen.
Was ich tun möchte, ist eine Art Ausdruck, mit dem ich auswählen kann, welche Beschriftung auf der Karte verwendet werden soll und welche Zeilen in die Attributtabelle aufgenommen werden sollen. So etwas isLabelled
könnte den Kartenmaßstab, die Etikettenlänge, die Schriftgröße usw. berücksichtigen.
qgis
labeling
print-composer
qgis-custom-function
Ian Turton
quelle
quelle
Antworten:
Hier ist eine etwas ungefähre (aber hoffentlich effektive) Möglichkeit, dies zu tun.
Zuerst etwas Mathe. Wir müssen herausfinden, wie viele Zeichen bei einer bestimmten Schriftgröße ein Feature enthalten kann. Hier Dinge / Annahmen zu wissen:
Um herauszufinden, wie lange ein Artikel auf dem Bildschirm / Druck angezeigt wird, können Sie die längste Abmessung (Länge oder Höhe oder nur Länge, wenn Ihre Etiketten nur horizontal sind) / Skala * 100 (von M nach CM) verwenden.
Dann können wir sehen, ob unser Etikett passt.
Sie könnten alles in der Ausdrucks-Engine tun, aber ein benutzerdefinierter Python-Ausdruck wäre effizienter. Hier ist ein Tutorial zum Erstellen eines solchen.
Mein benutzerdefinierter Ausdruck:
Verwenden Sie dann einfach diesen Ausdruck im Etikett:
Sie müssen natürlich jedes Attribut einfügen, das Sie tatsächlich verwenden, und die Schriftgröße von 8 auf das ändern, was Sie verwenden. Da die Schriftarten sehr unterschiedlich sind, müssen Sie sie möglicherweise ein wenig anpassen, bis sie richtig aussehen.
Sie können diesen Ausdruck auch verwenden, um beispielsweise die Farbe zu ändern, je nachdem, ob das Etikett passt oder nicht.
Um diesen Ausdruck außerhalb des Kartenbereichs (dh in einer Komponistenbeschriftung oder Attributtabelle) zu verwenden, benötigen wir eine Möglichkeit, den Maßstab eines bestimmten Kartenelements programmgesteuert abzurufen. Ich habe Code veröffentlicht, um dies in einer anderen Antwort hier zu erreichen. Die dortige Methode gibt uns einen Ausdruck getScale ('composername', 'mapname'), um ihn in unseren Ausdruck aufzunehmen:
quelle
Duplizieren Sie die Ebene, eine ohne Symbologie, und legen Sie für jede Beschriftung unterschiedliche Zoomstufen / Hinderniseinstellungen für die Beschriftungen fest.
quelle
Ich hatte eine ähnliche Situation mit der Verpflichtung, jede Straße in einer Straßenschicht zu kennzeichnen. Meine Lösung bestand darin, die Leinwand in einer größeren Größe zu erstellen, in PDF zu exportieren und die PDF-Datei dann in der erforderlichen Größe zu drucken.
Zum Beispiel musste das fertige Produkt A3 sein. Auf der Leinwand bei A3 konnte ich nicht alle Etiketten anbringen. Also habe ich die Leinwand A2 gemacht und so konnten alle Etiketten gesehen werden. Erstellen Sie ein PDF der Karte im Format A2 und drucken Sie es als A3 aus.
quelle