Цезий получает координаты от объекта, загруженного из KML - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь нарисовать стрелку для каждой точки в файле 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)
    }
});

Я указал элемент с идентификатором 'geom_20102' в качестве строки, обернутой меткой вкмл.Также я хотел бы знать, какой идентификатор указывать, так как метка и строка имеют идентификатор.Или я путаю идентификатор kml с идентификатором сущности?

Я новичок в Cesium.Js и частично следовал этому примеру: Цезиевая мастерская

Фрагмент 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 голосов
/ 08 июня 2018

Здесь происходит две вещи.

Во-первых, функция Cesium.KmlDataSource.load () возвращает JavaScript «Обещание», которое представляет возможное завершение (или неудачу)асинхронная операция.На момент ссылки на viewer.entities в коде файл KML еще не загружен, поэтому коллекция в viewer.entities пуста, и при вызове getById () для него возвращается undefined.Вы должны получить доступ к viewer.entities или data.entities только после того, как асинхронное Обещание будет выполнено и будет вызван обратный вызов «then».Только в это время заполняются сущности.

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» не найден.Только "id" на метках заполняется, когда KML преобразуется в цезиевые объекты.Идентификаторы любого другого элемента KML отбрасываются.

...