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

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


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.