cesium中主要涉及到如下几类坐标:
1、Cartographic,这个就是我们常说的地理坐标,即经纬度;
2、Cartesian3,这个是世界坐标,也就是空间坐标;
3、Cartesian2,这个是屏幕坐标,即px;
一、世界坐标与经纬度的相互转换
1)、世界坐标转经纬度(Cartesian3 >>Cartographic)
var ellipsoid = viewer.scene.globe.ellipsoid;
var cartesian3 = new Cesium.Cartesian3(X, Y, Z); (这个X,Y,Z一般为投影坐标系的坐标,单位为米)
var cartographic = ellipsoid.cartesianToCartographic(cartesian3); 此时的单位为弧度;
( 或者 var cartographic = Cesium.Cartographic.fromCartesian(cart3,viewer.scene.globe.ellipsoid)) ;
然后通过 Cesium.Math.toDegrees(cartographic.latitude); 转为经纬度
2)、经纬度转世界坐标(Cartographic>>Cartesian3 )
a方法:Cesium.Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result);
b方法: var ellipsoid = viewer.scene.globe.ellipsoid;
var cartesian3 = ellipsoid.cartographicArrayToCartesianArray(cartographic);
二、世界坐标和屏幕坐标的相互转换;
1)、世界坐标转换为屏幕坐标(Cartesian3>>Cartesian2)
a方法: Cesium.Cartesian2.fromCartesian3(Cartesian3, result);这只是获取Cartesian3的x和y属性并删除z,感觉并无实 际意义。
b方法: var px_position = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, cartesian);此时的屏幕坐 标 才为真实的屏幕坐标,单位为px
2)、屏幕坐标转换为世界坐标(Cartesian2>>Cartesian3)
一般来说没事是不会转换的,都是通过事件(单击、鼠标移动等)获取的二维屏幕坐标,然后进行转换,但是转换的方式分几种,得到的记过也不同;
如果不考虑地形因素的话,可通过如下方式:
var cartesian3 = viewer.scene.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid);
考虑地形因素:
屏幕坐标转化为世界坐标时,要通过camera的ray,找到ray与地球的交点,确定世界坐标;此时获取的坐标是包含了地形信息的,也就是说如果存在地形时,尽量采取此种方法转换;
var ray = camera.getPickRay(cartesian2);
var cartesian3 = viewer.scene.globe.pick(ray, viewer.scene);
补充说明:一般通过cesium事件(比如点击事件)获取的均为屏幕坐标,即Catesian2;