前言
我想在地球上用鼠标画线,并完成相应的业务逻辑
翻看api,找到沙盒;
关键词:Polyline
过程
找到沙盒例子,copy代码,看看效果
js代码
//测量点击事件
$("#start").click(function () {
var line = parent.viewer.entities.add({
name: 'Red line on terrain',
polyline: {
positions: parent.Cesium.Cartesian3.fromDegreesArray([-75, 35,-125, 35]),
width: 5,
material: parent.Cesium.Color.RED,
clampToGround: true
}
})
})
嗯,效果还可以,能画线了,在想想怎么测距离,百度,发现自己竟然还要知道坐标系的概念,还要会算…崩溃了;硬着头皮开始搞.
坐标系介绍
cesium里面有两种常用坐标系:
1.WGS84
2.笛卡尔(就是我们高中学的几何坐标系)
cesium中用的坐标系及API关键字
- 平面坐标系(Cartesian2)
- 笛卡尔坐标(Cartesian3)
- WGS84相关(Cargraphic弧度)
由于cesium中没有直接把笛卡尔转成经纬度的,所以要通过弧度进行中间转换
相关API操作如下:
API | 说明 |
---|---|
Cesium.Cartographic.fromCartesian(cartesian, ellipsoid, result) | 笛卡尔转弧度 |
Cesium.Cartographic.fromDegrees(longitude, latitude, height, result) | 经纬度转弧度(度单位) |
Cesium.CesiumMath.toDegrees(radians) | 弧度转度 |
Cesium.CesiumMath.toRadians(degrees) | 度转弧度 |
Cesium.Cartographic.fromRadians(longitude, latitude, height, result) | 经纬度转弧度(弧度单位) |
Cesium.Cartographic.toCartesian(cartographic, ellipsoid, result) | 弧度转笛卡尔 |
var pick1= scene.globe.pick(viewer.camera.getPickRay(pt1), scene) //其中pt1为一个二维屏幕坐标 | 平面坐标转三维坐标(其实都是笛卡尔坐标) |
var geoPt1= scene.globe.ellipsoid.cartesianToCartographic(pick1) //其中pick1是一个Cesium.Cartesian3对象 | 笛卡尔三维坐标转地理坐标 |
var point1=[geoPt1.longitude / Math.PI * 180,geoPt1.latitude / Math.PI * 180]; //其中geoPt1是一个地理坐标 | 地理坐标转经纬度 |
var cartographic = Cesium.Cartographic.fromDegree(point) //point是经纬度值 | 经纬度转地理坐标(弧度) |
var coord_wgs84 = Cesium.Cartographic.fromDegrees(lng, lat, alt);//单位:度,度,米 | 经纬度转地理坐标 |
var cartesian = Cesium.Cartesian3.fromDegree(point) | 经纬度转笛卡尔坐标 |
计算两个三维坐标点之间的距离
var d=Cesium.Cartesian3.distance(Cartesian3x1,Cartesian3x2);//x1,x2都是笛卡尔坐标系
笛卡尔坐标系api
api | 说明 |
---|---|
Cesium.Cartesian3.abs(cartesian, result) | 计算绝对值 |
Cesium.Cartesian3.add(left, right, result) | 计算两个笛卡尔的分量和 |
Cesium.Cartesian3.angleBetween(left, right) | 计算角度(弧度制) |
Cesium.Cartesian3.cross(left, right, result) | 计算叉积 |
Cesium.Cartesian3.distance(left, right) | 计算两点距离 |
Cesium.Cartesian3.distanceSquared(left, right) | 计算两点平方距离 |
Cesium.Cartesian3.divideByScalar(cartesian, scalar, result) | 计算标量除法 |
Cesium.Cartesian3.divideComponents(left, right, result) | 计算两点除法 |
Cesium.Cartesian3.dot(left, right) | 计算点乘 |
Cesium.Cartesian3.equals(left, right) | 比较两点是否相等 |
Cesium.Cartesian3.fromArray(array, startingIndex, result) | 从数组中提取3个数构建笛卡尔坐标 |
Cesium.Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result) | 将将纬度转换为笛卡尔坐标(单位是度°) |
Cesium.Cartesian3.fromDegreesArray(coordinates, ellipsoid, result) | 返回给定经度和纬度值数组(以度为单位)的笛卡尔位置数组。 |
Cesium.Cartesian3.fromDegreesArrayHeights(coordinates, ellipsoid, result) | 返回给定经度,纬度和高度的笛卡尔位置数组 |
Cesium.Cartesian3.fromElements(x, y, z, result) | 创建一个新的笛卡尔坐标 |
Cesium.Cartesian3.fromRadians(longitude, latitude, height, ellipsoid, result) | 返回笛卡尔坐标以弧度制的经纬度 |
Cesium.Cartesian3.fromRadiansArray(coordinates, ellipsoid, result) | 返回笛卡尔坐标以弧度制的经纬度数组 |
Cesium.Cartesian3.fromRadiansArrayHeights(coordinates, ellipsoid, result) | 返回笛卡尔坐标以弧度制的经纬度高度数组 |
Cesium.Cartesian3.fromSpherical(spherical, result) | 将提供的球面转换为笛卡尔系 |
Cesium.Cartesian3.lerp(start, end, t, result) | 使用提供的笛卡尔数来计算t处的线性插值或外推。 |
Cesium.Cartesian3.magnitude(cartesian) | 计算笛卡尔长度 |
Cesium.Cartesian3.magnitudeSquared(cartesian) | 计算提供的笛卡尔平方量级 |
Cesium.Cartesian3.maximumByComponent(first, second, result) | 比较两个笛卡尔并计算包含所提供笛卡尔最大成分的笛卡尔。 |
Cesium.Cartesian3.maximumComponent(cartesian) | 计算所提供笛卡尔坐标系的最大分量的值 |
Cesium.Cartesian3.midpoint(left, right, result) | 计算右笛卡尔和左笛卡尔之间的中点 |
Cesium.Cartesian3.minimumByComponent(first, second, result) | 比较两个笛卡尔并计算包含所提供笛卡尔的最小分量的笛卡尔 |
Cesium.Cartesian3.minimumComponent(cartesian) | 计算所提供笛卡尔坐标系的最小分量的值 |
Cesium.Cartesian3.mostOrthogonalAxis(cartesian, result) | 返回与提供的笛卡尔坐标最正交的轴 |
Cesium.Cartesian3.multiplyByScalar(cartesian, scalar, result) | 将提供的笛卡尔分量乘以提供的标量 |
Cesium.Cartesian3.multiplyComponents(left, right, result) | 计算两个笛卡尔的分量积 |
Cesium.Cartesian3.normalize(cartesian, result) | 计算所提供笛卡尔的规范化形式 |
Cesium.Cartesian3.pack(value, array, startingIndex) | 将提供的实例存储到提供的数组中 |
Cesium.Cartesian3.projectVector(a, b, result) | 将向量a投影到向量b上 |
Cesium.Cartesian3.subtract(left, right, result) | 计算两个笛卡尔分量差 |
Cesium.Cartesian3.unpack(array, startingIndex, result) | 从压缩的数组中检索实例 |
Cesium.Cartesian3.unpackArray(array, result) | 将笛卡尔分量数组解包为笛卡尔数组 |
翻译完了,可以看到cesium官方还是给我们搞了很多api给我们用的;
好了,继续我们的问题探讨,我现在已经能画线了,就是要计算距离了.我知道两个经纬度了,通过api,我可以把我知道的经纬度,转换为笛卡尔,然后计算距离;
嗯,这明显算出来的是直线距离;不过这个距离已经出来一个了,剩下的就是贴地距离;继续百度,然后没有百度出来啊