지도에 안테나 기호 표시 : 점 기호 또는 특징 (다각형)


12

셀룰러 네트워크를지도에 표시하고 싶습니다. 입력 데이터는 각 문자열이 셀룰러 섹터 인 .csv 파일입니다. 속성은 섹터 ID, 좌표, 방위각 및 안테나 빔 너비 각도입니다.

안테나 빔 폭 값의 범위는 30 ~ 360 도입니다. 360 안테나 빔 폭은지도에 원으로 표시되어야 함을 의미합니다. 다른 빔 폭을 가진 안테나는 적절한 조리개 각도를 가진 섹터로 표시해야합니다.

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

기호 만 사용하여 안테나를 표시 할 수 있습니까? 내 SVG 기호를 만드는 방법을 알고 방위각에 따라 회전하는 방법을 찾고 싶습니다. 그러나 30에서 360 도의 속성 값에 따라 가변 안테나 빔 폭을 적용하는 방법이 있습니까?

QGIS에서 가능한 경우 뷰의 스케일에 따라 맵에서 동적 시각화로 인해 안테나를 그리는 가장 좋은 방법은 심볼이라고 생각합니다.

물론 적절한 다각형을 레이어 피처로 그려서 작업을 해결할 수 있지만 해결 방법이 될 것입니다.


따라서 각 사이트마다 다른 올바른 방향으로 호를 그려야합니까?
Nathan W

전혀 이해하지 못한다면 전혀 아닙니다. 그림과 같이 원의 섹터 (또는 빔 폭 = 360 인 경우 전체 원) 여야합니다.
E Bobrov

그래 그게 내 뜻이야
Nathan W

그래 알았어. 일반적으로 말하면 아크 기호는 엄격하게 필요하지 않습니다. 주요 속성은 방위각과 빔 폭입니다. 어떤 기호를 사용하여 안테나만을 아크로 그릴 수 없습니다.
E Bobrov

아마 나는 사용자 정의 심볼 레이어 유형 만들기 . 그러나 나는 확실하지 않다. 그래서 누구든지 속성 (예 : 위 그림의 단어에서 안테나 방위)에 따라 각 레이어 피처 방향을 그리는 자체 심볼 레이어 클래스를 만들려고 했습니까?
E Bobrov

답변:


7

며칠 전에 Wedge Buffer Processing Algorithm 이라는 새로운 플러그인이 QGIS에 추가되었습니다 . 관심이있는 것처럼 보입니다.

이름에서 알 수 있듯이 처리 알고리즘이므로 처리 도구 상자에서 실행해야합니다. 그래도 시도 할 기회가 없었습니다.

일반 원형 버퍼와 같이 원의 섹터를 생성하지만 필드 값을 사용하여 쐐기 각도와 반경을 설정할 수 있습니다.

github 페이지 에서 설명서 및 스크린 샷을 볼 수 있습니다


10

기호 만 사용하려면 비슷한 질문 : QGIS에서 섹터 조명 만들기? .


비슷한 접근 방식에 따라 투영 된 CRS 에서 작업하고 있다고 가정하면 (지리 좌표계를 사용하는 경우 답변 끝 부분의 참고 사항 참조) 설명에주의를 집중할 것임을 강조하고 싶습니다. 원하는 결과를 재현하기 위해해야 ​​할 최소한의 일 중 : 이는 다른 작은 매개 변수 (예 : 크기, 너비 등)를 사용자의 요구에 맞게 조정하여 쉽게 조정할 수 있음을 의미합니다.

또한 "AZIMUTH"방위각 값 "BEAMWIDTH"을 저장하는 필드이고 안테나 빔 폭을 저장하는 필드 라고 가정합니다 .

해결책

우리는 점을 렌더링하고 Single symbol하나 Simple Marker와 두 개의 Geometry generator심볼 레이어 로 반복하여 렌더링합니다 .

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

추가 설명에서 위의 이미지에서 동일한 순서의 기호를 따릅니다.

1) 단순 마커

크기가 3mm이고 너비가 0.4mm 인 빨간색 원의 기본 기호 (이 자습서에서는 더 쉬운 부분)를 선택했습니다.

2) 지오메트리 생성기 1 번

새 심볼 레이어를 추가 Geometry generator하고 LineString / MultiLineString유형을 선택하십시오 .

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

이 표현식을 Expression필드 에 삽입하십시오 .

make_line(
 $geometry,
 make_point($x + 300*cos(radians(90 -  "AZIMUTH" )), $y + 300*sin(radians((90 - "AZIMUTH" ))))
)

방위각 세트를 가리키는 화살표를 정의했습니다 (화살표를 만들 려면 기본 심볼 메뉴 ArrowLine옵션에서 심볼 레이어 유형 을 선택해야 함 ). 참고 300이렇게 자유롭게 미터의 거리를 표시하고 임의의 값의는 필요에 따라 변경합니다.

3) 지오메트리 생성기 2 번

새 심볼 레이어를 추가하고 Geometry generator유형과 유형을 선택하십시오 Polygon / MultiPolygon.

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

이 표현식을 Expression필드 에 삽입하십시오 .

CASE
WHEN ("BEAMWIDTH") <= 180
THEN
intersection(
  buffer(
   $geometry, 200),
  make_polygon(
   geom_from_wkt(
    geom_to_wkt(
     make_line(
      $geometry,
      make_point($x + 2000*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + 2000*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
      make_point($x + 2000*cos(radians(90 -  "AZIMUTH" )), $y + 2000*sin(radians((90 - "AZIMUTH" )))),
      make_point($x + 2000*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + 2000*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
      $geometry)
     )
    )
   )
  )

WHEN ("BEAMWIDTH") > 180
THEN
difference(
  buffer(
   $geometry, 200),
   make_polygon(
    geom_from_wkt(
     geom_to_wkt(
      make_line(
       $geometry,
       make_point($x + 2000*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + 2000*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
       make_point($x - 2000*cos(radians(90 -  "AZIMUTH" )), $y - 2000*sin(radians((90 - "AZIMUTH" )))),
       make_point($x + 2000*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + 2000*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
       $geometry)
      )
     )
    )
   )

END

방금 섹터를 정의했습니다. 참고하시기 바랍니다 2002000미터의 거리를 표현하고 임의의 값입니다 내가 200m의 반경을 갖는 원이 교차하는 다각형을 만들려고 해요 있기 때문에, 그래서 당신의 필요에 따라 변경할 주시기 바랍니다.

최종 결과

이전 작업을 올바르게 수행하면 다음과 같은 결과를 얻을 수 있어야합니다 (라벨은이 솔루션과 별도로 추가되며 상황을보다 잘 설명해야합니다).

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

노트

지리적 좌표 시스템을 사용하는 경우, 즉 거리가 아닌 각도를 다루는 경우 이전 수식에서 거리를 사용할 때 적절한 값을 사용하면 충분합니다. 내가 사용한 거리는 다음과 같습니다.

  • 300m (지오메트리 생성기 1 번 참조);
  • 200m (지오메트리 생성기 2 번 참조);
  • 2000m (지오메트리 생성기 2 번 참조);

따라서 각도로 표시된 다른 임의의 값 (예 : 등 0.0002)으로 바꿀 수 있습니다 0.002.

보너스

여기 에 스타일을 첨부했습니다 . 텍스트 편집기에서이 코드를 열고 QGIS Layer Style 파일 (예 : .qml확장명) 로 저장할 수 있습니다.

위의 스타일은 QGIS 2.18.4를 사용하여 생성되었습니다 (사용 중인 셰이프 파일의 이름이 같아야 함).


이 솔루션을 찾고 있었습니까? 작동합니까?
mgri

귀하의 솔루션은 주제에 설명 된 사례를 완전히 해결합니다! 나는 그것을 구현했고 내 자신의 실제 사례가 약간 다르다는 것을 이해했다. 그건 내 잘못이야
E Bobrov

1)지도에서 내 섹터의 밀도가 다릅니다. 즉, 섹터 사이의 거리가 짧은 경우 코드에서 정의 된 거리가 많은 섹터를 겹치게하여 맵 확대 / 축소를 변경해도 도움이되지 않으므로 다소 어려울 수 있습니다. 지도를 읽습니다. 그러나 섹터 간 거리가 먼 경우 섹터가 매우 작으며지도를 읽기 어려울 수 있습니다. 단일 기호를 사용하면 문제가 발생하지 않으며지도 확대 / 축소로 배율이 변경됩니다.
E Bobrov

2) 빔 폭 왜곡이 있습니다. 빔 폭 360 도는 타원처럼 보이지만 방위각이 다른 섹터는 같지만 동일한 빔 폭은 동등한 빔 폭을 가진 섹터처럼 보이지 않습니다. 지리 좌표계를 사용하고 있기 때문입니까? 이제, 경도 / 위도의 각도가 다르면 지구상의 점 사이의 거리가 다릅니다. 따라서 솔루션은 섹터가 위치한 지구 지역으로 현지화해야했습니다.
E Bobrov

어쨌든 솔루션 및 유사한 답변에 대한 참조 "QGIS에서 섹터 라이트 생성?" 유용한 기능을 볼 수있었습니다. 다시 감사합니다.
E Bobrov

4

큰 kudos to mgri.

테스트 계층에서는 모든 것이 원활하게 작동했습니다. 프로덕션 계층에서는 2-3 시간 후에 $ geometry 문제를 추적 할 수 있었습니다. 플랫폼에서 포인트 레이어를 내보내고 있었지만 주목하지는 않았지만 MultiPoint 였습니다. 이것은 문제를 일으키는 것처럼 보였습니다 : 화살표가 그려지지 않았습니다. 이상하게도 계산 된 점만 원의 다각형을 만들었습니다.

또 다른 것은 가변 반경을 사용하고 있다는 것입니다 . (이 경우 올바른 단어인지 확실하지 않은 경우 이름을 '빔 길이'등으로 지정할 수도 있습니다).

다음은 MultiPoints 지오메트리 유형 레이어와 함께 현재 사용중인 것입니다 (사실 모든 기능은 단일 점임) .QGis 2.18.3에서 작동합니다.

화살표 표현 360 °이면 화살표가 없습니다.

CASE

WHEN ("BEAMWIDTH") = 360
THEN 
make_line(
 make_point($x, $y),
 make_point($x + "RADIUS"*cos(radians(90 -  "AZIMUTH" )), $y + "RADIUS"*sin(radians((90 - "AZIMUTH" ))))
)

END

다각형 표현

CASE

WHEN ("BEAMWIDTH") <= 180
THEN
intersection(
  buffer(
   make_point($x,$y), "RADIUS"),
  make_polygon(
   geom_from_wkt(
    geom_to_wkt(
     make_line(
      make_point($x,$y),
      make_point($x + "RADIUS"*2*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
      make_point($x + "RADIUS"*2*cos(radians(90 -  "AZIMUTH" )), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" )))),
      make_point($x + "RADIUS"*2*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
      make_point($x,$y))
     )
    )
   )
  )

WHEN ("BEAMWIDTH") > 180
THEN
difference(
  buffer(
   make_point($x,$y), "RADIUS"),
   make_polygon(
    geom_from_wkt(
     geom_to_wkt(
      make_line(
       make_point($x,$y),
       make_point($x + "RADIUS"*2*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
       make_point($x - "RADIUS"*2*cos(radians(90 -  "AZIMUTH" )), $y - "RADIUS"*2*sin(radians((90 - "AZIMUTH" )))),
       make_point($x + "RADIUS"*2*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
       make_point($x,$y))
      )
     )
    )
   )

END

내 대답은 일반적인 접근 방식을 제안했습니다.이 문제와 관련된 많은 변수가 있었기 때문에 상황을 해결하기위한 고유 한 절차를 만드는 것은 불가능했습니다. 따라서이를 지적하고 MultiPoint 기능을 사용한 접근 방식을 제안 해 주셔서 감사합니다.
mgri

1

추가 플러그인없이 웹에서 부분 솔루션으로 선물을 받았습니다. 안테나 빔 폭을 표시하지 않고 간단한 마커를 올바른 방향으로 회전하십시오. 간단한 마커를 사용하고 안테나 방위 + 180 도로 회전하십시오 (레이어 속성> 단일 심볼-> 마커-> 간단한 마커-> 삼각형-> 회전-> 편집 -> 표현식 필드에 <180 + "antenna azimuth">를 입력하고 마커의 Anchor point 필드에 Top을 설정하십시오). 포함 된 단순 삼각형 마커의 방향이 부적절하기 때문에 <180 + "안테나 방위각">을 사용해야합니다. 그렇지 않으면 잘못된 안테나 방향이 표시됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.