одна метка для двухполосных дорог (osm, qgis, postgis)

9

Я обозначил свой слой osm-lines (PostGIS) символами для основных дорог и автомагистралей. В то время как символы для основных дорог хорошо расположены - с достаточным расстоянием между ними - двухполосная автомагистраль помечена одной меткой на полосу движения (как вы можете видеть на изображении).

Возможно ли установить что-то вроде радиуса от каждой метки, при этом никакая другая метка того же типа не может быть размещена? Или я могу просто сказать: обозначить одну полосу дороги с двумя полосами?

Я использую QGIS. Данные OSM импортируются в PostGIS с помощью osm2pgsql.

введите описание изображения здесь

РЕДАКТИРОВАТЬ: Этот новый снимок экрана показывает более подробно:

введите описание изображения здесь

КАРТА
источник

Ответы:

5

Чтобы обозначить только одну полосу дороги с двумя полосами, я использую выражение:

 angle_at_vertex($geometry,1) <= 180

и использовать его в качестве фильтра. Это работает, потому что в OSM каждая полоса нарисована в их направлении.

В приведенном ниже примере я использую выражение в angle_at_vertex($geometry,1)качестве метки, а на втором изображении выражение в angle_at_vertex($geometry,1) <= 180качестве фильтра.

Перед:

введите описание изображения здесь

После:

введите описание изображения здесь

Настройки :

введите описание изображения здесь

MrXsquared
источник
Теперь это один хитрый маленький трюк. +1 также для файла QML.
геозелот
2

Я не знаю схему таблиц OSM, но вы запросили такой запрос:

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

Это может работать, но было бы лучше, если бы у вас был идентификатор для одной и той же метки для разных направлений, и тогда этот запрос работал бы на 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;
    )
)
Франсиско Вальдес
источник
Выглядит хорошо, но я не знаком с SQL-программированием. Итак, не могли бы вы объяснить, что означает "a.label_id", "a.label_id_1" и так далее? Моя таблица имеет идентификатор (столбец osm_id) и столбец (ref) для метки (например, «A70»).
КАРТА
Я назвал таблицу меток как «a» и «b», а столбец label_id (osm_id) как label_id_1 и label_id_2 с оператором «AS». Мне пришлось это сделать, потому что в самом глубоком подзапросе у нас есть два столбца (label_id) и две таблицы. (этикетки) с тем же именем.
Франциско Вальдес