首页 > 其他分享 >Cesium 比较常用的几个方法

Cesium 比较常用的几个方法

时间:2024-09-15 10:04:04浏览次数:7  
标签:常用 number param lat let Cesium lng 方法

根据经纬度获取高程

/**
 * 根据经纬度获取高程
 * @param { mars3d.Map } map 
 * @param {number} lng 
 * @param {number} lat 
 */
async function getHeightByLngLat(map, lng, lat) {
    if (!lng || !lat) return undefined;
    let positions = [
        Cesium.Cartographic.fromDegrees(lng, lat)
    ];
    await Cesium.sampleTerrainMostDetailed(map.viewer.terrainProvider, positions).catch(err => {
        console.info("根据经纬度获取高程异常", err);
    });
    return positions[0].height;
}

方法二:

/**
 * 根据经纬度获取高程
 * @param { mars3d.Map } map 
 * @param {number} lng 
 * @param {number} lat 
 */
async function getHeightByLngLat2(map, lng, lat) {
    if (!lng || !lat) return undefined;
    let positions = [
        Cesium.Cartographic.fromDegrees(lng, lat)
    ];
    await map.viewer.scene.sampleHeightMostDetailed(positions).catch(err => {
        console.info("根据经纬度获取高程异常", err);
    });
    return positions[0].height;
}

拾取经纬度

/**
 * 拾取经纬度
 * @param { Cesium.Cartesian3 } position 
 * @param { mars3d.Map } map 
 * @returns
 */
function pickLngLat(position, map) {
    let cartesian = map.viewer.camera.pickEllipsoid(
        position,
        map.viewer.scene.globe.ellipsoid
    );
    if (!cartesian) return undefined;
    let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
    let lng = Cesium.Math.toDegrees(cartographic.longitude);
    let lat = Cesium.Math.toDegrees(cartographic.latitude);
    return { lng, lat };
}

根据经纬度、方向、距离,计算另一个点的经纬度坐标

/**
 * 根据经纬度、方向、距离,计算另一个点的经纬度坐标
 * @param { number } lng 经度
 * @param { number } lat 纬度
 * @param { number } angle 方向角度
 * @param { number } length 距离(单位:米)
 * @returns 
 */
function getNextPosition(lng, lat, angle, length) {
    let cartesian3 = Cesium.Cartesian3.fromDegrees(lng, lat);
    let transform = Cesium.Transforms.eastNorthUpToFixedFrame(cartesian3);
    let matrix3 = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(angle || 0));
    let rotationZ = Cesium.Matrix4.fromRotationTranslation(matrix3);
    Cesium.Matrix4.multiply(transform, rotationZ, transform);
    let result = Cesium.Matrix4.multiplyByPoint(transform, new Cesium.Cartesian3(0, length, 0), new Cesium.Cartesian3());
    return result;
}

世界坐标转经纬度

/**
 * 世界坐标转经纬度
 * @param { mars3d.Map } map 
 * @param { Cesium.Cartesian3 } cartesian3 
 */
function toDegrees(map, cartesian3) {
    // 世界坐标转换为弧度
    let ellipsoid = map.scene.globe.ellipsoid;
    let cartographic = ellipsoid.cartesianToCartographic(cartesian3);

    // 弧度转换为经纬度
    let lng = Cesium.Math.toDegrees(cartographic.longitude);  // 经度
    let lat = Cesium.Math.toDegrees(cartographic.latitude);   // 纬度
    let alt = cartographic.height;	// 高度

    return { lng, lat, alt }
}

计算经纬度直线距离

/**
 * 计算经纬度直线距离(单位:米)
 * @param { { lng:number, lat:number } } position1 位置1
 * @param { { lng:number, lat:number } } position2 位置2
 * @returns { number } 距离(单位:米)
 */
function calcDistance(position1, position2) {
    let from = turf.point([position1.lng, position1.lat]);
    let to = turf.point([position2.lng, position2.lat]);
    let options = { units: 'kilometers' };

    let distance = turf.distance(from, to, options);
    return distance * 1000;
}

二分查找并计算position

根据航迹数据(时间点和坐标信息集合),查找某个时间点对应的坐标。

/**
 * 二分查找并计算position
 * @param { dayjs } time 时间
 * @param { [{ time:string, lng:number, lat:number, height:number }] } positions 坐标集合
 * @returns { { time:string, lng:number, lat:number, height:number } }
 */
function findPosition(time, positions) {
    let left = 0;
    let right = positions.length - 1;
    let leftPosition = positions[left];
    let rightPosition = positions[right];
    let leftTime = string2Dayjs(leftPosition.time);
    let rightTime = string2Dayjs(rightPosition.time);

    if (time.valueOf() < leftTime.valueOf() || time.valueOf() > rightTime.valueOf()) {
        return undefined;
    }

    while (left <= right) {
        let middle = Math.floor((left + right) / 2);
        let middlePosition = positions[middle];
        let middleTime = string2Dayjs(middlePosition.time);
        let heading = undefined;
        let pitch = undefined;
        let roll = undefined;

        if (time.valueOf() === leftTime.valueOf()) {
            return leftPosition;
        } else if (time.valueOf() === middleTime.valueOf()) {
            return middlePosition;
        }
        else if (time.valueOf() === rightTime.valueOf()) {
            return rightPosition;
        }
        else {
            if (time.valueOf() < middleTime.valueOf()) {
                right = middle;
                rightPosition = positions[right];
                rightTime = string2Dayjs(rightPosition.time);

            } else {
                left = middle;
                leftPosition = positions[left];
                leftTime = string2Dayjs(leftPosition.time);
            }

            if (right - left == 1) {
                let ratio = (time.valueOf() - leftTime.valueOf()) / (rightTime.valueOf() - leftTime.valueOf());
                let lng = leftPosition.lng + (rightPosition.lng - leftPosition.lng) * ratio;
                let lat = leftPosition.lat + (rightPosition.lat - leftPosition.lat) * ratio;
                let height = leftPosition.height + (rightPosition.height - leftPosition.height) * ratio;
                if (leftPosition.heading && rightPosition.heading) {
                    heading = leftPosition.heading + (rightPosition.heading - leftPosition.heading) * ratio;
                }
                if (leftPosition.pitch && rightPosition.pitch) {
                    pitch = leftPosition.pitch + (rightPosition.pitch - leftPosition.pitch) * ratio;
                }
                if (leftPosition.roll && rightPosition.roll) {
                    roll = leftPosition.roll + (rightPosition.roll - leftPosition.roll) * ratio;
                }

                // 计算速度
                let distance = calcDistance({ lng: leftPosition.lng, lat: leftPosition.lat }, { lng: rightPosition.lng, lat: rightPosition.lat });
                let deltaTime = (rightTime.valueOf() - leftTime.valueOf()) / 1000;
                let speed = distance / deltaTime;

                return {
                    time: time.format('YYYY-MM-DD HH:mm:ss.SSS'),
                    lng,
                    lat,
                    height,
                    heading,
                    pitch,
                    roll,
                    speed,
                }
            } else if (right - left == 0) {
                return undefined;
            }
        }
    }
}

标签:常用,number,param,lat,let,Cesium,lng,方法
From: https://www.cnblogs.com/s0611163/p/18414992

相关文章

  • k8s常用指令续:
    3.命名空间[root@k8s-masterpods]#kubectlcreatenamespaceabc    //创建命名空间namespace/abccreated[root@k8s-masterpods]#kubectlgetnamespaces        //查看命名空间NAME         STATUS AGEabc   ......
  • 测试用例设计方法
    一、什么是测试用例?测试用例主要是测试人员整理的一组文档,具体记录软件功能测试的输入和预期输出,描述测试场景。二、测试用例包含哪些内容包括用例编号、测试模块,用例名称、前置条件、优先级、测试步骤、预期结果,实际结果,执行人,测试时间,备注。三、测试用例设计方法可以从......
  • 4.Java面向对象第四章方法重写与多态
    4.Java面向对象第四章方法重写与多态文章目录4.Java面向对象第四章方法重写与多态一、方法重写二、Object三、类型转换四、抽象一、方法重写1.在子类与父类之间2.方法名相同3.参数个数和类型相同5.访问权限不能严于父类二、Objectobject类是超类(基类)Java中......
  • 【python版】示波器输出的csv文件(时间与电压数据)如何转换为频率与幅值【方法②】
    要将示波器输出的CSV文件中包含的时间与电压数据转换为频率与幅值数据,你可以按照以下步骤进行处理。这里假设你的数据是一个周期性信号,可以通过傅里叶变换来实现这种转换。1、准备数据①导入CSV文件首先,使用Python、Excel或任何数据处理工具导入你的CSV文件。CSV文件中应该......
  • 声波的波数,通常用k表示
    声波的波数(通常用k表示)是描述声波空间变化的一个参数,它与声波的频率和介质中的传播速度有关。波数k 是一个具体值,并且在均匀介质中它是固定的,计算公式如下:均匀介质中的波数是一个具体值,对于某个频率的声波,波数k 只取决于该声波的频率f和介质中的声速c。例如,在空气......
  • 读构建可扩展分布式系统:方法与实践04应用服务
    1. 应用服务1.1. 任何系统的核心都在于实现应用需求的特定业务逻辑1.2. 服务是可扩展软件系统的核心1.2.1. 它们将契约定义为一个API,向客户端声明它们的能力1.3. 应用服务器高度依赖于编程语言,但通常都会提供多线程编程模型,允许服务同时处理许多请求1.4. 多服务配置......
  • PyCharm修改背景颜色、修改字体大小+Python常用快捷键+Python常见的运算符
    文章目录PyCharm软件的使用1.修改背景颜色和字体大小1.1修改背景颜色1.2修改字体大小2.常用的快捷键3.常见的运算符3.1算术运算符3.2赋值运算符3.3比较运算符3.4逻辑运算符PyCharm软件的使用1.修改背景颜色和字体大小1.1修改背景颜色1.2修改字体大......
  • 基础python超级常用的四种可视化函数库
    可视化的概念可视化是指将数据或信息转换为图形表示形式的过程,以便更容易理解和分析。通过可视化,可以将复杂的概念、大量数据或抽象信息转化为直观的图形,使人们能够更快地洞察数据中的模式、趋势和异常情况。数据可视化是数据科学、统计学、信息设计等多个领域的交叉学科,它不......
  • 常用的ADB命令
    ADB(AndroidDebugBridge)是一种功能强大的命令行工具,用于与Android设备进行通信和调试,这里来总结一下常用的ADB命令:一、常用的命令1.连接与设备管理adbdevices列出已连接的设备及其状态。adbconnect<IP地址>:<端口号>通过网络连接设备,适用于无线调试。adbdiscon......
  • 章13——常用类——包装类,Integer类
    包装类ctrl+b可以跳转源代码。char和boolean的继承体系:包装类和基本数据的转换//装箱intn=200;Integerinteger=n;//拆箱intn1=integer;包装类练习题三元运算符中是一个整体,其中精度最高的是double,所以无......