Доступ к значениям позиции из загруженных данных CZML с использованием Cesiumjs

Я загружаю файл CZML в свой файл app.js [оба файла представлены ниже].

Я могу получить доступ к полям имени и идентификатора, но не к полю позиции. Поле положения содержит картографические значения, такие как «время, долгота, широта, высота над уровнем моря». Я хотел бы получить доступ к наборам этих картографических значений, чтобы я мог их отобразить. Например, для приведенного ниже примера я хотел бы получить доступ к позиции [0] как «0,00, -4,6, -38,4,250». Как мне это сделать?

Я загружаю данные с помощью Cesium.CzmlDataSource.load, как показано ниже. Я также могу прикрепить новое поле, например «модель», но не получить доступ к полю позиции.

CZML-файл

[{
    "id":"document",
    "name":"test",
    "version":"1.0",
},
{
    "id":"field1",
    "name":"one",
    "position":
    {
        "cartographicDegrees": [
                   0.00,-4.6,-38.4,250,
                   0.00,-4.607,-38.491,249,
                   0.15,-4.6079,-38.48,249]
    }
}
]

app.js

(function () {
    "use strict";
    var viewer = new Cesium.Viewer('cesiumContainer');

   var readPromise = Cesium.CzmlDataSource.load('./test.czml');

    // Save a new drone model entity
    var testobj;
    readPromise.then(function(dataSource) 
    {
        viewer.dataSources.add(dataSource);

        var ds = viewer.dataSources.get(0);
        console.log("# of ds loaded: " + ds.entities.values.length);
        console.log("ds id: " + ds.entities.values[0].id);
        console.log("ds name: " + ds.entities.values[0].name);

        // Output of following line - [object, Object] ???
        console.log("ds name: " + ds.entities.values[0].position);

        // Get the entity using the id defined in the CZML data
        drone = dataSource.entities.getById('field1');

        // Attach a 3D model
        drone.model = { uri : './Source/SampleData/Models/drone.glb' };
    });
}());

person JJT    schedule 16.05.2020    source источник


Ответы (1)


К тому времени, когда ваш CZML будет импортирован как объекты, эти исходные позиции уже будут преобразованы. Объект entity.position, к которому вы обращаетесь, не является массивом, это экземпляр SampledPositionProperty .

Это свойство не раскрывает публично все свои внутренние данные, но вы можете запросить позицию в определенный момент времени, используя position.getValue(...).

Here's a Sandcastle Demo showing an entity position changing over time.

Код для этой демонстрации выглядит так:

var viewer = new Cesium.Viewer("cesiumContainer", {
  shouldAnimate: true,
});
var toolbar = document.getElementById("toolbar");

// Pre-allocate some memory, so we don't re-allocate 30~60 times per second.
var scratchCartesian = new Cesium.Cartesian3();
var scratchCartographic = new Cesium.Cartographic();

Cesium.CzmlDataSource.load("../SampleData/Vehicle.czml").then(function(dataSource) {
  viewer.dataSources.add(dataSource);
  viewer.clock.multiplier = 1;
  var entity = dataSource.entities.getById("Vehicle");
  if (entity) {
    // Track our entity with the camera.
    viewer.trackedEntity = entity;
    viewer.clock.onTick.addEventListener(function(clock) {

      // Get the position of our entity at the current time, if possible (otherwise undefined).
      var pos = entity.position.getValue(clock.currentTime, scratchCartesian);
      if (pos) {

        // If position is valid, convert from Cartesian3 to Cartographic.
        var lla = Cesium.Cartographic.fromCartesian(pos, Cesium.Ellipsoid.WGS84,
                  scratchCartographic);

        // Finally, convert from radians to degrees.
        toolbar.innerHTML =
          "Longitude: " + Cesium.Math.toDegrees(lla.longitude).toFixed(4) + " deg\n" +
          " Latitude:   " + Cesium.Math.toDegrees(lla.latitude).toFixed(4) + " deg\n" +
          " Altitude:   " + Cesium.Math.toDegrees(lla.height).toFixed(4) + " m";

      }
    });
  }
});
person emackey    schedule 16.05.2020