Cesium 从 KML 加载的 Entity 获取坐标
Cesium get coordinates from Entity loaded from KML
我正在尝试为 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,因为 placemark 和 linestring 都有一个 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>
这里发生了两件事。
首先,Cesium.KmlDataSource.load() 函数 return 是一个 JavaScript “Promise”,表示异步操作的最终完成(或失败)。在代码中引用 viewer.entities 时,KML 文件尚未加载,因此 viewer.entities 中的集合为空并对其调用 getById()将 return 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' return 是一个对象,但未找到 'geom_20102'。当 KML 转换为 Cesium 实体时,只会填充地标上的“id”。丢弃任何其他 KML 元素上的 ID。
我正在尝试为 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,因为 placemark 和 linestring 都有一个 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>
这里发生了两件事。
首先,Cesium.KmlDataSource.load() 函数 return 是一个 JavaScript “Promise”,表示异步操作的最终完成(或失败)。在代码中引用 viewer.entities 时,KML 文件尚未加载,因此 viewer.entities 中的集合为空并对其调用 getById()将 return 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' return 是一个对象,但未找到 'geom_20102'。当 KML 转换为 Cesium 实体时,只会填充地标上的“id”。丢弃任何其他 KML 元素上的 ID。