une étiquette pour les routes à deux voies (osm, qgis, postgis)

9

J'ai étiqueté ma couche osm-lines (PostGIS) avec des symboles pour les routes principales et les autoroutes. Alors que les symboles pour les routes principales sont bien placés - avec suffisamment de distance entre chacun - l'autoroute à deux voies est étiquetée avec une étiquette par voie (comme vous pouvez le voir sur l'image).

Est-il possible, pour définir quelque chose comme un rayon de chaque étiquette, dans aucune autre étiquette du même type ne peut être placée? Ou puis-je simplement dire: étiqueter une voie d'une route à deux voies?

J'utilise qgis. Les données OSM sont importées dans PostGIS avec osm2pgsql.

entrez la description de l'image ici

EDIT: Cette nouvelle capture d'écran montre plus de détails:

entrez la description de l'image ici

CARTE
la source

Réponses:

5

Pour étiqueter une seule voie d'une route à deux voies, j'utilise l'expression:

 angle_at_vertex($geometry,1) <= 180

et l'utiliser comme filtre. Cela fonctionne parce que dans OSM, chaque voie est dessinée dans leur direction.

Dans l'exemple ci-dessous, j'utilise l'expression angle_at_vertex($geometry,1)comme étiquette et dans la deuxième image l'expression angle_at_vertex($geometry,1) <= 180comme filtre.

Avant:

entrez la description de l'image ici

Après:

entrez la description de l'image ici

Paramètres :

entrez la description de l'image ici

MrXsquared
la source
Voilà un petit truc intelligent. +1 également pour le fichier QML.
geozelot
2

Je ne connais pas le schéma des tables OSM, mais vous avez demandé une requête comme celle-ci:

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
    )
)

Cela peut fonctionner, mais il serait préférable que vous ayez un identifiant pour la même étiquette pour différentes directions, puis cette requête fonctionnera à 100%:

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
la source
Semble bien, mais je ne suis pas familier avec la programmation sql. Alors, pourriez-vous expliquer ce que "a.label_id", "a.label_id_1" et ainsi de suite représentent? Ma table a un ID (colonne osm_id) et une colonne (ref) pour le label (par exemple "A70").
MAP
J'ai surnommé la table des étiquettes "a" et "b", et la colonne label_id (osm_id) comme label_id_1 et label_id_2 avec l'instruction "AS", je devais le faire parce que dans la sous-requête la plus profonde, nous avons deux colonnes (label_id) et deux tables (étiquettes) du même nom.
Francisco Valdez