BIGEMAP卫星地图_高清卫星地图_北斗高清地图_地图软件_矢量地图数据_专题地图

顯示源代碼
衛星軌跡
 開發文檔
            <html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link  rel='stylesheet' />
    <script src='http://ua.bigemap.com:30081/bmsdk/bigemap-gl.js/v1.1.0/bigemap-gl.js'></script>
    <script src="/offline_data/satellite.min.js"></script>

    <title>衛星軌跡</title>
</head>
<style type="text/css">
    * {
        padding: 0;
        margin: 0;
    }

    html,
    body,
    #map {
        width: 100%;
        height: 100%;
    }
    #result {
        width: 150px;
        height: 120px;
        border-radius: 5px;
        background: rgba(255, 255, 255, 0.6);
        font-size: 12px;
        user-select: none; /*禁止選中*/
        pointer-events: none; /*鼠標穿透*/
        line-height: 20px;
    }
    #result div {
        margin-left: 10px;
    }
</style>

<body>
    <div id="map"></div>
    <div id="result">
        <div class="name">0</div>
        <div class="mylat">0</div>
        <div class="mylng">0</div>
        <div class="myheight">0</div>
        <div class="Per-second">0</div>
        <div class="Omni-hora">0</div>
    </div>
</body>

</html>
<script src="/offline_data/3d_div.min.js"></script>
<script type="text/javascript">
    window.onload = function () {
        getTLE()
    }
    bmgl.Config.HTTP_URL = 'http://ua.bigemap.com:30081/bmsdk/';
    var viewer = new bmgl.Viewer('map', { mapId: 'bigemap.dc-satellite' });

    var dom = document.getElementById('result')

    var val = {
      viewer: viewer,
      position: [104, 30],
      height: 0,
      offset: [0, -130],
      dom
    }
    var layer = new divLabel(val)
    layer.toggleShow(false)


    var data = [
        {
            name: 'THOR ABLE R/B',
            tleLine1: '1 00037U 60005  D 61074.65882873  .00039007 +00000-0 +00000-0 0  9995',
            tleLine2: '2 00037 064.8899 343.2411 0198403 333.4201 027.0840 15.49800338046906'
        },
        {
            name: 'SL-3 R/B',
            tleLine1: '1 00035U 60005 B 60198.16679572 .03271057 +00000-0 +00000-0 0 9991',
            tleLine2: '2 00035 064.8899 044.6976 0000000 036.3819 323.6180 16.27523673009903'
        },
        {
            name: 'MIDAS 2 DEB',
            tleLine1: '1 00044U 60006  B 60339.48320007  .05617416 +00000-0 +00000-0 0  9995',
            tleLine2: '2 00044 033.0000 103.1687 0000000 237.9085 122.0914 16.16822545029905'
        },
        {
            name: 'SPUTNIK 4 DEB',
            tleLine1: '1 00041U 60005  H 60213.55741600  .00877296 +00000-0 +00000-0 0  9995',
            tleLine2: '2 00041 064.8899 009.0399 0041880 060.9395 299.2735 15.87027825012009'
        },
        {
            name: 'DELTA 1 R/B',
            tleLine1: '1 00050U 60009B   24142.92633053 -.00000094  00000-0 -94502-4 0  9993',
            tleLine2: '2 00050  47.2345 349.0820 0113206 280.9957  77.8117 12.20140331845365'
        },

    ]
    function getTLE () {
        viewer.clock.shouldAnimate = true
        // satlliteTest(data)
        data.forEach(item => {
            satlliteTest(item.tleLine1, item.tleLine2, item.name)
        })
    }



    // 計算速度
    function calculateSpeed(velocityObject) {
        // 假設velocityObject是一個包含{vx: ..., vy: ..., vz: ...}的對象  
        const vx = velocityObject.x;
        const vy = velocityObject.y;
        const vz = velocityObject.z;

        // 計算速度模(大?。? 
        const speed = Math.sqrt(vx * vx + vy * vy + vz * vz);

        return speed;
    }


    var handler = new bmgl.ScreenSpaceEventHandler(viewer.scene.canvas);
    var state = false
    var mysatellite = null
    handler.setInputAction(function(e) {
        var entity = viewer.scene.pick(e.endPosition);

        if (bmgl.defined(entity)) {
            mysatellite = entity.id
            state = true
            entity.id.label.show = false

            dom.querySelector('.name').innerText = entity.id.label.text.getValue()

            layer.toggleShow(true);
        } else {
            state = false
            if(mysatellite) {
                mysatellite.label.show = true
                mysatellite = null
            }
            layer.toggleShow(false);
        }


    }, bmgl.ScreenSpaceEventType.MOUSE_MOVE)

    viewer.clock.onTick.addEventListener((clock) => {
        if(mysatellite) {
            let satrec = mysatellite.satrec
            var positionAndVelocity = satellite.propagate(satrec, new Date());
            let positionEci = positionAndVelocity.position
            var cartesian3 = new bmgl.Cartesian3(positionEci.x * 1000, positionEci.y * 1000, positionEci.z * 1000)
            layer.changePosition(cartesian3)

            let latlngs = transform(cartesian3)
            dom.querySelector('.mylat').innerText = '緯度:' + latlngs[1].toFixed(2) + '°'
            dom.querySelector('.mylng').innerText = '經度:' + latlngs[0].toFixed(2) + '°'
            dom.querySelector('.myheight').innerText = '高度:' + (latlngs[2] / 1000).toFixed(2) + ' km'

            let speed = calculateSpeed(positionAndVelocity.velocity)
            dom.querySelector('.Per-second').innerText = '速度:' + speed.toFixed(2) + ' km/s'
            dom.querySelector('.Omni-hora').innerText = "速度:" + (speed * 60 * 60).toFixed(2) + ' km/h'
        }

    });

    function transform (position) {
        let cartographic = bmgl.Cartographic.fromCartesian(position)
        if (cartographic.height < 0) cartographic.height = 0
        let lon = bmgl.Math.toDegrees(cartographic.longitude),
            lat = bmgl.Math.toDegrees(cartographic.latitude),
            height = cartographic.height
            return [lon, lat, height]
    }

    function satlliteTest(tleLine1, tleLine2, name) {
        var satrec = satellite.twoline2satrec(tleLine1, tleLine2)
        var positionAndVelocity = satellite.propagate(satrec, new Date());
        
        let totalIntervalsInDay = satrec.no * 1440 * 0.159155 //1440 = min && 0.159155 = 1turn
        let minsPerInterval = 1440 / totalIntervalsInDay // mins for 1 revolution around earth
        const { startTime, endTime } = getStratEndTime(minsPerInterval)
        viewer.clock.startTime = startTime.clone()
        viewer.clock.endTime = endTime.clone()
        viewer.clock.currentTime = startTime.clone()

        const positionProperty = getPositionSample(satrec, minsPerInterval)
        let str = `${Math.floor(255 * Math.random(0, 1))}, ${Math.floor(255 * Math.random(0, 1))}, ${Math.floor(255 * Math.random(0, 1))}`
        const entity = viewer.entities.add({
            name: '衛星',
            availability: new bmgl.TimeIntervalCollection([
                new bmgl.TimeInterval({
                    start: startTime,
                    stop: endTime
                })
            ]),
            position: positionProperty,
            orientation: new bmgl.VelocityOrientationProperty(positionProperty),
            // 衛星模型
            model: {
                uri: '/offline_data/weixing.glb',
                minimumPixelSize: 128
            },
            label: {
                scale:1,
                fillColor: new bmgl.Color.fromCssColorString(`rgba(${str}, 1)`),
                text: name,
                font: '20px',
                showBackground:false,
                backgroundColor: bmgl.Color.AQUA,
                pixelOffset: new bmgl.Cartesian2(0, -20)
            },
            path: {
                resolution: 1,
                material: new bmgl.PolylineGlowMaterialProperty({
                    color: new bmgl.Color.fromCssColorString(`rgba(${str}, 1)`),
                }),
                width: 10
                // leadTime: 720,
                // trailTime: 720
            }
        })
        // 插值
        entity.position.setInterpolationOptions({
            interpolationDegree: 5,
            interpolationAlgorithm: bmgl.LagrangePolynomialApproximation
        })
        entity.satrec = satrec
    }


    function getStratEndTime(minsPerInterval) {
        const startTimeStamp = Date.now()
        // 結束時間為一圈后的時間
        const endTimeStamp = startTimeStamp + minsPerInterval * 60 * 1000
        let startTime = new bmgl.JulianDate.fromDate(new Date(startTimeStamp))
        startTime = bmgl.JulianDate.addHours(startTime, 8, new bmgl.JulianDate())
        let endTime = new bmgl.JulianDate.fromDate(new Date(endTimeStamp))
        endTime = bmgl.JulianDate.addHours(endTime, 8, new bmgl.JulianDate())
        return {
            startTime,
            endTime
        }
    }
    function getPositionSample(satrec, minsPerInterval) {
        const positionProperty = new bmgl.SampledPositionProperty()
        const now = Date.now()
        for (let i = 0; i <= Math.ceil(minsPerInterval); i++) {
            const curTimeDate = new Date(now + i * 60 * 1000)
            var positionAndVelocity = satellite.propagate(satrec, curTimeDate) // 此方法拿到的是慣性系坐標

            var gmst = satellite.gstime(new Date(curTimeDate))
            const positionEci = positionAndVelocity.position
            const positionEcf = satellite.eciToEcf(positionEci, gmst)
            const curJulianDate = new bmgl.JulianDate.fromDate(curTimeDate)
            const d = new bmgl.JulianDate.addHours(curJulianDate, 8, new bmgl.JulianDate())
            positionProperty.addSample(
                d,
                new bmgl.Cartesian3(positionEci.x * 1000, positionEci.y * 1000, positionEci.z * 1000)
            )
        }
        return positionProperty
    }

</script>        
主站蜘蛛池模板: 磨刀机厂家,全自动磨刀机-山东威海富田磨具 | 永磁变频空压机-无油空压机-螺杆式空压机热能回收-空压机配套-空压机合同能源管理-维修保养-北京斯特兰压缩机有限公司 | 铁行火车票_铁行火车票网上订票_铁行火车票客户端【铁行官网】 | 黑料网 - 黑料大事记-黑料门 黑料社最新 今日黑料 热门黑料 最新反差免费-黑料网今日黑料首页_黑料网 - 黑料大事记-黑料门 黑料社最新 今日黑料 热门黑料 最新反差免费-黑料网今日黑料首页 | 石膏砂浆生产线_特种砂浆生产线_轻质抹灰石膏设备-青岛环港重工科技有限公司 | 型材散热器,电子散热器,插片散热器-镇江市科创电子散热器有限公司 | 商业地产策划_商业地产代理_华锦亿爵商业地产顾问机构 | 洁衣库·U袋洗_网上洗衣店_网上干洗 | 济南德固机械|膨化食品生产线|早餐谷物玉米片生产线|拉丝蛋白生产线|速食米饭生产线 | 河南反渗透设备,河南纯净水设备,河南软化水设备,郑州EDI超纯水设备,郑州水处理设备厂家_河南江宇环保科技有限公司 | 河北瑞峰医疗-河北护理床-河北医用病床-河北养老院护理床-河北护理床厂家-河北病床厂家-河北瑞峰医疗 | 雾度计-雾度仪-透光率测试仪-3nh品牌雾度仪生产厂家 | 模具|数控加工-车床加工-精密数控铣床-东莞市方菱精密模具有限公司专注零件及模具加工 | 洒水车_水车_洒水车价格_喷水车_绿化喷洒车_绿化洒水车- 程力专用汽车股份有限公司 | 宁波公司注册_宁波注册公司_宁波代理记账_宁波做内账|安隆会计专业服务机构 | 上海物流公司_上海冷链运输_空运_电商仓储配送电话-迈泽物流 | 桥梁支座更换_桥梁检测车租赁_高空作业车出租_支座更换_伸缩缝安装_隧道防水_养护加固_维修_出租_衡水庆兴桥梁养护工程有限公司 桥梁养护|桥梁维修加固|隧道裂缝修补|支座更换|管道堵水气囊|衡水众拓路桥养护有限公司 | 上海瀚广科技(集团)有限公司,上海瀚广,瀚广 | 上海塑料链条生产厂家-塑料网带批发-柔性齿形链价格-上海瀚幽传动机械有限公司 | 饲料设备_饲料加工设备_饲料成套加工设备专业提供商-河南杰昌机械设备有限公司 | 行域人才网-垂直行业领域招聘首选的专业人才网,分行业招聘就上行域人才网 | 宁波雷豹机电科技有限公司|雷豹冷风机|雷豹工业大风扇|MFC18000|MFC16000|MFC6000|EF3622|EF4222|EF4822|移动工业蒸发式冷风机空气冷却器|大型工业空调扇|雷豹移动式工业大风扇|雷豹大风扇|生产厂家|公司官网 | 陕西柱塞泵厂家_智能张拉设备_桥梁施工设备_千斤顶_液压分裂棒_液压分裂枪|陕西中拓矿山设备有限公司 | 涂料分散剂_水墨分散剂-厚洹化学水性色浆助剂厂家 | 思沃普智能会议预约管理系统-视频会议管理-信息发布-访客管理-会议运维-会议支持-工位管理系统 | 拓普思(常州)智能科技有限公司-青少年无人机教育培训比赛课程加盟拓活力 | 吸附式干燥机|零气耗压缩热干燥机|无锡气净法工业技术有限公司【官网】 | 泉州小吃培训_福建泉州本地特色小吃培训班|厨师技术培训学校-魅力小吃培训服务机构 | 腾云网-智慧网络营销服务提供商| 深圳LED显示屏厂家_室内户外LED显示屏_彩屏电子有限公司 | 惠声电子、广州市惠声电子科技有限公司、VBS、VBS惠声电子、VBS公共广播生产厂家、VBS广播功放生产厂家、VBS会议系统设备批发、VBSIP网络对讲系统厂家、VBS会议系统厂家、VBS智能中控厂家、VBS专业扩声厂家 | 搜药网-中药材中成药大全网普及中医中药功效归经知识,中药学知识天地 | 组合包装箱,折叠包装箱,烟台木箱,烟台包装箱-烟台顺达包装有限责任公司 | 热熔钻孔机【优质厂家】_多年热熔钻设备研发制造经验 | 原子灰厂家—长兴宝迪环保科技有限公司【官网】 | 嘉兴市南湖斋食品股份有限公司_南湖斋 | 模压化粪池_三格式化粪池_玻璃钢化粪池厂家 | 蒸汽发生器厂家-电加热蒸汽发生器-免办证/免报批/免报检电锅炉-上海电热水锅炉-上海艾亚锅炉有限公司 | 智能一体化蒸馏仪_氨氮蒸馏仪_全自动智能蒸馏仪器厂家-那艾 | 呼吸家官网|肺功能检测仪生产厂家|国产肺功能仪知名品牌|肺功能检测仪|肺功能测试仪|婴幼儿肺功能仪|弥散残气肺功能仪|肺功能测试系统|广州红象医疗科技有限公司|便携式肺功能仪|大肺功能仪|呼吸康复一体机|儿童肺功能仪|肺活量计|医用简易肺功能仪|呼吸康复系统|肺功能仪|弥散肺功能仪(大肺)|便携式肺功能检测仪|肺康复|呼吸肌力测定肺功能仪|肺功能测定仪|呼吸神经肌肉刺激仪|便携式肺功能 | 专业制造泥浆泵阀箱、锻造零件、曲轴、台阶轴等各种机械部件 - 四川中宇重工科技有限公司 |