マップ上のアンテナシンボルの表示:ポイントシンボルまたはフィーチャ(ポリゴン)


12

地図に携帯電話ネットワークを表示したい。入力データは、各文字列が携帯電話セクターである.csvファイルです。属性は、セクターID、その座標、方位角、アンテナビーム幅の角度です。

アンテナビーム幅の値の範囲は30〜360度です。360アンテナのビーム幅は、地図上に円として表示する必要があることを意味します。他のビーム幅のアンテナは、適切な開口角のセクターとして表示する必要があります。

ここに画像の説明を入力してください

シンボルのみを使用してアンテナを表示することは可能ですか?私は自分のSVGシンボルを作成する方法を知っており、方位に従ってそれを回転させる方法を見つけたいと思っています。しかし、30〜360度の属性値に従って可変アンテナビーム幅を適用する方法はありますか。

QGISで可能な場合は、ビューのスケールに応じて地図上に動的に視覚化するため、シンボルを使用してアンテナを描画するのが最善の方法だと思います。

もちろん、適切なポリゴンをレイヤーフィーチャとして描画することでタスクを解決できますが、これは回避策となります。


だから、各サイトごとに異なる正しい方向に弧を描く必要がありますか?
ネイサンW

正しく理解していれば、まったく違います。図に示すように、扇形(またはビーム幅= 360の場合は円全体)でなければなりません。
E Bobrov

そうです。
ネイサンW

なるほど、分かりました。一般的に言えば、アーク記号は厳密には必要ありません。主な属性は、方位角とビーム幅です。任意のシンボルを使用して、アンテナをアークだけでなく描画できます。
Eボブロフ

おそらく私は、カスタムシンボルレイヤータイプの作成に役立つ例を見つけました。しかし、私にはわからない。だから誰もが、たとえば属性に応じて各レイヤーフィーチャの方向を描画する独自のシンボルレイヤークラスを作成しようとしました(つまり、上の図の言葉でアンテナの方位角)。
Eボブロフ

回答:


7

数日前に、Wedge Buffer Processing Algorithmと呼ばれる新しいプラグインがQGISに追加されました 。これは興味があるように見えます。

名前が示すように、それは処理アルゴリズムであるため、処理ツールボックスから実行する必要があります。まだ試してみる機会がありませんでした。

通常の円形バッファーのように円のセクターを作成しますが、くさびの角度と半径はフィールド値を使用して設定できます。

ドキュメントとスクリーンショットはgithubページで見ることができます


10

シンボルのみを使用する場合は、同様の質問:QGISでセクターライトを作成しますか?


同様のアプローチに従い、投影CRSで作業していると仮定すると(代わりに、地理座標系を使用している場合は、回答の最後にある注を参照)、説明に注意を集中することを強調したい目的の結果を再現するための最小限の操作:これは、ニーズに合わせて他のマイナーパラメーター(サイズ、幅など)を簡単に調整できることを意味します。

さらに、私はそれ"AZIMUTH"が方位角値"BEAMWIDTH"を保存するフィールドであり、アンテナビーム幅を保存するフィールドであると仮定します。

解決

Single symbol1つSimple Markerおよび2つのGeometry generatorシンボルレイヤーを繰り返して、ポイントをレンダリングします。

ここに画像の説明を入力してください

さらなる説明では、上の画像のシンボルと同じ順序に従います。

1)シンプルマーカー

サイズが3 mm、幅が0.4 mmのデフォルトの赤い円のシンボルを選択しました(これはこのチュートリアルの簡単な部分です)。

2)ジオメトリジェネレーター1

新しいシンボルレイヤーを追加しGeometry generatorLineString / MultiLineStringタイプとタイプを選択します。

ここに画像の説明を入力してください

次の式をExpressionフィールドに挿入します。

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

方位角セットを指す矢印を定義しました(矢印を作成するには、メインシンボルメニューからオプションのArrow下のシンボルレイヤータイプを選択してLineください)。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

セクターを定義しました。なおしてください200とは、2000メートル単位の距離を表しており、彼らは任意の値であり、私は200メートルの半径を有する円と交差するポリゴンを作成しようとしているので、そのニーズに応じてそれらを変更して自由に感じます。

最終結果

前のタスクを正しく実行すると、次のような結果を取得できるはずです(ラベルはこのソリューションとは別に追加され、コンテキストをよりよく説明するだけです)。

ここに画像の説明を入力してください

注意

地理座標系を使用している場合、つまり距離ではなく度を扱っている場合は、前の式で距離を使用したときに適切な値を使用すれば十分です。使用した距離は次のとおりです。

  • 300 m(ジオメトリジェネレーターNo. 1を参照);
  • 200 m(ジオメトリジェネレーターNo. 2を参照);
  • 2000 m(ジオメトリジェネレーターNo. 2を参照);

そのため、度で表された他の任意の値(たとえば、0.0002など0.002)に置き換えることができます。

ボーナス

ここにスタイルを添付しまし:任意のテキストエディターでこのコードを開き、QGISレイヤースタイルファイル(.qml拡張子付き)として保存できます。

上記のスタイルはQGIS 2.18.4を使用して作成されました(使用しているシェープファイルと同じ名前でなければなりません)。


このソリューションを探していましたか?動作しますか?
mgri

ソルトンは、トピックで説明されているケースを完全に解決します!私はそれを実装しましたが、私自身の実際のケースはわずかに異なることを理解しました。すみません、それは私のせいです。
Eボブロフ

1)マップ上の私のセクターの密度は異なります。つまり、セクター間の距離が短い場合、コードで定義された距離は多くのセクターを重複させ、マップのズームを変更しても役に立たないため、かなり難しい地図を読むために。しかし、セクター間の距離が長い場合、セクターは非常に小さく、マップを読み取るのが難しいかもしれません。単一のシンボルを使用することはその問題から解放され、それらの縮尺は地図のズームとともに変化します。
Eボブロフ

2)また、ビーム幅の歪みがあります。360度のビーム幅は楕円のように見え、異なる方位角のセクターですが、同じビーム幅は同等のビーム幅のセクターのようには見えません。地理座標系を使用しているからですか?これで、経度/緯度の異なる角度は、地球上のポイント間の異なる距離を表します。そのため、ソリューションは、セクターが位置する地球地域にローカライズする必要がありました。
Eボブロフ

とにかくあなたのソリューションと同様の答えのリファレンス「QGISでセクターライトを作成しますか?」いくつかの便利な機能を見るのに役立ちました。ありがとうございました。
Eボブロフ

4

mgriに大きな称賛を。

テスト層では、すべてがスムーズに機能しました。プロダクションレイヤーでは、2、3時間後に、$ geometryの問題を追跡できました。プラットフォームからポイントレイヤーをエクスポートしていましたが、気付きませんでしたが、それはMultiPointでした。これは問題を引き起こすように見えました:矢印は描かれていませんでした。奇妙なことに、計算されたポイントのみが円の​​ポリゴンを作成しました。

別のことは、変数radiusを使用していることです。(この場合、正しい単語かどうかはわかりませんが、「ビーム長​​」などの名前を付けることもできます)。

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

追加のプラグインなしで、Webで部分的なソリューションを提供されました。すぐに使用できます。アンテナのビーム幅は表示されず、単純なマーカーを正しい方向に回転させるだけです。単純なマーカーを使用し、アンテナの方位角+ 180度で回転します([レイヤーのプロパティ]> [シングルシンボ]->マーカー->単純なマーカー->三角形->回転->編集->式フィールドに<180 + "アンテナアジマス">と入力し、マーカーのアンカーポイントフィールドにTopを設定します)。埋め込まれた単純な三角形マーカーの方向が不適切なため、Ussing <180 + "antenna azimuth">が必要です。そうしないと、アンテナの方向が間違って表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.