【cesium】 FlyLine飞行漫游路线
cesium FlyLine飞行漫游路线
mars3d.FlyLine是实体类,提供飞行漫游路线控制。
使用示例在后面
一、需求:拿取请求的坐标数据集展示车辆或人员轨迹
1.生成轨迹数据
// 创建生成轨迹数据
function createFlyData (points, modelOptions, loop = true, name = '', speed = 10) {
const trackPoints = []
for (let i = 0; i < points.length; i++) {
// 先将所有坐标转成笛卡尔坐标
let worldPos = convertWorldPos(
{
longitude: Number(points[i].longitude),
latitude: Number(points[i].latitude),
}
)
// 将笛卡尔坐标转成经纬度
let cartographic = window.viewer.scene.globe.ellipsoid.cartesianToCartographic(worldPos)
let lat = mars3d.Cesium.Math.toDegrees(cartographic.latitude)
let lng = mars3d.Cesium.Math.toDegrees(cartographic.longitude)
Object.assign(points[i], { x: lng, y: lat })
trackPoints.push(
{
lng: points[i].x,
lat: points[i].y,
alt: Number(points[i].layer) > 1 ? (Number(points[i].layer) - 1) * 8 : null,
datatime: points[i].datatime
}
)
}
return {
name: name,
clockLoop: loop,
camera: {
type: '',
heading: 0,
pitch: -90,
roll: 0,
distance: 500
},
clampToGround: true,
timeField: 'datatime', // 传入时间字段名称
points: trackPoints,
speed: speed,
showGroundHeight: true,
model: {
show: true,
uri: window.document.location.origin + modelOptions.url,
scale: modelOptions.scale,
color: '#ffff00',
minimumPixelSize: 20,
},
label: {
show: false,
color: '#ffffff',
font_family: '楷体',
font_size: 20,
},
path: {
show: true,
color: '#ffff00',
opacity: 1,
width: 3,
isAll: false
},
clockRange: mars3d.Cesium.ClockRange.CLAMPED
}
}
2.创建飞行轨迹
/**
* 处理车辆数据·
* @param {Array} points 轨迹数据
* @param {String} name 路线名称,无特殊意义
* @param {Number} speed 飞行速度 ,km/h
* @param {String} type 标识位区分人员或车辆
* @return {object}
*/
function createFlyLine (points, name, speed, type) {
return new Promise((resolve) => {
destoryFlyLine()
let createFlyDataRes = createFlyData(points, modelOptions[type], false, name, speed)
flyLine = new mars3d.FlyLine(window.viewer, createFlyDataRes)
startFly(type)
if (flyLine) {
resolve('success')
}
})
}
3.播放轨迹
// 开始播放轨迹并显示popup
function startFly (type) {
flyLine.start()
// 设置视角模式
updateCameraSetting('gs')
// 显示popup
flyLine.popup = {
anchor: [0, -20], // 左右、上下的偏移像素值
timeRender: true, // 实时更新html
html: function () {
const params = flyLine.timeinfo
if (!params) return '即将开始播放轨迹'
let namelabel = type=='car' ? '车牌号' : '姓名'
const html = `<div style="width: 200px">
${namelabel}:${flyLine.name} <br/>
总距离:${flyLine.alllen.toFixed(2)}米 <br/>
总时间:${convertSecondsToTime(flyLine.alltimes / window.viewer.clock.multiplier)} <br/>
剩余时间:${convertSecondsToTime((flyLine.alltimes - params.time) / window.viewer.clock.multiplier)}
</div>`
return html
},
}
window.viewer.mars.popup.show(flyLine, flyLine.property)
}
4.销毁轨迹线及数据
// 销毁轨迹线及数据
function destoryFlyLine () {
if (flyLine) {
window.viewer.mars.popup.close()
flyLine.stop()
flyLine.destroy()
flyLine = null
}
}
5.改变漫游视角
/**
* 改变漫游视角
* @param {String} cameraType 漫游视角类型 自由视角: '', 跟随视角: 'gs', 第一视角: 'dy', 上帝视角: 'sd',
* @return {object}
*/
function updateCameraSetting (cameraType) {
flyLine.updateConfig({
camera: {
type: cameraType
}
});
}
二、使用示例
//flydata数据值可以从“基础项目” 的“飞行漫游”功能界面操作后保存JSON
var flydata = {
"id": "1",
"name": "城市飞行",
"points": [
[117.245989, 31.852285, 100],
[117.246347, 31.834418, 300],
[117.246703, 31.816635, 500]
],
"speed": 100,
"camera": { "type": "gs", "followedX": 50, "followedZ": 10 },
"model": {
"show": true,
"uri": "http://data.marsgis.cn/gltf/mars/zhanji.glb",
"scale": 0.01,
"minimumPixelSize": 100
},
"path": { "show": true, "color": "#ffff00", "opacity": 0.5, "width": 1,"isAll":false },
"interpolation": false, //setInterpolationOptions插值
"shadow": { "show": true, "type": "wall" }
};
flyLine = new mars3d.FlyLine(viewer, flydata);
flyLine.start();
三、flydata 的option参数
Option参数 | 参数类型 | 默认值 | 说明 |
---|---|---|---|
id | String | 0 | 标识路线唯一值,无特殊意义 |
name | String | 路线名称,无特殊意义 | |
points | [[x, y, z],[x, y, z]…] | 路线坐标数组,按坐标路线进行漫游 | |
speed | Number/Array | 飞行速度 ,km/h | |
camera | Object | ·{ "type": "gs", "followedX": 50, "followedZ": 10 }· | 对漫游时空中飞行时的相机视角进行设置,可以设置跟随视角、锁定第一视角等效果 |
shadow | Object | ·{ "show": false, "type": "wall", "color": "#00ff00", "outline": false, "opacity": 0.3 }· | 对漫游时空中飞行时的对地投影显示效果进行配置,支持墙和圆锥 |
interpolation | boolean | false | 是否对路线进行setInterpolationOptions插值 |
interpolationDegree | Number | 2 | 对路线进行插值时的interpolationDegree参数设置 |
clockLoop | boolean | false | 是否结束后继续循环漫游路线 |
showGroundHeight | boolean | false | 是否在label中显示离地高度 |
model | Object | ·{ "show": false, "scale": 1, "minimumPixelSize": 50 }· | 对漫游时显示的gltf模型进行配置,支持Draw中的所有可配置属性 |
label | Object | ·{ "show": false, "color": "#ffffff", "font_family": "楷体", "font_size": 20 }· | 对漫游时显示的文字注记进行配置,支持Draw中的所有可配置属性 |
path | Object | ·{ "show": false, "lineType": "solid", "color": "#3388ff", "opacity": 0.5, "width": 1 }· | 对漫游时显示的轨迹路线进行配置,支持Draw中的所有可配置属性 |
四、实例flyline的属性
属性名 | 类型 | 说明 |
---|---|---|
popup | 设置或获取漫游的模型关联的popup弹窗配置 | |
info | objcet 只读 | 获取实时的漫游点信息,包含:已飞行时间time,已飞行距离len,所在坐标x、y、z |
position | Cartesian3 只读 | 当前实时坐标位置 |
hdr | HeadingPitchRoll | 获取当前实时hdr方向信息 |
orientation | Quaternion | 获取当前实时orientation方向信息 |
matrix | Matrix4 | 获取当前实时矩阵信息 |
五、实例flyline的方法
方法名 | 返回值 | 说明 |
---|---|---|
start(function onEnd ) | void | 开始漫游 |
pause() | void | 暂停漫游 |
proceed() | void | 继续漫游 |
stop() | void | 停止漫游 |
centerAt() | void | 相机视角定位至路线矩形范围内 |
clampToGround(function onEnd,Object opts? ) | void | 贴地漫游时,计算并生成贴地路线,opts控制参数:has3dtiles是否贴模型,splitNum插值次数,//贴地时,异步计算完成后开始flyLine.clampToGround(function () { flyLine.start();}, { has3dtiles: true }); //has3dtiles为true时贴模型表面 |
updateStyle(FlyLine Options params) | void | 更新参数,支持Options所有值 |
updateAngle( boolean isAuto, object opts) | void | 更新角度(opts支持heading, pitch, roll),isAuto时基于移动位置自动计算方位 |
toGeoJSON() | Object | 生成json格式规范的路线数据,与传入Flyline时的options是一致的。 |
toCZML() | Object | 生成CZML格式规范的路线数据。 |
destroy() | void | 释放所有资源 |
洗尽铅华始见金,褪去浮华归本真
分类:
Cesium
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现