jedna etykieta dla dróg dwupasmowych (osm, qgis, postgis)

9

Oznaczyłem moją warstwę osm-linii (PostGIS) symbolami głównych dróg i autostrad. Podczas gdy symbole głównych dróg są dobrze rozmieszczone - z wystarczającą odległością między nimi - autostrada dwupasmowa jest oznaczona jedną etykietą na jeden pas (jak widać na zdjęciu).

Czy jest możliwe, aby ustawić coś w rodzaju promienia dla każdej etykiety, w obrębie żadnej innej etykiety tego samego typu nie można umieścić? Czy mogę po prostu powiedzieć: oznaczyć jeden pas dwupasmowej drogi?

Używam qgis. Dane OSM są importowane do PostGIS za pomocą osm2pgsql.

wprowadź opis zdjęcia tutaj

EDYCJA: Ten nowy zrzut ekranu pokazuje więcej szczegółów:

wprowadź opis zdjęcia tutaj

MAPA
źródło

Odpowiedzi:

5

Aby oznaczyć tylko jeden pas dwupasmowej drogi, używam wyrażenia:

 angle_at_vertex($geometry,1) <= 180

i użyj go jako filtra. Działa to, ponieważ w OSM każda linia jest rysowana w ich kierunku.

W poniższym przykładzie używam wyrażenia angle_at_vertex($geometry,1)jako etykiety, a na drugim obrazku wyrażenia angle_at_vertex($geometry,1) <= 180jako filtra.

Przed:

wprowadź opis zdjęcia tutaj

Po:

wprowadź opis zdjęcia tutaj

Ustawienia :

wprowadź opis zdjęcia tutaj

MrXsquared
źródło
To jedna sprytna sztuczka. +1 również dla pliku QML.
geozelot
2

Nie znam schematu tabel OSM, ale poprosiłeś o takie zapytanie:

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

Może to działać, ale byłoby lepiej, jeśli masz identyfikator dla tej samej etykiety dla różnych kierunków, a wtedy to zapytanie działałoby w 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
źródło
Wygląda dobrze, ale nie znam programowania SQL. Czy mógłbyś więc wyjaśnić, co oznacza „a.label_id”, „a.label_id_1” itd.? Moja tabela ma identyfikator (kolumna osm_id) i kolumnę (ref) dla etykiety (na przykład „A70”).
MAP
Przypisałem tabelę etykiet jako „a” i „b”, a kolumnę label_id (osm_id) jako label_id_1 i label_id_2 z instrukcją „AS”, musiałem, ponieważ w najgłębszym podzapytaniu mamy dwie kolumny (label_id) i dwie tabele (etykiety) o tej samej nazwie.
Francisco Valdez