Cesium实时更新一个点的位置?

3
我目前正在为Cesium开发一个实时跟踪应用程序,但在浏览器中显示点时遇到了一些问题。
目前,我的Cesium查看器从服务器接收数据(以JSON格式),并在地图上正确地显示该点,但是更新地图上的位置的唯一方法是刷新页面。请注意,它正在从location.json文件中读取位置,并且每秒左右会从服务器更新一次位置。
我想这样做是可以的,因为客户端代码没有“更新”函数来动态更改地图上的点位置。
那么,有什么最简单的方法可以让Cesium不断更新地图上的点,而无需用户不断刷新页面吗?根据我的研究,我发现了一些涉及流式传输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>

如果您需要更多的信息,请告诉我,我很乐意提供。谢谢!
1个回答

2

您需要保留对每个点的引用,然后根据某个唯一的id简单地更新该元素的位置。如果名称是唯一的,则可以使用该名称,否则您需要实现某种方式来标识每个更新后的点。 在loadJSON回调函数中,您可以通过调用var currentPoint = viewer.entities.getById(data.id)来检查该点是否为新点或现有点。然后您可以选择调用这些函数中的哪一个。第一个用于新点(当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;
}

由于似乎您只有一个要跟踪的点,所以在首次加载JSON时调用addNewPoint函数,而在后续加载时调用updatePosition函数。然后,您可以根据需要定期或在某些用户操作上调用此函数。 - Tomislav Muic
1
非常好,稍加调整后就按照我想要的方式工作了!谢谢! - SirFerret

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接