Cesium从KML加载的Entity获取坐标

时间:2018-06-06 07:23:33

标签: javascript kml cesium

我正在尝试为kml文件中的每个点绘制一个箭头。为此,我计划通过getById获取每个点的坐标。到目前为止,我收到了一个错误:

Uncaught TypeError: Cannot read property 'position' of undefined (on line 14)

这是我的代码:

var src = Cesium.KmlDataSource.load('../../My_KML/plots.kml', options);
viewer.dataSources.add(src).then(function(data) {viewer.flyTo(data);});

//-------------------********--------------**********-----------------//
var point = viewer.entities.getById('geom_20102');

var entities = viewer.entities;

 var cartographicPosition = Cesium.Cartographic.fromCartesian(point.position.getValue(Cesium.JulianDate.now()));
            var latitude = Cesium.Math.toDegrees(cartographicPosition.latitude);
            var longitude = Cesium.Math.toDegrees(cartographicPosition.longitude);

var line1 = entities.add({
    polyline : {
        positions : Cesium.Cartesian3.fromDegreesArrayHeights([longitude, latitude, 360, longitude + 1, latitude + 1, 400]),
        width : 10,
        followSurface : false,
        material : new Cesium.PolylineArrowMaterialProperty(Cesium.Color.BLUE)
    }
});

我已将id为'geom_20102'的元素指定为由kml中的地标缠绕的线串。此外,我想知道指定哪个ID,因为地标和线串都有一个id。或者我是否将kml id与实体ID混淆?

我是Cesium.Js的新手,我部分地遵循了这个例子: Cesium Workshop

KML片段:

 <Placemark id="feat_20125">
        <name>874</name>
        <styleUrl>#stylesel_20102</styleUrl>
        <LineString id="geom_20102">
            <coordinates>104.99108,10.4118,247.3 72.991075,26.25412,247.6</coordinates>
            <altitudeMode>relativeToGround</altitudeMode>
        </LineString>
    </Placemark>

1 个答案:

答案 0 :(得分:1)

这里有两件事。

首先,Cesium.KmlDataSource.load()函数返回一个JavaScript“Promise”,它表示异步操作的最终完成(或失败)。在代码中引用viewer.entities时,KML文件尚未加载,因此 viewer.entities 中的集合为空,并且在其上调用getById()将返回undefined 。只有在异步Promise完成并调用“then”回调后才能访问viewer.entities或data.entities。只有在那个时候才填充实体。

var src = Cesium.KmlDataSource.load('../../My_KML/plots.kml', options);
viewer.dataSources.add(src).then(function(data) {

    var entities = data.entities;
    console.log("f=" + entities.getById('feat_20125')); // f=[object Object]
    console.log("g=" + entities.getById('geom_20102')); // undefined

    viewer.flyTo(data);
});

接下来,请注意'feat_20125'会返回一个对象,但找不到'geom_20102'。当KML转换为Cesium实体时,仅填充地标上的“id”。任何其他KML元素的ID都将被丢弃。