专栏名称: GIS前沿
分享测绘地信资讯,交流行业软件技巧。
目录
相关文章推荐
河南新闻广播  ·  胖东来,新动作来了! ·  23 小时前  
绝对现场  ·  名医到院区 | ... ·  昨天  
河南新闻广播  ·  阳光正在赶来!河南即将开启升温模式 ·  昨天  
河南新闻广播  ·  南阳最新人事任免 ·  2 天前  
51好读  ›  专栏  ›  GIS前沿

Cesium为军工助力!动态绘制各类交互式态势图

GIS前沿  · 公众号  ·  · 2024-09-10 20:42

正文

什么是态势图

态势图(Situation Map) 是一种用于表示 空间环境 中动态或静态信息的地图,它能够展示 事件 资源 威胁 其他关键因素 的地理位置及其变化情况。

通过可视化的方式,态势图帮助 决策者 在复杂环境中迅速获取关键信息,从而做出及时而准确的决策。

随着地理信息系统(GIS)的不断发展, 态势图 军事 应急管理 地理规划 等领域中扮演着越来越重要的角色。

军工领域

在军工领域,态势图是军事 指挥 控制系统 中的核心组件。

它们能够实时展示战场上的 动态信息 ,如部队的部署位置、敌军动向、武器系统状态等。这种可视化工具对于战术指挥、作战计划制定和战场态势感知至关重要。

应急管理

在应急管理领域,态势图能够帮助管理者 协调资源 和人员应对自然灾害、山林火灾、事故或突发事件。通过态势图,可以清晰地看到灾害 影响范围 救援力量分布 资源需求 逃生路线 等关键信息,从而实现有效的应急响应和资源调配。

地理规划

在地理规划中,态势图用于 展示和分析区域开发 土地利用 交通网络 等方面的信息。能帮助规划者更清晰的理解地理空间关系、评估环境影响,并做出科学的规划决策。

Cesium中绘制态势图

OK,接下来我们主要介绍一下在Cesium中如何绘制态势图,主要包括各种箭头类型的绘制,如 直线箭头 攻击箭头 钳击箭头 等。

源码地址在文末。

箭头绘制的核心算法

algorithm.js 是实现复杂箭头绘制的核心脚本。

这里定义了多种箭头类型的绘制算法,如双箭头( doubleArrow )、三箭头( threeArrow )以及带尾攻击箭头( tailedAttackArrow )。

这些算法通过接收用户点击的多个点,并计算出箭头的控制点和多边形点来实现箭头形状的生成。

以下是 doubleArrow 函数的部分代码与解析:

xp.algorithm.doubleArrow = function (inputPoint{
  // 初始化结果对象
  var result = {
    controlPointnull,
    polygonalPointnull
  };

  // 根据输入点数量决定不同的箭头形状
  var t = inputPoint.length;
  if (!(2 > t)) {
    if (2 == t) return inputPoint;

    // 获取关键点
    var o = this.points[0], 
        e = this.points[1], 
        r = this.points[2];

    // 计算连接点和临时点位置
    3 == t ? this.tempPoint4 = xp.algorithm.getTempPoint4(o, e, r) : this.tempPoint4 = this.points[3];
    3 == t || 4 == t ? this.connPoint = P.PlotUtils.mid(o, e) : this.connPoint = this.points[4];

    // 根据点的顺序计算箭头的左右侧点位
    P.PlotUtils.isClockWise(o, e, r) 
        ? (n = xp.algorithm.getArrowPoints(o, this.connPoint, this.tempPoint4, !1), g = xp.algorithm.getArrowPoints(this.connPoint, e, r, !0)) 
        : (n = xp.algorithm.getArrowPoints(e, this.connPoint, r, !1), g = xp.algorithm.getArrowPoints(this.connPoint, o, this.tempPoint4, !0));

    // 生成最终的箭头形状并返回
    result.controlPoint = [o, e, r, this.tempPoint4, this.connPoint];
    result.polygonalPoint = Cesium.Cartesian3.fromDegreesArray(xp.algorithm.array2Dto1D(f));
  }
  return result;
};

该函数首先根据输入点的数量确定是否继续进行箭头的绘制,接着计算关键点的位置,并通过 getArrowPoints 函数计算出箭头形状的多个控制点,最终生成一个包含箭头形状顶点的数组。

基于Cesium的箭头实体管理

arrowClass.js 定义了具体的箭头类(如 StraightArrow )和其行为管理。

通过结合Cesium的 ScreenSpaceEventHandler 事件处理机制,开发者可以方便地在地图上绘制、修改和删除箭头实体。

以下是 StraightArrow 类的部分代码与解析:

StraightArrow.prototype.startDraw = function () {
  var $this = this;
  this.state = 1;

  // 单击事件,获取点击位置并创建箭头起点
  this.handler.setInputAction(function (evt{
    var cartesian = getCatesian3FromPX(evt.position, $this.viewer);
    if (!cartesian) return;
    
    // 处理点位并开始绘制箭头
    if ($this.positions.length == 0) {
      $this.firstPoint = $this.creatPoint(cartesian);
      $this.floatPoint = $this.creatPoint(cartesian);
      $this.positions.push(cartesian);
    }
    if ($this.positions.length == 3) {
      $this.firstPoint.show = false;
      $this.floatPoint.show = false;
      $this.handler.destroy();
      $this.arrowEntity.objId = $this.objId;
      $this.state = -1;
    }
    $this.positions.push(cartesian.clone());
  }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

  // 鼠标移动事件,实时更新箭头形状
  this.handler.setInputAction(function (evt{
    if ($this.positions.length 1) return;
    var cartesian = getCatesian3FromPX(evt.endPosition, $this.viewer);
    if (!cartesian) return;
    
    $this.floatPoint.position.setValue(cartesian);
    if ($this.positions.length >= 2) {
      if (!Cesium.defined($this.arrowEntity)) {
        $this.positions.push(cartesian);
        $this.arrowEntity = $this.showArrowOnMap($this.positions);
      } else {
        $this.positions.pop();
        $this.positions.push(cartesian);
      }
    }
  }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
};

startDraw 函数中,通过设置单击和鼠标移动事件,开发者可以实时捕获用户的操作,并根据点击位置动态绘制箭头。

最终的箭头形状会随着鼠标的移动而更新,当点击完成时箭头形状被确定。

工具类与辅助函数

plotUtil.js 提供了一些用于计算几何关系的实用工具函数。

例如, distance 函数计算两个点之间的距离,而 getThirdPoint 函数根据给定的两个点和角度,计算出第三个点的位置。这些工具函数被广泛用于箭头的绘制逻辑中,以确保箭头的形状符合预期。

以下是 distance getThirdPoint 函数的代码示例:

P.PlotUtils.distance = function (t, o{
  return Math.sqrt(Math.pow(t[0] - o[0], 2) + Math.pow(t[1] - o[1], 2));
};

P.PlotUtils.getThirdPoint = function (t, o, e, r, n{
  var g = P.PlotUtils.getAzimuth(t, o),
      i = n ? g + e : g - e,
      s = r * Math.cos(i),
      a = r * Math.sin(i);
  return [o[0] + s, o[1] + a];
};

这些函数都是为复杂箭头形状的计算提供了基础,确保在地图上绘制的箭头具有精确的几何形态。

总结







请到「今天看啥」查看全文