Cesium中的坐标的转化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caozl1132/article/details/86220824

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 )

扫描二维码关注公众号,回复: 5908528 查看本文章

          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;

仅供各位初学者参考,如有错误,请指正,共同进步;

猜你喜欢

转载自blog.csdn.net/caozl1132/article/details/86220824