Vermeiden Sie Beschriftungsfunktionen, wenn diese von einer anderen Ebene in QGIS überlappt werden.

16

Wie kann ich mit QGIS 2.12.2 die Ebenenbeschriftung einrichten, um zu vermeiden, dass Beschriftungen dort platziert werden, wo bereits Features einer anderen Ebene vorhanden sind?

Wenn ich zum Beispiel eine Strom- / Fluss- Polylinienebene habe , die See- "Mittellinien" enthält, und ich eine "See" -Polygonebene in der Zeichenreihenfolge darüber platziere, soll die Flussebene keine Beschriftung innerhalb des Sees platzieren . Stattdessen würde ich den Fluss lieber außerhalb des Sees beschriften lassen (je nach Bedarf). Auf diese Weise kann ich Etiketten aus der Seenebene platzieren und stoße nicht auf Kollisionen mit Etiketten.

Hier ist ein Beispiel, in dem (ich habe die Linien absichtlich zu visuellen Zwecken oben platziert) keine Flussmittellinienbeschriftungen innerhalb des See-Polygons angezeigt werden sollen: Linien werden innerhalb des Polygons beschriftet

RyanKDalton-OffTheGridMaps
quelle
4
Wie werden Ihre Daten gespeichert und geliefert? Wenn ich mit PostGIS arbeite, wäre ich versucht, meine Flüsse mit einem Blick zu definieren, bei dem die Teile der Flüsse, die die Seen kreuzen, vollständig ausgeschnitten sind. Gute automatisierte Etikettierung ist ein schwieriges Problem, Geometrie weniger.
Buchstabensuppe
Dies waren Shapefiles, aber Ihre Idee, zu PostGIS zu wechseln und die Datenprobleme im laufenden Betrieb zu verwalten, ist wirklich gut. Ich würde vorschlagen, dass Sie Ihren Kommentar in eine Antwort verschieben, da ich ein ziemlich stichhaltiges Argument dafür abgeben könnte, dass dies eine gute Lösung ist.
RyanKDalton-OffTheGridMaps

Antworten:

9

Das automatisierte Beschriften ist ein wirklich schweres Problem, aber die Feature-Geometrie ist nicht so schlecht.

Auch wenn das Praktikum die meiste Zeit angemessen funktioniert, kann es Ausnahmen geben. Einige von diesen werden Sie bemerken und möglicherweise ansprechen können. Andere werden Sie beim Erstellen einer großen Karte oder eines Kachelsatzes nicht bemerken, da Sie nicht jeden Zentimeter Ihrer Karte in verschiedenen Maßstäben übergießen können. Fast immer müssen Sie einige automatisch platzierte Etiketten aus kartografischer Sicht manuell verschieben.

Wie ich in meinem Kommentar vorgeschlagen habe, würde ich das Problem für das Etikettierungsmodul erleichtern. In diesem Fall definiere ich meine Flüsse als Tabellenansicht *, wobei die Flussgeometrien abgeschnitten werden, um die Seegrenzen zu berücksichtigen. Auf diese Weise gibt es keine Flussmerkmale in Seen, die gekennzeichnet werden müssen, und keine Kollisionen.

* Ich gehe davon aus, dass Sie hier ein RDBMS wie PostgreSQL / PostGIS verwenden, um die Aktualisierung Ihrer maßgeblichen Datenquelle zu vereinfachen und die Ansicht ohne Ihr Zutun selbst ausführen zu können. Sie können jedoch auch statische Dateien im Voraus bearbeiten, um Features zu schneiden und zu löschen. Ich empfehle dies jedoch nicht, wenn Sie jemals vorhaben, eine Karte erneut aufzurufen.

Beispiel:

Beginnend mit zwei Shapefiles (möglicherweise Datenbanktabellen) von Flüssen und Seen, wobei Flüsse Seen kreuzen und Beschriftungsprobleme verursachen, die sich nur schwer vollständig und sicher lösen lassen:

Bildbeschreibung hier eingeben

Bringen Sie diese mit shp2pgsql in Postgres :

shp2pgsql -s 4326 /data/lake public.lakes | psql -d mydb

shp2pgsql -s 4326 /data/river public.rivers | psql -d mydb

Definieren Sie dann eine Sicht mit ST_Difference :

CREATE OR REPLACE VIEW rivers_clipped AS
SELECT r.id, ST_Difference(r.geom, l.geom) AS geom, r.name
FROM public.rivers AS r, public.lakes AS l;

Fügen Sie die Ansicht Ihrem Layout hinzu:

Bildbeschreibung hier eingeben

Obwohl das Problem in meinem Beispiel bewusst hergestellt wurde, sind die Stile in den beiden Flussebenen (Original und Ansicht) identisch und werden in der Zeichenreihenfolge oben auf dem See platziert. Wenn Sie die Geometrien der Seen oder Flüsse aktualisieren, müssen Sie nur das Rendering aktualisieren.

Bildbeschreibung hier eingeben

alphabetasoup
quelle
2
Während ich nicht direkt mit einem DB-Layer gearbeitet habe, war diese Lösung für mich am sinnvollsten, da die Geometrie der ursprünglichen Datenquellen nicht bearbeitet werden musste (außer dass sie in den DB geladen wurden). Dies ist ein hervorragendes Beispiel dafür, wie Sie über die Grenzen von Shapefiles und Anwendungen hinausdenken und eine kreative Lösung für das Problem finden, indem Sie sowohl Anwendungs- als auch DB-Logik kombinieren.
RyanKDalton-OffTheGridMaps
13

In QGIS> = 2.12 können Sie die Polygonebene "See" als Beschriftungshindernis festlegen. Dies erfolgt über die Layereigenschaften des Layers "See" im Abschnitt "Beschriftungen". Ändern Sie das Kombinationsfeld oben von " Keine Beschriftungen " in " Andere Beschriftungen davon abhalten, Features in dieser Ebene abzudecken ".

ndawson
quelle
1
Vielen Dank. Ich suchte nach so etwas und hatte diese Dropdown-Option zuvor noch nicht bemerkt. Ich würde jedoch sagen, dass dies nur mäßig erfolgreich war. 1) Es sind nur "irgendwie" entmutigte Bezeichnungen aus der Flussschicht (sie tauchen immer noch im See auf, aber weniger), und 2) jetzt habe ich keine See-Namensbezeichnungen mehr :( Ich habe auch versucht, die Flusskennzeichnungen> Hindernisse festzulegen, "Kennzeichnungen von Deckungsmerkmalen abhalten" (kein Erfolg) und Gewichtungen auf "Niedrig" und "Hoch" (kein Erfolg) sowie die Einstellung "Platzierung"> "Priorität" = "Niedrig" und "Hoch" (kein Erfolg).
RyanKDalton-OffTheGridMaps
Ah, vielleicht habe ich falsch verstanden. Wenn Sie Beschriftungen auf dem See-Layer haben, stellen Sie sicher, dass das Kontrollkästchen "Beschriftungen vom Verdecken von Features abhalten" unter der Registerkarte "Rendern" aktiviert ist. Möglicherweise müssen Sie mit dem Schieberegler "Gewicht" und anderen Optionen in dieser Gruppe spielen, um die gewünschten Ergebnisse zu erzielen.
ndawson
1
Nein, Sie waren definitiv auf dem richtigen Weg. Ich spielte mit den Gewichten herum (hohes Gewicht auf See-Polygonen + "Minimale Platzierung von Etiketten über dem Inneren der Merkmale, geringes Gewicht auf Flüssen") und kam näher, aber nie wirklich an den Punkt, an dem die Flussetiketten nicht auf dem See waren. Das Problem scheint mit Linien verbunden zu sein, die sich sowohl innerhalb als auch außerhalb des Polygons befinden.
RyanKDalton-OffTheGridMaps
4
Warum entfernen (oder teilen) Sie diese Zeilen nicht, wenn es um die Kennzeichnung geht? Sie sind für Ihre Karte sowieso nicht nützlich.
Radouxju
4

Ich finde es im Allgemeinen ziemlich schwierig, Etiketten zu erstellen, die die Sinne meines Kartographen befriedigen. Während die automatische Beschriftungsfunktion in 80% der Fälle einwandfrei funktioniert, gibt es Fälle wie das Problem mit der Fluss- / See-Beschriftung, bei denen keine gute Beschriftung generiert wird. Die automatische Beschriftung ist häufig an die Geometrie des Features gebunden, z. B. wie viele Teile sich in einer Linie befinden, sodass zunächst alle Teile beschriftet werden. Natürlich hat QGIS Mittel, um wiederholte Beschriftungen zu verhindern, was auch vom Maßstab der aktuellen Kartenansicht abhängt.

Na ja, mein Tipp ist keine schnelle Lösung. Ich erstelle oft eine spezielle Ebene nur zum Beschriften, damit meine Beschriftungen leichter kontrolliert werden können. Und häufig kann die Geometrie der Features für die kartografische Darstellung mit einer guten Geometrie für die Beschriftung kollidieren. Daher würde ich vorschlagen, eine neue Schicht zu erstellen, in der die Bäche die Seen nicht überqueren, damit Sie das Problem insgesamt umgehen können. Das Vorhandensein einer zusätzlichen Beschriftungsebene kann auch dazu beitragen, Probleme zu vermeiden, bei denen die Beschriftungsrichtung nicht der beabsichtigten entspricht, da sie mit der Erstellung der Geometrie zusammenhängt.

Nun, ich befürchte, dass mein Tipp nicht Ihren Erwartungen entspricht, aber ich hoffe, dass mein alternativer Ansatz Ihnen irgendwie hilft.

Frank
quelle
Sie meinen, ich könnte ein neues Dataset erstellen (was in diesem Fall einfach wäre ... streichen Sie einfach die Linienmerkmale unter Polygonen aus). Eine Verdoppelung von Datasets klingt nicht zu ansprechend oder verwaltbar, es sei denn, Sie verwenden eine datenbankgesteuerte Methode wie @Richard Law erwähnt.
RyanKDalton-OffTheGridMaps
Ich verstehe Ihren Standpunkt und verstehe, dass Sie zögern, einen ähnlichen Datensatz zweimal zu erstellen. Nach meiner Erfahrung unterscheidet sich die Beschriftungsschicht häufig stärker von der ursprünglichen Datenschicht. Um sich beispielsweise an Ihr Flussbeispiel zu halten, möchten Sie möglicherweise die Geometrie des Flusses weiter ändern, um Feature-Teile zu verbinden oder zu teilen, um eine schönere Beschriftung zu erstellen, die regelmäßig wiederholt wird. Zumindest ist dies bei mir häufig der Fall, wenn es sich beispielsweise um OSM-Straßen handelt, die manchmal recht willkürlich organisiert sind.
Frank
3

Es gibt ein Plugin namens " Mask ", mit dem Labels basierend auf Polygonen gefiltert werden können.

Wie in meinem vorherigen Kommentar erwähnt, wäre es jedoch viel einfacher, wenn Sie Ihre Linien an der Kreuzung mit den Seen teilen könnten (siehe verschiedene Methoden hier ). Anschließend können Sie für Segmente, die sich innerhalb der Seen befinden, eine Bezeichnung mit der Größe Null definieren ("Ebene"> "Beschriftung"> "Definierte Dateneinstellungen"> "Größe" und dann die Spalte auswählen, in der Sie die Beschriftungsgröße speichern). Durch das Aufteilen bleiben die meisten Eigenschaften Ihres Flussnetzes erhalten und können durch Auflösen rückgängig gemacht werden, sodass Sie weiterhin mit einem einzelnen Layer arbeiten können (speichern Sie die Gesamtlänge in einer bestimmten Attributtabelle, falls erforderlich).

radouxju
quelle
Danke, das Plugin klingt vielversprechend, also werde ich es versuchen.
RyanKDalton-OffTheGridMaps