Cesium開(kāi)發(fā):簡(jiǎn)單箭頭畫(huà)法
在mapbox-gl上,可以借助turf.js實(shí)現(xiàn)簡(jiǎn)單箭頭的畫(huà)法,Cesium調(diào)用本身的api,同樣能夠?qū)崿F(xiàn)箭頭的畫(huà)法。
實(shí)現(xiàn)的方式,也是先計(jì)算兩個(gè)點(diǎn)相對(duì)于北向的角度,再根據(jù)角度計(jì)算一定距離的點(diǎn)坐標(biāo),從而達(dá)到實(shí)現(xiàn)箭頭的效果。
Cesium計(jì)算相對(duì)于北向的角度,是根據(jù)矩陣來(lái)進(jìn)行計(jì)算的,這里參考了網(wǎng)上了一篇博客。
具體的實(shí)現(xiàn)代碼函數(shù):
原文鏈接:
https://blog.csdn.net/zy123698745/article/details/102798042
/**
?* 計(jì)算a點(diǎn)和b點(diǎn)的角度(偏轉(zhuǎn)角)
?* @param lng_a? a點(diǎn)經(jīng)度
?* @param lat_a? a點(diǎn)維度
?* @param lng_b? b點(diǎn)經(jīng)度
?* @param lat_b? b點(diǎn)維度
?* @returns 角度
?*/
function courseAngle(lng_a, lat_a, lng_b, lat_b) {
//以a點(diǎn)為原點(diǎn)建立局部坐標(biāo)系(東方向?yàn)閤軸,北方向?yàn)閥軸,垂直于地面為z軸),得到一個(gè)局部坐標(biāo)到世界坐標(biāo)轉(zhuǎn)換的變換矩陣
var localToWorld_Matrix =?
Cesium.Transforms.eastNorthUpToFixedFrame(new Cesium.Cartesian3.fromDegrees(lng_a, lat_a));
//求世界坐標(biāo)到局部坐標(biāo)的變換矩陣
var worldToLocal_Matrix =?
Cesium.Matrix4.inverse(localToWorld_Matrix, new Cesium.Matrix4());? ??
//a點(diǎn)在局部坐標(biāo)的位置,其實(shí)就是局部坐標(biāo)原點(diǎn)
? var localPosition_A =?
Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix,
new Cesium.Cartesian3.fromDegrees(lng_a, lat_a),
new Cesium.Cartesian3());
?//B點(diǎn)在以A點(diǎn)為原點(diǎn)的局部的坐標(biāo)位置
var localPosition_B =?
Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix,
new Cesium.Cartesian3.fromDegrees(lng_b, lat_b),
new Cesium.Cartesian3());
??//弧度
var angle =
Math.atan2((localPosition_B.y-localPosition_A.y),?
(localPosition_B.x-localPosition_A.x))
?//角度
?var theta = angle*(180/Math.PI);
?if (theta < 0) {
? ?? theta = theta + 360;
??}
return theta;
}
不過(guò),上邊計(jì)算的是對(duì)應(yīng)于x軸的角度,也就是相對(duì)于東邊方向的角度,換算成相對(duì)偏北的角度,需要減去90度。
已知點(diǎn),根據(jù)角度和距離,計(jì)算另一個(gè)點(diǎn),同樣是參照官方的矩陣計(jì)算方式。//_ca_coord是Cesium? Cartesian3 坐標(biāo)//local_coord是相對(duì)于當(dāng)前坐標(biāo)的偏移米數(shù)//返回值可以是Cartesian3?坐標(biāo),也可以是經(jīng)緯度坐標(biāo)
? function?ComputeLngLat(_ca_coord,?local_coord)?{
? ? ?//同樣是建立局部坐標(biāo)系
????const?_localToWorld_Matrix?=?Cesium.Transforms.eastNorthUpToFixedFrame(_ca_coord);
//根據(jù)偏移的三個(gè)方向距離,計(jì)算新的坐標(biāo)點(diǎn)
????const?_new_ca?=?Cesium.Matrix4.multiplyByPoint(_localToWorld_Ma trix,?Cesium.Cartesian3.fromElements(local_coord[1],?local_coord[0],?local_coord[2]),?new?Cesium.Cartesian3());
? ??//返回不同的坐標(biāo)類型,自由控制
????return?_new_ca;
????return?Cesium.Cartographic.fromCartesian(_new_ca);
? ? ?}
計(jì)算出兩個(gè)點(diǎn)的北向偏移角,根據(jù)箭頭所要偏移的角度和米數(shù),通過(guò)三角函數(shù)sin和cos,計(jì)算出x方向和y方向的偏移距離,調(diào)用函數(shù),就能計(jì)算出新的點(diǎn)位置,將點(diǎn)連接成線,就能實(shí)現(xiàn)簡(jiǎn)單箭頭的效果。