CESIUM 剖面分析实现

/*
 * @Author: Wang JianLei 
 * @Date: 2020-04-08 10:55:43 
 * @Last Modified by: Wang JianLei
 * @Last Modified time: 2020-04-20 09:49:37
 */
 
//剖面分析
/******************************************* **
剖面分析直接调用Profile()即可,左键画线,右键停止
createProfileChart()方法绘制剖面图
** ****************************************** */
var Profile = function () {
    var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene._imageryLayerCollection);
    var positions = [];
    var positionsCartographic = [];
    var positions_Inter = [];
    var poly = null;
    var distance = 0;
    var cartesian = null;
    var floatingPoint;
    var DistanceArray = [];
 
    var profileItem = [];
 
    let $menuBox = $('#SideBar');
    let outerW = $menuBox.outerWidth();
    handler.setInputAction(function (movement) {
        movement.endPosition.x = movement.endPosition.x - outerW;
        cartesian = viewer.scene.pickPosition(movement.endPosition);
        if (positions.length >= 2) {
            if (!Cesium.defined(poly)) {
                poly = new PolyLinePrimitive(positions);
            } else {
                positions.pop();
                positions.push(cartesian);
            }
        }
    }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
 
    handler.setInputAction(function (movement) {
        movement.position.x = movement.position.x - outerW;
        cartesian = viewer.scene.pickPosition(movement.position);
        if (positions.length == 0) {
            positions.push(cartesian.clone());
        }
        positions.push(cartesian);
        if (poly) {
            //进行插值计算
            interPoints(poly.positions);
            distance = getSpaceDistance(positions_Inter);
        } else {
            distance = getSpaceDistance(positions);
        }
        var textDisance = distance + "米";
        DistanceArray.push(distance);
        floatingPoint = viewer.entities.add({
            position: positions[positions.length - 1],
            point: {
                pixelSize: 5,
                color: Cesium.Color.RED,
                outlineColor: Cesium.Color.WHITE,
                outlineWidth: 2,
                heightReference: Cesium.HeightReference.NONE
            },
            label: {
                text: textDisance,
                font: '18px sans-serif',
                fillColor: Cesium.Color.GOLD,
                style: Cesium.LabelStyle.FILL_AND_OUTLINE,
                outlineWidth: 2,
                verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
                pixelOffset: new Cesium.Cartesian2(20, -20),
                heightReference: Cesium.HeightReference.NONE
            }
        });
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
 
    handler.setInputAction(function (movement) {
        handler.destroy();//关闭事件句柄
        positions.pop();//最后一个点无效
        createProfileChart(profileItem);
    }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
 
    var PolyLinePrimitive = (function () {
        function _(positions) {
            this.options = {
                polyline: {
                    show: true,
                    positions: [],
                    material: Cesium.Color.CHARTREUSE,
                    width: 2,
                    clampToGround: true
                }
            };
            this.positions = positions;
            this._init();
        }
        _.prototype._init = function () {
            var _self = this;
            var _update = function () {
                return _self.positions;
            };
            //实时更新polyline.positions
            this.options.polyline.positions = new Cesium.CallbackProperty(_update, false);
            viewer.entities.add(this.options);
        };
        return _;
    })();
 
    //空间两点距离计算函数
    function getSpaceDistance(positions) {
        profileItem = [
            {
                point: cartesian3ToDegrees(positions[0]),
                distance: 0
            }
        ];
        var distance = 0;
        for (var i = 0; i < positions.length - 1; i++) {
 
            var point1cartographic = Cesium.Cartographic.fromCartesian(positions[i]);
            var point2cartographic = Cesium.Cartographic.fromCartesian(positions[i + 1]);
            /**根据经纬度计算出距离**/
            var geodesic = new Cesium.EllipsoidGeodesic();
            geodesic.setEndPoints(point1cartographic, point2cartographic);
            var s = geodesic.surfaceDistance;
            //返回两点之间的距离
            s = Math.sqrt(Math.pow(s, 2) + Math.pow(point2cartographic.height - point1cartographic.height, 2));
            distance = distance + s;
            var m_Item = {
                point: cartesian3ToDegrees(positions[i + 1]),
                distance: distance
            };
            profileItem.push(m_Item);
        }
        return distance.toFixed(2);
    }
 
    //线段插值点
    function interPoints(positions) {
        positionsCartographic = [];
        var terrainSamplePositions = [];
        for (let index = 0; index < positions.length - 1; index++) {
            const element = positions[index];
            var ellipsoid = viewer.scene.globe.ellipsoid;
            var cartographic = ellipsoid.cartesianToCartographic(element);
            positionsCartographic.push(cartographic);
        }
        for (let i = 0; i < positionsCartographic.length; i++) {
            const m_Cartographic0 = positionsCartographic[i];
            const m_Cartographic1 = positionsCartographic[i + 1];
            if (m_Cartographic1) {
                var a = Math.abs(m_Cartographic0.longitude - m_Cartographic1.longitude) * 10000000;
                var b = Math.abs(m_Cartographic0.latitude - m_Cartographic1.latitude) * 10000000;
                //等距采样
                if (a > b) b = a;
                var length = parseInt(b / 2);
                if (length > 1000) length = 1000;
                if (length < 2) length = 2;
                // var length = 4;//等分采样
                for (var j = 0; j < length; j++) {
                    terrainSamplePositions.push(
                        new Cesium.Cartographic(
                            Cesium.Math.lerp(m_Cartographic0.longitude, m_Cartographic1.longitude, j / (length - 1)),
                            Cesium.Math.lerp(m_Cartographic0.latitude, m_Cartographic1.latitude, j / (length - 1))
                        )
                    );
                }
                terrainSamplePositions.pop();
            } else {
                terrainSamplePositions.push(m_Cartographic0);
            }
        }
        positions_Inter = [];
        for (var n = 0; n < terrainSamplePositions.length; n++) {
            //地理坐标(弧度)转经纬度坐标
            var m_cartographic = terrainSamplePositions[n];
            var height = viewer.scene.globe.getHeight(m_cartographic);
            var point = Cesium.Cartesian3.fromDegrees(m_cartographic.longitude / Math.PI * 180, m_cartographic.latitude / Math.PI * 180, height);
            positions_Inter.push(point);
        }
    }
};
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cesium剖面分析是一种利用离子轨迹法研究材料剖面结构的分析方法。在这个过程中,通过将样品暴露于一个具有较高能量的离子束中,离子束会与样品表面的原子发生相互作用,引起剖面的改变。剖面形成过程中会发生离子在材料中的输运和沉积,从而形成一个复杂的剖面结构。 cesium剖面分析的原理是通过控制离子辐照能量、剂量和离子束的角度等参数,以及利用离子或电子束扫描进行表征和分析。具体而言,离子束轰击样品表面后,会发生离子表面相互作用、散射和快速输运等过程,从而形成剖面结构。这个过程可以通过离子束激发发射光谱(IBED)、离子退火和电子显微镜等技术进行表征和分析。 在cesium剖面分析中,常用的表征技术有二次离子质谱(SIMS)、弹性反冲离子散射(ERD)、能量分散X射线光谱(EDX)和透射电子显微镜等。这些技术可以提供样品剖面的元素分布、化学组成和晶体结构等信息,从而帮助研究人员了解材料的结构、性能和性质。 通过cesium剖面分析,可以研究材料的界面、薄膜、气敏性、杂质分布、化学反应机制等问题。这对于材料科学和表面化学的研究具有重要意义。同时,cesium剖面分析也广泛应用于半导体、光电子器件、电池、涂层材料、生物材料等领域的研究和开发中。 总之,cesium剖面分析是一种重要的材料剖面结构分析方法,可以通过离子束的辐照和相关表征技术,提供材料的剖面元素分布、化学组成和晶体结构等信息,有助于研究人员深入了解材料的结构和性能特点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值