ein Etikett für zweispurige Straßen (osm, qgis, postgis)

9

Ich habe meine Osm-Lines-Schicht (PostGIS) mit Symbolen für Hauptstraßen und Autobahnen gekennzeichnet. Während die Symbole für die Hauptstraßen gut platziert sind - mit jeweils ausreichend Abstand - ist die zweispurige Autobahn mit einem Etikett pro Spur gekennzeichnet (wie Sie im Bild sehen können).

Ist es möglich, von jedem Etikett einen Radius festzulegen, in dem kein anderes Etikett des gleichen Typs platziert werden kann? Oder kann ich einfach sagen: Beschriften Sie eine Spur einer zweispurigen Straße?

Ich benutze QGIS. Die OSM-Daten werden mit osm2pgsql nach PostGIS importiert.

Geben Sie hier die Bildbeschreibung ein

BEARBEITEN: Dieser neue Screenshot zeigt mehr Details:

Geben Sie hier die Bildbeschreibung ein

KARTE
quelle

Antworten:

5

Um nur eine Spur einer zweispurigen Straße zu kennzeichnen, verwende ich den Ausdruck:

 angle_at_vertex($geometry,1) <= 180

und benutze es als Filter. Dies funktioniert, weil in OSM jede Spur in ihre Richtung gezeichnet wird.

Im folgenden Beispiel verwende ich den Ausdruck angle_at_vertex($geometry,1)als Bezeichnung und im zweiten Bild den Ausdruck angle_at_vertex($geometry,1) <= 180als Filter.

Vor:

Geben Sie hier die Bildbeschreibung ein

Nach dem:

Geben Sie hier die Bildbeschreibung ein

Einstellungen :

Geben Sie hier die Bildbeschreibung ein

MrXsquared
quelle
Das ist ein kluger kleiner Trick. +1 auch für die QML-Datei.
Geozelot
2

Ich kenne das Schema der OSM-Tabellen nicht, aber Sie haben nach einer Abfrage wie der folgenden gefragt:

DELETE FROM labels WHERE label_id  IN (
    SELECT label_id_2 FROM (
        SELECT a.label_id AS label_id_1, b.label_id AS label_id_2 
        FROM labels AS a, labels AS b WHERE STDWithin(a.the_geom,b.the_geom, 0.001) and a.street = b.street and a.label_id != b.label_id
    )
)

Dies mag funktionieren, aber es wäre besser, wenn Sie eine ID für dasselbe Etikett für verschiedene Richtungen haben und diese Abfrage dann zu 100% funktioniert:

DELETE FROM labels WHERE label_id  IN (
    SELECT label_id_2 FROM (
        SELECT a.label_id AS label_id_1, b.label_id AS label_id_2 
        FROM labels AS a, labels AS b WHERE a.same_road_label_id = b.same_road_label_id;
    )
)
Francisco Valdez
quelle
Sieht gut aus, aber ich bin nicht mit SQL-Programmierung vertraut. Könnten Sie bitte erklären, wofür "a.label_id", "a.label_id_1" usw. steht? Meine Tabelle hat eine ID (Spalte osm_id) und eine Spalte (ref) für das Label (zum Beispiel "A70").
MAP
Ich habe die Label-Tabelle als "a" und "b" und die label_id-Spalte (osm_id) als label_id_1 und label_id_2 mit der Anweisung "AS" bezeichnet. Dies musste ich tun, da wir in der tiefsten Unterabfrage zwei Spalten (label_id) und zwei Tabellen haben (Etiketten) mit dem gleichen Namen.
Francisco Valdez