在地图上显示天线符号:点符号或要素(多边形)


12

我想在地图上显示一个蜂窝网络。输入数据是一个.csv文件,其中每个字符串都是一个蜂窝扇区。这些属性是:扇区ID,其坐标,其方位角和天线波束宽度的角度。

天线波束宽度值在30到360度之间。360天线波束宽度意味着它必须在地图上显示为圆形。具有其他波束宽度的天线必须显示为具有适当孔径角的扇区。

在此处输入图片说明

是否可以仅使用符号显示天线?我知道如何创建自己的SVG符号,并希望找到如何根据方位旋转它。但是,是否有任何方法可以根据其30至360度的属性值来应用可变的天线波束宽度?

我认为符号是绘制天线的最佳方法,因为如果在QGIS中可以根据视图比例尺在地图上进行动态可视化,则这些符号是可行的。

当然,可以通过将适当的多边形绘制为图层要素来解决该任务,但这将是一种解决方法。


因此,您需要沿正确的方向绘制圆弧,这对于每个站点都是不同的?
内森·W

完全没有,如果我理解正确的话。如图中所示,它必须是一个扇形的扇区(或者在波束宽度= 360的情况下为整个圆)。
E Bobrov

是的,这就是我的意思。
内森·W

好的我明白了。一般而言,严格不需要圆弧符号。主要属性是方位角和波束宽度。我可以使用任何符号绘制天线,而不仅是弧形。
E Bobrov

大概我找到了可能有帮助的示例:创建自定义符号图层类型。但是我不确定。因此,有人尝试创建自己的符号图层类,根据其属性(例如,上面图片中的天线方位角)绘制每个图层要素方向吗?
E Bobrov

Answers:


7

几天前,QGIS中添加了一个名为“ 楔缓冲处理算法”的新插件 。看起来好像很有趣。

顾名思义,它是一种处理算法,因此您需要从处理工具箱中运行它。虽然还没有机会尝试。

它创建圆的扇区-像普通的圆形缓冲区一样,但是可以使用字段值设置楔角和半径。

文档和屏幕截图可以在github页面上看到


10

如果您只想使用符号系统,那么我将提出一个解决方案,该解决方案的灵感来自我对类似问题的回答:在QGIS中创建扇形灯?


按照类似的方法,并假设您正在使用“计划的CRS”(相反,如果使用的是“地理坐标系”,请参见答案末尾的注释),我想强调一下,我将重点放在说明上再现所需结果的最小工作量:这意味着您应该容易地调整一些其他次要参数(例如大小,宽度等),以更好地满足您的需求。

此外,我假设这"AZIMUTH"是存储方位角值"BEAMWIDTH"的字段,并且是存储天线波束宽度的字段。

我们将Single symbol通过重复一个Simple Marker和两个Geometry generator符号层来使用和渲染点:

在此处输入图片说明

在进一步的说明中,我将遵循上图中符号的相同顺序。

1)简单标记

我选择了一个红色圆圈的默认符号(这是本教程中比较容易的部分),其大小为3毫米,宽度为0.4毫米。

2)1号几何生成器

添加一个新的符号层,然后选择Geometry generatorLineString / 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

我们刚刚定义了部门。请注意,200并且2000以米为单位表示距离,它们是任意值,因为我正试图创建一个与半径为200 m的圆相交的多边形,因此可以根据需要随意更改它们。

最后结果

如果您正确执行了先前的任务,则应该能够获得类似以下的结果(标签是在此解决方案之外添加的,它们只能更好地说明上下文):

在此处输入图片说明

注意

如果您使用的是地理坐标系,即您正在处理度数而不是距离,那么当我在先前公式中使用距离时,使用适当的值就足够了。我使用的距离是:

  • 300 m(参见1号几何发生器);
  • 200 m(见2号几何发生器);
  • 2000 m(见2号几何发生器);

所以你可以在度表示其他任意值替换它(例如0.00020.002等)。

奖金

我在此处附加了样式:您可以使用任何文本编辑器打开此代码,并将其另存为QGIS图层样式文件(即带有.qml扩展名)。

上面的样式是使用QGIS 2.18.4创建的(必须具有与您使用的shapefile相同的名称)。


您在寻找这个解决方案吗?它行得通吗?
mgri

您的解决方案完全可以解决主题中所述的情况!我已经实现了它,并且了解到我自己的实际情况略有不同。对不起,这是我的错。
E Bobrov

1)我的扇区在地图上的密度是不同的,即,如果扇区之间的距离很短,则代码中定义的距离将使许多扇区重叠,更改地图缩放将无济于事,因此这将非常困难阅读地图。但是,如果扇区之间的距离很长,则表明扇区将非常小,可能很难阅读地图。使用单个符号可以解决这个问题,其比例会随着地图缩放而变化。
E Bobrov

2)并且存在波束宽度失真:波束宽度360度看起来像椭圆,具有不同方位角的扇区,但是相同的波束宽度看起来不像具有等效波束宽度的扇区。是因为我使用的是地理坐标系吗?您现在,不同的经度/纬度角度表示地球上各点之间的不同距离。因此,解决方案需要本地化到扇区所在的地球区域。
E Bobrov

无论如何,您的解决方案和类似答案的参考“在QGIS中创建扇形灯?” 帮助我看到了一些有用的功能。再次感谢你。
E Bobrov

4

向mgri致敬。

在我们的测试层中,一切正常进行。在生产层中,经过两三个小时,我设法找到了$ 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度旋转它(“图层属性”>“ Single Simbol”->“标记”->“简单标记”->“三角形”->“旋转”->“编辑” ->在表达式字段中输入<180 +“ antenna azimuth”>。并在标记的锚点字段中设置Top。由于嵌入的简单三角形标记的方向不正确,因此需要使用<180 +“天线方位角”。否则会显示错误的天线方向。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.