un'etichetta per strade a due corsie (osm, qgis, postgis)


9

Ho etichettato il mio osm-lines-layer (PostGIS) con simboli per strade principali e autostrade. Mentre i simboli per le strade principali sono ben posizionati - con una distanza sufficiente tra ciascuno - l'autostrada a due corsie è etichettata con un'etichetta per corsia (come puoi vedere nell'immagine).

È possibile, impostare qualcosa come un raggio da ciascuna etichetta, in nessun'altra etichetta dello stesso tipo può essere posizionata? O posso solo dire: etichettare una corsia di una strada a due corsie?

Sto usando qgis. I dati OSM vengono importati in PostGIS con osm2pgsql.

inserisci qui la descrizione dell'immagine

EDIT: questo nuovo screenshot mostra più dettagli:

inserisci qui la descrizione dell'immagine

Risposte:


5

Per etichettare solo una corsia di una strada a due corsie sto usando l'espressione:

 angle_at_vertex($geometry,1) <= 180

e usalo come filtro. Questo funziona perché in OSM ogni corsia è tracciata nella loro direzione.

Nell'esempio seguente sto usando l'espressione angle_at_vertex($geometry,1)come etichetta e nella seconda immagine l'espressione angle_at_vertex($geometry,1) <= 180come filtro.

Prima:

inserisci qui la descrizione dell'immagine

Dopo:

inserisci qui la descrizione dell'immagine

Impostazioni :

inserisci qui la descrizione dell'immagine


Questo è un piccolo trucco intelligente. +1 anche per il file QML.
geozelot,

2

Non conosco lo schema delle tabelle OSM, ma hai chiesto una query come questa:

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

Questo potrebbe funzionare, ma sarebbe meglio se si dispone di un ID per la stessa etichetta per direzioni diverse e quindi questa query funzionerebbe al 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;
    )
)

Sembra buono, ma non ho familiarità con la programmazione sql. Quindi, potresti spiegare cosa significa "a.label_id", "a.label_id_1" e così via? La mia tabella ha un ID (colonna osm_id) e una colonna (ref) per l'etichetta (ad esempio "A70").
MAP

Ho soprannominato la tabella delle etichette come "a" e "b", e la colonna label_id (osm_id) come label_id_1 e label_id_2 con l'istruzione "AS", dovevo farlo perché nella sottoquery più profonda abbiamo due colonne (label_id) e due tabelle (etichette) con lo stesso nome.
Francisco Valdez,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.