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

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


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.