una etiqueta para carreteras de dos carriles (osm, qgis, postgis)

9

Etiqueté mi capa de líneas osm (PostGIS) con símbolos para carreteras y autopistas principales. Si bien los símbolos de las carreteras principales están bien ubicados, con suficiente distancia entre cada uno, la autopista de dos carriles está etiquetada con una etiqueta por carril (como puede ver en la imagen).

¿Es posible establecer algo así como un radio de cada etiqueta, dentro de la cual no se pueda colocar ninguna otra etiqueta del mismo tipo? ¿O simplemente puedo decir: etiquetar un carril de una carretera de dos carriles?

Estoy usando qgis. Los datos OSM se importan a PostGIS con osm2pgsql.

ingrese la descripción de la imagen aquí

EDITAR: Esta nueva captura de pantalla muestra más detalles:

ingrese la descripción de la imagen aquí

MAPA
fuente

Respuestas:

5

Para etiquetar solo un carril de una carretera de dos carriles, estoy usando la expresión:

 angle_at_vertex($geometry,1) <= 180

y úsalo como filtro. Esto funciona porque en OSM cada carril se dibuja en su dirección.

En el siguiente ejemplo, estoy usando la expresión angle_at_vertex($geometry,1)como etiqueta y en la segunda imagen, la expresión angle_at_vertex($geometry,1) <= 180como filtro.

Antes de:

ingrese la descripción de la imagen aquí

Después:

ingrese la descripción de la imagen aquí

Configuraciones :

ingrese la descripción de la imagen aquí

MrXsquared
fuente
Ahora ese es un pequeño truco inteligente. +1 también para el archivo QML.
geozelot
2

No sé el esquema de las tablas OSM, pero solicitó una 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
    )
)

Esto puede funcionar, pero sería mejor si tiene una identificación para la misma etiqueta para diferentes direcciones, y luego esta consulta funcionaría 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;
    )
)
Francisco Valdez
fuente
Se ve bien, pero no estoy familiarizado con la programación SQL. Entonces, ¿podría explicar qué significa "a.label_id", "a.label_id_1" y así sucesivamente? Mi tabla tiene una ID (columna osm_id) y una columna (ref) para la etiqueta (por ejemplo, "A70").
MAPA
He apodado la tabla de etiquetas como "a" y "b", y la columna label_id (osm_id) como label_id_1 y label_id_2 con la declaración "AS", tuve que hacerlo porque en la subconsulta más profunda tenemos dos columnas (label_id) y dos tablas (etiquetas) con el mismo nombre.
Francisco Valdez