2 차선 도로 용 레이블 1 개 (osm, qgis, postgis)


9

기본 도로 및 고속도로에 대한 기호로 내 osm-lines-layer (PostGIS)에 레이블을 지정했습니다. 1 차 도로에 대한 기호는 각 도로 사이에 충분한 거리를두고 잘 배치되어 있지만 2 차선 고속도로에는 차선 당 하나의 레이블이 붙어 있습니다 (이미지에서 볼 수 있음).

동일한 유형의 다른 레이블을 배치 할 수없는 각 레이블에서 반경과 같은 것을 설정할 수 있습니까? 아니면 그냥 말할 수 있습니다 : 2 차선 도로의 1 차선에 레이블을 지정합니까?

qgis를 사용하고 있습니다. osm2pgsql을 사용하여 OSM 데이터를 PostGIS로 가져옵니다.

여기에 이미지 설명을 입력하십시오

편집 :이 새로운 스크린 샷은 더 자세한 내용을 보여줍니다 :

여기에 이미지 설명을 입력하십시오

답변:


5

2 차선 도로의 1 차선에만 레이블을 지정하려면 다음 표현식을 사용합니다.

 angle_at_vertex($geometry,1) <= 180

필터로 사용하십시오. 이것은 OSM에서 각 레인이 방향으로 그려지기 때문에 작동합니다.

아래 예에서는 표현식 angle_at_vertex($geometry,1)을 레이블로 사용 하고 두 번째 그림에서는 표현식 angle_at_vertex($geometry,1) <= 180을 필터로 사용합니다.

전에:

여기에 이미지 설명을 입력하십시오

후:

여기에 이미지 설명을 입력하십시오

설정 :

여기에 이미지 설명을 입력하십시오


이제는 영리한 작은 트릭입니다. QML 파일의 경우 +1
geozelot

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

이것은 작동 할 수 있지만 다른 방향에 대해 동일한 레이블의 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"등이 무엇을 의미하는지 설명해 주시겠습니까? 내 테이블에는 레이블에 대한 ID (열 osm_id)와 열 (ref)이 있습니다 (예 : "A70").
MAP

레이블 테이블을 "a"및 "b"로 별명을 지정하고 "AS"문을 사용하여 label_id 열 (osm_id)을 label_id_1 및 label_id_2로 레이블을 지정했습니다. 가장 깊은 하위 쿼리에는 두 개의 열 (label_id)과 두 개의 테이블이 있으므로 이름이 같은 (라벨)
Francisco Valdez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.