/*
* 创建自由线
* @Author: Wang jianLei
* @Date: 2022-04-16 21:49:57
* @Last Modified by: Wang JianLei
* @Last Modified time: 2022-04-20 14:04:45
*/
import CreateRemindertip from "./ReminderTip";
const Cesium = window.Cesium;
const CreateFreeLine = function (viewer, resultList, options, callback) {
if (!viewer) throw new Error("no viewer object!");
options = options || {};
let id = options.id || setSessionid();
if (viewer.entities.getById(id))
throw new Error("the id parameter is an unique value");
let color = options.color || Cesium.Color.RED;
let width = options.width || 2;
const handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
let toolTip = "左键点击开始绘制";
let anchorpoints = [];
let polyline = undefined;
handler.setInputAction(function (event) {
toolTip = "右键结束绘制";
if (Cesium.defined(polyline)) {
return;
}
let pixPos = event.position;
let cartesian = getCatesian3FromPX(viewer, pixPos);
if (anchorpoints.length == 0) {
anchorpoints.push(cartesian);
anchorpoints.push(cartesian);
}
polyline = viewer.entities.add({
name: "FreeLine",
id: id,
polyline: {
positions: new Cesium.CallbackProperty(function () {
return anchorpoints;
}, false),
width: width,
material: color,
},
});
polyline.GeoType = "FreeLine";
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
handler.setInputAction(function (movement) {
let endPos = movement.endPosition;
CreateRemindertip(toolTip, endPos, true);
if (anchorpoints.length > 1) {
let cartesian = getCatesian3FromPX(viewer, endPos);
anchorpoints.push(cartesian);
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
handler.setInputAction(function (event) {
polyline.pottingPoint = anchorpoints;
resultList.push(polyline);
handler.destroy();
CreateRemindertip(toolTip, event.position, false);
if (typeof callback == "function") callback(polyline);
}, Cesium.ScreenSpaceEventType.RIGHT_DOWN);
};
function getCatesian3FromPX(viewer, px) {
let picks = viewer.scene.drillPick(px);
let cartesian = null;
let isOn3dtiles = false,
isOnTerrain = false;
// drillPick
for (let i in picks) {
let pick = picks[i];
if (
(pick && pick.primitive instanceof Cesium.Cesium3DTileFeature) ||
(pick && pick.primitive instanceof Cesium.Cesium3DTileset) ||
(pick && pick.primitive instanceof Cesium.Model)
) {
//模型上拾取
isOn3dtiles = true;
}
// 3dtilset
if (isOn3dtiles) {
viewer.scene.pick(px);
cartesian = viewer.scene.pickPosition(px);
if (cartesian) {
let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
if (cartographic.height < 0) cartographic.height = 0;
let lon = Cesium.Math.toDegrees(cartographic.longitude),
lat = Cesium.Math.toDegrees(cartographic.latitude),
height = cartographic.height;
cartesian = transformWGS84ToCartesian(viewer, {
lng: lon,
lat: lat,
alt: height,
});
}
}
}
// 地形
let boolTerrain =
viewer.terrainProvider instanceof Cesium.EllipsoidTerrainProvider;
// Terrain
if (!isOn3dtiles && !boolTerrain) {
let ray = viewer.scene.camera.getPickRay(px);
if (!ray) return null;
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
isOnTerrain = true;
}
// 地球
if (!isOn3dtiles && !isOnTerrain && boolTerrain) {
cartesian = viewer.scene.camera.pickEllipsoid(
px,
viewer.scene.globe.ellipsoid
);
}
if (cartesian) {
let position = transformCartesianToWGS84(viewer, cartesian);
if (position.alt < 0) {
cartesian = transformWGS84ToCartesian(viewer, position, 0.1);
}
return cartesian;
}
return false;
}
/***
* 坐标转换 84转笛卡尔
* @param {Object} {lng,lat,alt} 地理坐标
* @return {Object} Cartesian3 三维位置坐标
*/
function transformWGS84ToCartesian(viewer, position, alt) {
return position
? Cesium.Cartesian3.fromDegrees(
position.lng || position.lon,
position.lat,
(position.alt = alt || position.alt),
Cesium.Ellipsoid.WGS84
)
: Cesium.Cartesian3.ZERO;
}
/***
* 坐标转换 笛卡尔转84
* @param {Object} Cartesian3 三维位置坐标
* @return {Object} {lng,lat,alt} 地理坐标
*/
function transformCartesianToWGS84(viewer, cartesian) {
let ellipsoid = Cesium.Ellipsoid.WGS84;
let cartographic = ellipsoid.cartesianToCartographic(cartesian);
return {
lng: Cesium.Math.toDegrees(cartographic.longitude),
lat: Cesium.Math.toDegrees(cartographic.latitude),
alt: cartographic.height,
};
}
function setSessionid(num) {
let len = num || 32;
let chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";
let maxPos = chars.length;
let pwd = "";
for (let i = 0; i < len; i++) {
pwd += chars.charAt(Math.floor(Math.random() * maxPos));
}
return pwd;
}
export default CreateFreeLine;
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于Cesium+VUE实现的态势标绘之自由线功能,完整demo和源代码,代码未加密/未压缩,可直接调用运行 文章描述:https://blog.csdn.net/qq_34205305/article/details/124291432 代码不易,略收小费,使用过程中如果有任何问题欢迎在文章下进行评论或者私信,百分百回复哦
资源推荐
资源详情
资源评论


























收起资源包目录





共 4 条
- 1


总要学点什么
- 粉丝: 978
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 5种ceemdan组合时间序列预测模型Python代码(包括ceemdan-lstm、ceemdan-cnn-lstm等)
- 江苏移动通信有限责任公司员工绩效考核实施细则精.doc
- 最新国家开放大学电大《优秀广告作品评析答案》网络核心课形考网考作业.docx
- 工程项目管理计划书.doc
- 基于PLC双轴位置控制.docx
- 基于复矢量PI控制器的模型参考自适应三相永磁同步电机高速低载波比无速度传感器控制仿真研究 - MATLAB 宝典
- 第8章-网络营销的策略组合.ppt
- (源码)基于NodeMCU的可视化通知提醒系统.zip
- 系统集成测试(SIT)报告.docx
- 基于MATLAB的GMSK系统的设计仿真.doc
- 离心风机辐射噪声仿真分析:从结构模态到声源辐射噪声的全流程解析 · 辐射噪声 深度版
- 专题讲座资料(2021-2022年)大工秋Java程序设计在线作业.docx
- (源码)基于Arduino的EDeliveryRobot.zip
- Comsol光子晶体仿真技术:拓扑荷、偏振态、三维能带及Q因子计算
- 基于非支配排序的多目标鱼鹰优化算法求解柔性作业车间调度问题的MATLAB实现
- (源码)基于多种编程语言和框架的物联网服务器与客户端.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

- 1
- 2
前往页