uma etiqueta para estradas de duas faixas (osm, qgis, postgis)

9

Rotulei minha camada de linhas osm (PostGIS) com símbolos para estradas e auto-estradas principais. Enquanto os símbolos das estradas principais estão bem posicionados - com distância suficiente entre cada um - a autoestrada de duas faixas é rotulada com uma etiqueta por faixa (como você pode ver na imagem).

É possível definir algo como um raio de cada etiqueta, dentro de nenhuma outra etiqueta do mesmo tipo pode ser colocada? Ou posso apenas dizer: rotule uma faixa de uma estrada de duas faixas?

Eu estou usando qgis. Os dados OSM são importados para o PostGIS com osm2pgsql.

insira a descrição da imagem aqui

EDIT: Esta nova captura de tela mostra mais detalhes:

insira a descrição da imagem aqui

MAPA
fonte

Respostas:

5

Para rotular apenas uma faixa de uma estrada de duas faixas, estou usando a expressão:

 angle_at_vertex($geometry,1) <= 180

e use-o como filtro. Isso funciona porque no OSM cada pista é traçada em sua direção.

No exemplo abaixo, estou usando a expressão angle_at_vertex($geometry,1)como label e, na segunda figura, a expressão angle_at_vertex($geometry,1) <= 180como filtro.

Antes:

insira a descrição da imagem aqui

Depois de:

insira a descrição da imagem aqui

Configurações :

insira a descrição da imagem aqui

MrXsquared
fonte
Agora esse é um pequeno truque inteligente. +1 também para o arquivo QML.
Geozelot 16/05/19
2

Não conheço o esquema das tabelas OSM, mas você solicitou uma consulta como esta:

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

Isso pode funcionar, mas seria melhor se você tivesse um ID para o mesmo rótulo para direções diferentes e essa consulta funcionasse 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
fonte
Parece bom, mas não estou familiarizado com a programação sql. Então, você poderia explicar o que "a.label_id", "a.label_id_1" e assim por diante significa? Minha tabela possui um ID (coluna osm_id) e uma coluna (ref) para o rótulo (por exemplo "A70").
MAP
Eu apelidei a tabela de rótulos como "a" e "b", e a coluna label_id (osm_id) como label_id_1 e label_id_2 com a instrução "AS", eu precisei porque na subconsulta mais profunda temos duas colunas (label_id) e duas tabelas (etiquetas) com o mesmo nome.
Francisco Valdez