如何在Cesiumjs中设置KML相机的视图?

时间:2016-08-17 03:39:54

标签: datasource kml cesium

我有一个简单的KML文件,用于指定相机。

如何让Cesium加载KML然后飞到指定的摄像机视图?此外,KML将定期更新,以便如何让数据源更新,Cesium以间隔为基础飞到新视图?

我在本地网络服务器上运行Cesium,因此它可以从本地文件系统读取KML,我知道相机必须从Google的坐标框架旋转到Cesiums'。

这是KML文件:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
    <Camera>
        <altitudeMode>absolute</altitudeMode>
        <longitude>-80.215317</longitude>
        <latitude>26.843521</latitude>
        <altitude>306.388825</altitude>
        <heading>48.980423</heading>
        <roll>0.062101</roll>
        <tilt>75.090492</tilt>
    </Camera>
</Document>
</kml>
到目前为止,这是我的代码:

<script>

    var My_Altitude;
    var My_Heading;
    var My_Latitude;
    var My_Longitude;
    var My_Roll;
    var My_Tilt;
    var Update_Interval = 60;

    var viewer = new Cesium.Viewer('cesiumContainer');
    var options = {
        camera : viewer.scene.camera,
        canvas : viewer.scene.canvas
    };

    viewer.dataSources.add(Cesium.KmlDataSource.load('./My_Camera.kml', options)).then(function(dataSource){

        My_Altitude = dataSource.entities.getById('altitude');
        My_Heading = dataSource.entities.getById('heading');
        My_Latitude = dataSource.entities.getById('latitude');
        My_Longitude = dataSource.entities.getById('longitude');
        My_Roll = dataSource.entities.getById('roll');
        My_Tilt = dataSource.entities.getById('tilt');

        viewer.camera.flyTo({
            destination : Cesium.Cartesian3.fromDegrees( My_Longitude, My_Latitude, My_Altitude ),
            orientation : {
                heading : Cesium.Math.toRadians( My_Heading ),
                pitch   : Cesium.Math.toRadians( My_Tilt - 90.0 ),
                roll    : Cesium.Math.toRadians( My_Roll )
            },
            duration : Update_Interval
        });
    });

</script>

非常感谢任何帮助。

: - )

1 个答案:

答案 0 :(得分:0)

在KmlDataSource中访问KML Camera元素不起作用,因为Cesium中尚不支持Camera / LookAt元素而不存在。 (见issue 873)。如果在Web控制台/调试器中查看数据源的Object,您将看到实体数组的长度为0.

My_Tilt = dataSource.entities.getById('tilt'); // returns undefined

您需要手动获取KML内容并解析Camera元素。

var x = new XMLHttpRequest();
x.open("GET", "./My_Camera.kml", true);                
x.onreadystatechange = function () {
  if (x.readyState == 4 && x.status == 200)
  {
     var xmlDoc = x.responseXML;
     var camera = xmlDoc.getElementsByTagName("Camera")[0];
     var My_Tilt = camera.getElementsByTagName("tilt")[0].childNodes[0].nodeValue;
     // ...
  }
};
x.send();

将倾斜度 - 90转换为音高是正确的,但是,您需要将roll的符号反转为从Google地球转换为Cesium的代表。

这是更新后的flyTo代码:

 viewer.camera.flyTo({
            destination : Cesium.Cartesian3.fromDegrees( My_Longitude, My_Latitude, My_Altitude ),
            orientation : {
                heading : Cesium.Math.toRadians( My_Heading ),
                pitch   : Cesium.Math.toRadians( My_Tilt - 90.0 ),
                roll    : -Cesium.Math.toRadians( My_Roll )
            },

如果您想在一段时间内更新KML,那么您可以在javascript中创建一个计时器,并在计时器操作中重新解析KML。