国产久_亚欧精品一区_久久亚洲美女_99精品在线观看_日韩成人三级_久久精品久久久久

顯示源代碼
衛星軌跡
 開發文檔
            <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-tian-w-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>        
国产久_亚欧精品一区_久久亚洲美女_99精品在线观看_日韩成人三级_久久精品久久久久
<code id="kseui"><acronym id="kseui"></acronym></code>
  • <abbr id="kseui"><tbody id="kseui"></tbody></abbr>
  • <button id="kseui"></button>
  • 激情久久综合| 亚洲最新在线| 欧美一区二视频在线免费观看| 久久av一区二区| 国产在线不卡| 亚洲欧洲在线一区| 精品久久蜜桃| 国产精品jizz视频| 国产伦理一区| 国产欧美91| 99riav国产精品| 欧美色一级片| 正在播放91九色| 日韩免费毛片| 日本在线观看不卡| 欧美一区二区视频在线| 免费试看一区| 九色视频成人porny| 国产私拍一区| 国产综合动作在线观看| 成人在线观看av| 999国内精品视频在线| 99r国产精品视频| julia一区二区中文久久94| 99热这里只有精品8| 一本色道久久综合亚洲精品不| 亚洲精品自在在线观看| 国产三级精品在线不卡| 小嫩嫩精品导航| 麻豆av福利av久久av| 97人人干人人| 久久96国产精品久久99软件| 久久精品丝袜高跟鞋| 日本一区二区久久精品| 亚洲精品免费在线看| 中日韩在线视频| 一区二区视频在线观看| 国产精品手机在线| 久热这里只精品99re8久| 国产精品国模大尺度私拍| 国外成人在线视频网站| 日本福利一区二区三区| 欧美成人69| 一本色道久久精品| 91九色极品视频| 蜜桃视频在线观看成人| 日韩在线第一区| 女女同性女同一区二区三区91| 亚洲无毛电影| 香蕉亚洲视频| 久久久久久久免费| 欧美激情视频一区二区三区在线播放 | 国产精品嫩草99av在线| 久久先锋资源| 欧美一区二区福利| 伊人蜜桃色噜噜激情综合| 久久精品盗摄| 青娱乐一区二区| 亚洲高清视频一区| 99国产视频在线| 亚洲一一在线| 性色一区二区三区| 任我爽在线视频精品一| 亚洲成人原创| 精品免费一区二区三区蜜桃| 这里只有精品66| 午夜在线观看免费一区| 鲁鲁视频www一区二区| 亚洲视频中文| 狠狠色狠狠色综合人人| 欧美aⅴ99久久黑人专区| 91久久极品少妇xxxxⅹ软件| 亚洲一区二区三区精品动漫| 欧美一进一出视频| 亚洲成人一区二区三区| 蜜桃精品久久久久久久免费影院| 日韩欧美精品一区二区| 国产精品乱码一区二区三区| 久久久久一区二区三区| 亚洲精品日韩久久| 色大师av一区二区三区| 亚洲专区欧美专区| 一区二区不卡视频| 国产另类第一区| 亚洲精选国产| 影音先锋在线亚洲| 狠狠久久综合婷婷不卡| 亚洲国产欧美国产综合一区| 精品免费一区二区三区蜜桃| 在线亚洲自拍| 亚洲欧洲一区二区| 精品欧美一区二区精品久久| 亚洲黄色大片| 在线观看免费91| 久久精品aaaaaa毛片| 国产精品人人爽人人做我的可爱| 亚洲乱码一区二区三区 | 亚洲高清在线播放| 欧美一进一出视频| 裸体丰满少妇做受久久99精品| 海角社区69精品视频| 久久www免费人成精品| 国产亚洲激情| 国产精品www994| 欧美午夜精品久久久久久蜜| 久久久久高清| 日韩视频三区| 亚洲欧美综合| 神马影院午夜我不卡影院| 好吊色欧美一区二区三区| 亚洲综合社区| 亚洲欧洲日本一区二区三区| 欧美国产三级| 一区二区三区在线观看www| 欧美一区2区三区4区公司二百| 久热精品视频| 性久久久久久| 美女视频一区免费观看| 99视频精品| 亚洲免费精品| 亚洲精品美女91| 亚洲精品孕妇| 99精品久久| 亚洲一区二区三区高清不卡| 在线欧美一区| 伊人天天综合| 99综合在线| 亚洲制服少妇| 久久福利一区| 3d动漫啪啪精品一区二区免费 | 欧美一区二区视频17c| 精品国产一区二区三区日日嗨| 99re资源| 国产日韩在线一区二区三区| 激情伦成人综合小说| 精品国产乱码久久久久久久软件 | 欧美福利一区二区三区| 欧美午夜精品理论片a级大开眼界| 亚洲一二区在线| 最新精品视频| 影音先锋亚洲电影| 午夜在线视频观看日韩17c| 久久精品国产第一区二区三区最新章节| 日韩午夜在线| 久久青青草原一区二区| 岛国视频一区免费观看| 国外成人免费视频| 日韩免费av电影| 欧美精品入口| 国产精品久久久久久久免费软件| 亚洲永久免费| 精品国产一区二区三区四区精华 | 99精品欧美一区二区三区| 国产精品一级久久久| 欧美日本韩国国产| 欧美伊人久久| 国产精品外国| 久久波多野结衣| 欧美一区免费视频| 国产亚洲二区| 免费看成人片| 欧美日韩亚洲免费| 亚洲欧美日韩专区| 蜜桃91精品入口| 欧美日本亚洲| **亚洲第一综合导航网站| 91在线免费看片| 日韩av大全| 亚洲理伦在线| 欧美二区在线| 亚洲视频观看| 高清视频在线观看一区| 亚洲国内在线| 免费日韩一区二区| 日韩精品一区二区三区外面| 亚洲精品影视| 青娱乐一区二区| 国产精品久久波多野结衣| 国产呦系列欧美呦日韩呦| 欧美日韩中文| 精品蜜桃一区二区三区| 国模精品一区二区三区| 国产精品日韩一区二区| 在线观看日韩片| 国产精品裸体一区二区三区| 欧美成人首页| 91久久国产综合久久蜜月精品| 亚洲日本精品| 91香蕉视频在线下载| 欧美激情性爽国产精品17p| 国产精品毛片一区视频| 亚洲欧洲日韩综合二区| 日本在线观看一区二区| 久久综合亚州| 亚洲国产一区二区三区在线播| 欧美性大战久久久久| 久热这里只精品99re8久| 欧美精品播放| 欧美一区国产一区| 亚洲一区二区在线免费观看|