今天在用Cesium做距离量测的时候,报了 Cesium.js:1 Uncaught TypeError: Cannot read property ‘x’ of undefined at… 这个错误,通过chrome调试后才发现,原来在Cesium事件处理对象ScreenSpaceEventHandler
中,不同的事件触发类型ScreenSpaceEventType
对应的回调函数参数的写法是有区别的,如下:
LEFT_CLICK
对于鼠标点击事件,传入的参数最好写为 event
,获取位置时调用event.position
myhandler.setInputAction(function (event) {
isDraw = true;
var position1;
var cartographic;
var ray = viewer.scene.camera.getPickRay(event.position);
if (ray)
position1 = viewer.scene.globe.pick(ray, viewer.scene);
console.log('左键单击----------------------------------------------------------');
console.log(position1);
if (position1)
var cartographic = Cesium.Cartographic.fromCartesian(position1);
// cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position1);
console.log(position1);
if (cartographic) {
var height = viewer.scene.globe.getHeight(cartographic);
var point = Cesium.Cartesian3.fromDegrees(cartographic.longitude / Math.PI * 180, cartographic.latitude / Math.PI * 180, height);
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
MOUSE_MOVE
对于鼠标移动事件,参数最好写为movement
,调用的时候分为movement.startPosition
和movement.endPosition
myhandler.setInputAction(function(movement){
// console.log(movement.endPosition); //屏幕坐标
var ray = camera.getPickRay(movement.endPosition); //射线发出位置origin 与射线方向 direction
var position1 = viewer.scene.globe.pick(ray, viewer.scene); //cartisian3坐标
var cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position1);
// var cartographic = Cesium.Cartographic.fromCartesian(position1);
if (cartographic) {
var height = viewer.scene.globe.getHeight(cartographic);
var point = Cesium.Cartesian3.fromDegrees(cartographic.longitude / Math.PI * 180, cartographic.latitude / Math.PI * 180, height);
},Cesium.ScreenSpaceEventType.MOUSE_MOVE);