传统在三维球上绘制一个对象, 比如说 圆形、圆锥等,常用的方式是绘制一个局部圆等对象 ,然后经过mvp投影变换放到指定的地理位置处,当然这样也有很多好处,比如说动态变化时,只需要更新下投影变换矩阵,不用重新绘制对象等。但是也存在一个比较大的弊端,做一些分析时不是那么方便,圆形相对还好,如果是一个多边形,怎么判断其他点在他内部呢
碰上 这种情况,墨卡托投影就比较有用了
基本思路是将地理座标转换成墨卡托投影下的座标,然后根据圆形半径等参数,直接计算出圆上其他点的墨卡托 座标(其他形状类似),这样就能获取到圆形上点的墨卡托座标点了,然后再转换成地理座标,就可以获取圆形的地理点座标点集了,这样做其他应用就比较方便了
var viewPoint = new Cesium.Cartesian3(-1715458.381202962,4993543.848935778,3566901.09041305);
// 加载座标轴,便于测试
var transform = Cesium.Transforms.eastNorthUpToFixedFrame(viewPoint);
// 世界座标转换为投影座标
var webMercatorProjection = new Cesium.WebMercatorProjection(viewer.scene.globe.ellipsoid);
var viewPointWebMercator = webMercatorProjection.project(Cesium.Cartographic.fromCartesian(viewPoint));
// 目标点集合
var destPoints = [];
// 视域点和目标点的距离
var radius = 100; // 视距1000米
// 计算一圈
for (var i = 0; i <= 360; i++) {
// 度数转弧度
var radians = Cesium.Math.toRadians(i);
// 计算目标点
var toPoint = new Cesium.Cartesian3(viewPointWebMercator.x + radius * Math.cos(radians), viewPointWebMercator.y + radius * Math.sin(radians),480);
// 投影座标转世界座标
toPoint = webMercatorProjection.unproject(toPoint);
destPoints.push(Cesium.Cartographic.toCartesian(toPoint.clone()));
}