javascript - Cesium live update 的一个点?

标签 javascript html json dictionary cesiumjs

我目前正在为 Cesium 开发实时跟踪应用程序,但在浏览器中显示该点时遇到了一些问题。

到目前为止,我的 Cesium 查看器从服务器接收数据(JSON 格式)并在 map 上正确显示该点,但让它更新 map 上的位置的唯一方法是刷新页面。请注意,它正在从中读取位置的 location.json 文件大约每秒更新一次来自服务器的新位置。

现在我认为它会这样做,因为客户端代码没有“更新”功能来动态更改 map 上的点位置。

那么让Cesium不断更新 map 上的点,而不需要用户不断刷新页面,最简单的方法是什么?根据我的研究,我发现了一些涉及流式传输 CZML 文件或将我的 JSON 转换为数据源的示例,但这些对于看似简单的任务来说似乎有点复杂。难道没有一个简单的“更新”功能,可以动态改变点吗?

这是我的客户端代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <!-- Use correct character set. -->
  <meta charset="utf-8">
  <!-- Tell IE to use the latest, best version (or Chrome Frame if pre-IE11). -->
  <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
  <!-- Make the application on mobile take up the full browser screen and disable user scaling. -->
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
  <title>Hello World!</title>
  <script src="../Build/Cesium/Cesium.js"></script>
  <style>
      @import url(../Build/Cesium/Widgets/widgets.css);
      html, body, #cesiumContainer {
          width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden;
      }
  </style>
</head>
<body>
  <div id="cesiumContainer"></div>

  <script>
      var viewer = new Cesium.Viewer('cesiumContainer');

      Cesium.loadJson('/location.json').then(function(data) {
          console.log(data);
          viewer.entities.add({
              name : data.name,
              position : Cesium.Cartesian3.fromDegrees(data.lon, data.lat),
              point : {
                  pixelSize : 5,
                  color : Cesium.Color.RED,
                  outlineColor : Cesium.Color.WHITE,
                  outlineWidth : 2
              },
              label : {
                  text : data.name,
                  font : '14pt monospace',
                  style: Cesium.LabelStyle.FILL_AND_OUTLINE,
                  outlineWidth : 2,
                  verticalOrigin : Cesium.VerticalOrigin.BOTTOM,
                  pixelOffset : new Cesium.Cartesian2(0, -9)
              }
          });

          viewer.zoomTo(viewer.entities);
      });
</script>
</body>
</html>

如果您需要我提供更多信息,我很乐意提供。

谢谢!

最佳答案

您需要保留对每个点的引用,然后根据某个唯一 ID 简单地更新该元素的位置。如果名称是唯一的,那么您可以使用它,否则您需要实现某种方式来在更新后识别每个点。 您可以通过调用 var currentPoint = viewer.entities.getById(data.id) 在 loadJSON 回调函数中检查该点是新点还是现有点。然后你可以选择你调用这些函数中的哪一个。第一个用于新点(当 currentpoint == undefined 时):

function addNewPoint(
var point = new Cesium.Entity(
{
              id : data.id,
              name : data.name,
              position : Cesium.Cartesian3.fromDegrees(data.lon, data.lat),
              point : {
                  pixelSize : 5,
                  color : Cesium.Color.RED,
                  outlineColor : Cesium.Color.WHITE,
                  outlineWidth : 2
              },
              label : {
                  text : data.name,
                  font : '14pt monospace',
                  style: Cesium.LabelStyle.FILL_AND_OUTLINE,
                  outlineWidth : 2,
                  verticalOrigin : Cesium.VerticalOrigin.BOTTOM,
                  pixelOffset : new Cesium.Cartesian2(0, -9)
              }
          }
          );

          viewer.entities.add(point);
);

否则你调用只会更新位置的 updatePoint 函数

function updatePosition(currentPoint, data)
{
  var newPos = new Cesium.Cartesian3.fromDegrees(data.lon, data.lat);
  currentPoint.position = newPos;
}

关于javascript - Cesium live update 的一个点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33478805/

相关文章:

javascript - ROR - CoffeeScript 导致 "Uncaught ReferenceError"

javascript - 运行客户端代码时显示正在加载的 gif 图像

javascript - 是否可以在没有 React 的情况下使用 MobX?

javascript - 为什么我的警告消息和背景颜色变化不同时执行?

javascript - 来自 jQuery 类的多个 div 的鼠标悬停()事件

javascript - 通过 $http 进行 Angular json 编码

html - 在 Html 页面 <video> 标签中我想增加高度但没有增加

javascript - 保护专有 HTML/CSS/JavaScript 的最佳方法是什么?

json - 从 Firebase remoteMessage 中的嵌套 JSON 中提取数据

jquery - 在 C# .NET 3.5 中使用 HTTPHandler 和 jQuery 周日历