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

顯示源代碼
可視域 球形
 開發(fā)文檔
            <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>
    <title>可視域</title>
</head>
<style type="text/css">
    * {
        padding: 0;
        margin: 0;
    }
    html, body, #map {
        width: 100%;
        height: 100%;
    }
    #start {
        position: absolute;
        left: 50px;
        top: 50px;
        z-index: 9999;
    }
    #step {
        position: absolute;
        left:120px;
        top: 50px;
        z-index: 9999;
    }
    .info{
        position: fixed;
        top:0;
        color: #8a6d3b;
        z-index: 99;
        margin: 0;
        background-color: #fcf8e3;
        border-color: #faebcc;
        left: 0;
        right: 0;
        text-align: center;
    }
</style>
<body>
<div id="map"></div>
<div class="info">
    先點擊開始,然后再次單擊地圖,即可實現(xiàn)可視域分析功能
</div>
<button id="start">
    開始
</button>
<button id="step">
    進度
</button>
</body>
</html>
<script type="text/javascript">
    bmgl.Config.HTTP_URL = 'http://ua.bigemap.com:30081/bmsdk/';
    var viewer = new bmgl.Viewer('map', {
        terrainId: 'bigemap.dc-terrain',
        requestRenderMode:false,
        mapId: 'bigemap.dc-tian-w-satellite'
    });
    var config = initConfig();
    function initConfig() {
        let base = {
            lng: 86,
            lat: 28,
            sum: 50,
            start: 0,
            done: 0,
            height: 5,
            loaded: 0,
            delta: 100,
            all_seen: 0,
            width: 5000,
            click: 0,
            draw: false,
            calc_width: [],
            edge: [],
            min: [],
            inner: [],
        };
        return base;
        // return JSON.parse(JSON.stringify(base));
    }

    // viewer.entities.add({
    //     position:bmgl.Cartesian3.fromDegrees(config.lng,config.lat),
    //     label:{
    //         text:'C',
    //         heightReference:bmgl.HeightReference.CLAMP_TO_GROUND,
    //     }
    // });
    viewer.scene.globe.depthTestAgainstTerrain = true;
    //獲取最新的位置
    viewer.camera.setView({
        destination: bmgl.Cartesian3.fromDegrees(103.59526245619938,30.9814012061604,3837.4144546),
        orientation: {"heading":6.282150327905171,"roll":6.279635689524259,"pitch":-0.6993902253931052}
    });
    function startDraw() {
        // var pp=bmgl.Transforms.eastNorthUpToFixedFrame(bmgl.Cartesian3.fromDegrees(config.lng,config.lat));
        document.getElementById('step').innerHTML='0/'+config.sum;
        for (let i = 0; i < config.sum; i++) {
            var tmp_edge = [];
            var tmp_inner = [];
            for (let j = 0; j < config.sum; j++) {
                var center = bmgl.Cartesian3.fromDegrees(config.lng, config.lat);
                var heading = bmgl.Math.PI * 2 * j / config.sum;
                var hpr = new bmgl.HeadingPitchRoll(heading, 0.0, 0);
                var transform = bmgl.Transforms.headingPitchRollToFixedFrame(center, hpr);
                var p = bmgl.Matrix4.multiplyByPoint(transform, new bmgl.Cartesian3(config.width * Math.cos(bmgl.Math.toRadians(90 * i / config.sum)), 0, config.width * Math.sin(bmgl.Math.toRadians(90 * i / config.sum))), new bmgl.Cartesian3());
                // var p2=bmgl.Matrix4.multiplyByPoint(transform,new bmgl.Cartesian3(config.width*Math.cos(bmgl.Math.toRadians(90*i/config.sum)),0,0),new bmgl.Cartesian3());
                // viewer.entities.add({
                //     position:p2,
                //     label:{
                //         heightReference:bmgl.HeightReference.CLAMP_TO_GROUND,
                //         text:'b',
                //         font:'14px arial',
                //     }
                // });
                // tmp_inner.push({p:p2});
                tmp_edge.push({p, height: config.width * Math.sin(bmgl.Math.toRadians(90 * i / config.sum))});
            }
            // config.calc_width.push(config.width * Math.cos(bmgl.Math.toRadians(90 * i / config.sum)));
            tmp_edge.push(tmp_edge[0]);
            config.edge.push(tmp_edge);
            // config.inner.push(tmp_inner);
            // viewer.entities.add({
            //     polyline:{
            //         width:new bmgl.ConstantProperty(2),
            //         material:bmgl.Color.BLUE,
            //         // clampToGround:true,
            //         positions:tmp_edge.map(v=>v.p)
            //     }
            // });
        }
        console.log(config);
        calcShow();
    }
    // viewer.flyTo(viewer.entities);
    let handler = new bmgl.ScreenSpaceEventHandler(viewer.canvas);
    handler.setInputAction(function (e) {
        if (!config.draw) return;
        if (config.click === 0) {
            viewer.entities.removeAll();
        }
        let ray = viewer.camera.getPickRay(e.position);
        if (!ray) return;
        let cartesian3 = viewer.scene.globe.pick(ray, viewer.scene);
        config.click++;
        let p = bmgl.Cartographic.fromCartesian(cartesian3);
        switch (config.click) {
            case 1:
                viewer.entities.add({
                    position: cartesian3,
                    label: {
                        text: 'Start',
                        verticalOrigin:bmgl.VerticalOrigin.BOTTOM,
                        heightReference: bmgl.HeightReference.CLAMP_TO_GROUND,
                    }
                });
                config.lng = bmgl.Math.toDegrees(p.longitude);
                config.lat = bmgl.Math.toDegrees(p.latitude);
                config.mouse={lng:config.lng,lat:config.lat};
                config.tmp_label=viewer.entities.add({
                    position:new bmgl.CallbackProperty(function (){
                        return bmgl.Cartesian3.fromDegrees(config.mouse.lng,config.mouse.lat);
                    }),
                    label:{
                        text:'',
                        verticalOrigin:bmgl.VerticalOrigin.BOTTOM,
                        heightReference:bmgl.HeightReference.CLAMP_TO_GROUND,
                        font:'16px arial',
                    }
                });
                config.tmp_line=viewer.entities.add({
                    polyline:{
                        positions:new bmgl.CallbackProperty(function (){
                            return bmgl.Cartesian3.fromDegreesArray([config.lng,config.lat,config.mouse.lng,config.mouse.lat]);
                        }),
                        clampToGround:true,
                        material:bmgl.Color.RED.withAlpha(0.8),
                    }
                });
                config.tmp_line2=viewer.entities.add({
                    polyline:{
                        positions:new bmgl.CallbackProperty(function (){
                            let  p=[];
                            let dd=bmgl.Cartesian3.distance(bmgl.Cartesian3.fromDegrees(config.lng,config.lat),bmgl.Cartesian3.fromDegrees(config.mouse.lng,config.mouse.lat)).toFixed(2);
                            for (let i=0;i<40;i++){
                                var center = bmgl.Cartesian3.fromDegrees(config.lng, config.lat);
                                var heading = bmgl.Math.PI * 2 * i / 40;
                                var hpr = new bmgl.HeadingPitchRoll(heading, 0.0, 0);
                                var transform = bmgl.Transforms.headingPitchRollToFixedFrame(center, hpr);
                                var p1 = bmgl.Matrix4.multiplyByPoint(transform, new bmgl.Cartesian3(dd, 0, 0), new bmgl.Cartesian3());
                                p.push(p1);
                            }
                            p.push(p[0]);
                            return p;
                        }),
                        clampToGround:true,
                        material:bmgl.Color.RED.withAlpha(0.8),
                    }
                });
                break;
            case 2:
                let dd = bmgl.Cartesian3.distance(bmgl.Cartesian3.fromDegrees(config.lng, config.lat), cartesian3);
                // console.log(dd);
                config.width = dd;
                viewer.entities.add({
                    position: cartesian3,
                    label: {
                        text: 'End',
                        verticalOrigin:bmgl.VerticalOrigin.BOTTOM,
                        heightReference: bmgl.HeightReference.CLAMP_TO_GROUND,
                    }
                });
                break;
        }

        if (config.click > 1) {
            //說明已經(jīng)點擊了兩次,繪制完成了
            viewer.entities.remove(config.tmp_label);
            viewer.entities.remove(config.tmp_line);
            viewer.entities.remove(config.tmp_line2);
            startDraw();
            config.draw = false;
            config.click = 0;
        }
    }, bmgl.ScreenSpaceEventType.LEFT_CLICK);

    handler.setInputAction(function (e){
        if (!config.draw) return;
        if (config.click===1){
            let ray=viewer.camera.getPickRay(e.endPosition);
            if (!ray) return;
            let pp=viewer.scene.globe.pick(ray,viewer.scene);
            pp=bmgl.Cartographic.fromCartesian(pp);
            config.mouse={
                lng:bmgl.Math.toDegrees(pp.longitude),
                lat:bmgl.Math.toDegrees(pp.latitude)
            }
            config.tmp_label.label.text=bmgl.Cartesian3.distance(bmgl.Cartesian3.fromDegrees(config.lng,config.lat),bmgl.Cartesian3.fromDegrees(config.mouse.lng,config.mouse.lat)).toFixed(2)+'米';
        }

    },bmgl.ScreenSpaceEventType.MOUSE_MOVE);
    document.getElementById('start').addEventListener('click', function () {
        config = initConfig();
        config.draw = true;
        //config=initConfig();
    });

    function calcShow() {
        if (!config.edge[config.start]) {
            console.log('all over');
            document.getElementById('step').innerHTML=config.sum+'/'+config.sum;
            return;
        }
        config.edge[config.start].map((v, ii) => {
            var end = bmgl.Cartographic.fromCartesian(v.p);
            end.lng = bmgl.Math.toDegrees(end.longitude);
            end.lat = bmgl.Math.toDegrees(end.latitude);
            let p = [];
            for (let j = 0; j < config.delta; j++) {
                let tp = {
                    lng: config.lng + (end.lng - config.lng) * j / config.delta,
                    lat: config.lat + (end.lat - config.lat) * j / config.delta
                };
                // debugger;
                // if (config.start===6){
                //     viewer.entities.add({
                //         position:bmgl.Cartesian3.fromDegrees(tp.lng,tp.lat),
                //         label:{
                //             text:'k'+j,
                //             heightReference:bmgl.HeightReference.CLAMP_TO_GROUND,
                //         }
                //     });
                // }
                p.push(bmgl.Cartographic.fromCartesian(bmgl.Cartesian3.fromDegrees(tp.lng, tp.lat)));
            }
            let hh = v.height;
            getTerrain(p, ii, (ter, iii) => {
                // debugger;
                ter[ter.length - 1]['height'] = hh;
                config.loaded++;
                let result = showVisible(ter);
                config.edge[config.start][iii]['v'] = result[result.length - 1];
                // viewer.entities.add({
                //     position: config.edge[config.start][iii]['p'],
                //     label: {
                //         text: result[result.length - 1] ? '1' : '0',
                //         heightReference: bmgl.HeightReference.CLAMP_TO_GROUND,
                //     }
                // });

                // var a = bmgl.Cartographic.fromCartesian(config.edge[config.start][iii]['p']);
                // viewer.entities.add({
                //     position: bmgl.Cartesian3.fromDegrees(bmgl.Math.toDegrees(a.longitude), bmgl.Math.toDegrees(a.latitude), hh),
                //     label: {
                //         fillColor: config.edge[config.start][iii]['v'] ? bmgl.Color.BLUE : bmgl.Color.RED,
                //         text: 'X',
                //     }
                // });
                if (config.loaded === config.edge[config.start].length) {
                    //本次圓內(nèi)已經(jīng)計算完了
                    let ttt = [];
                    config.edge[config.start].map(v1 => {
                        ttt.push(v1.v);
                    });
                    console.log('index: ' + config.start);
                    document.getElementById('step').innerHTML=config.start+'/'+config.sum;
                    let all_seen = Array.from(new Set(ttt));
                    if (all_seen[0] && all_seen.length === 1) {
                        config.all_seen = config.start;
                        document.getElementById('step').innerHTML=config.sum+'/'+config.sum;
                        for (let j=config.start;j<config.edge.length;j++){
                            drawLine(config.edge[j].map(v=>{
                                v.v=true;
                                return v;
                            }));
                        }
                        //第二次繪畫
                        for (let i=0;i<config.sum;i++){
                            let tmp=[];
                            for (let j=0;j<config.sum;j++){
                                tmp.push(config.edge[j][i]);
                            }
                            tmp.push({v:true,p:bmgl.Cartesian3.fromDegrees(config.lng,config.lat,config.width)});
                            drawLine(tmp);
                            // console.log(tmp);
                        }
                        return;
                    }
                    drawLine(config.edge[config.start]);
                    config.loaded = 0;
                    config.start++;
                    calcShow();
                }
            });
            // viewer.entities.add({
            //     position:v.p,
            //     label:{
            //         text:'c',
            //         heightReference:bmgl.HeightReference.CLAMP_TO_GROUND,
            //     }
            // })
        });
    }


    function drawLine(data) {
        // console.log(data);
        let path = [];
        let tmp = [data[0]];
        let prev = data[0]['v'];
        for (let j = 1; j < data.length; j++) {
            let v = data[j];
            tmp.push(v);
            if (prev !== v.v) {
                if (tmp.length > 1) {
                    let m;
                    if (prev) {
                        m = bmgl.Color.BLUE;
                    } else {
                        m = bmgl.Color.RED;
                    }
                    console.log('tmp index length : ' + tmp.length);
                    viewer.entities.add({
                        polyline: {
                            material: m,
                            positions: tmp.map(v => v.p),
                        }
                    });
                    // path.push({v:start,path:[...JSON.parse(JSON.stringify(tmp))]});
                    tmp.length = 0;
                    tmp.push(v);
                }
                prev = v.v;
            }
        }

        if (tmp.length > 1) {
            let m;
            if (prev) {
                m = bmgl.Color.BLUE;
            } else {
                m = bmgl.Color.RED;
            }
            console.log('tmp index' + tmp.length);
            viewer.entities.add({
                polyline: {
                    material: m,
                    positions: tmp.map(v => v.p),
                }
            });
        }
        console.log(path);
    }

    function getTerrain(position, i, callback) {
        // bmgl.sampleTerrain(viewer.terrainProvider,8,position).then(data=>{
        //     try {
        //         if (data.length > 0) callback(data, i);
        //     } catch (e) {
        //         console.log(e);
        //     }
        // });
        bmgl.sampleTerrainMostDetailed(viewer.terrainProvider, position).then(data => {
            try {
                if (data.length > 0) callback(data, i);
            } catch (e) {
                console.log(e);
            }
        })
    }

    function showVisible(terrainData) {
        var preVisible = true;
        var cartesiansLine = [];
        var colors = [true];
        for (var j = 1; j < terrainData.length; j++) {
            //逐點計算可見性
            var visible = true;//該點可見性
            if (j > 1) {
                var cartographicCenterHV = new bmgl.Cartographic(terrainData[0].longitude, terrainData[0].latitude, terrainData[0].height + config.height);
                if (preVisible) {
                    var curPoint = InterpolateIndexLineHeightCartographic(cartographicCenterHV, terrainData[j], j, j - 1);
                    if (curPoint.height >= terrainData[j - 1].height) {
                        preVisible = true;
                        visible = true;
                    } else {
                        preVisible = false;
                        visible = false;
                    }
                } else {
                    //插值到當前
                    var curPointArr = Interpolate2IndexLineHeightCartographic(cartographicCenterHV, terrainData[j], j, j - 1);
                    for (var k = 0; k < curPointArr.length; k++) {
                        if (curPointArr[k].height >= terrainData[k].height) {
                            preVisible = true;
                            visible = true;
                        } else {
                            preVisible = false;
                            visible = false;
                            break;
                        }
                    }
                }
            }
            // var cartesianTemp = bmgl.Cartesian3.fromRadians(terrainData[j].longitude, terrainData[j].latitude, terrainData[j].height + 0.10);
            // cartesiansLine.push(cartesianTemp);
            //繪制點
            colors.push(visible);
        }
        return colors;

    }

    function Interpolate2IndexLineHeightCartographic(start, end, num, curIndex) {
        if (start && end) {
        } else {
            return null;
        }
        if (start.longitude && start.latitude && end.longitude && end.latitude) {
        } else {
            return null;
        }
        var result = [];
        result.push(new bmgl.Cartographic(start.longitude, start.latitude, start.height));
        var stepLon = (end.longitude - start.longitude) / num;
        var stepLat = (end.latitude - start.latitude) / num;
        var stepHeight = (end.height - start.height) / num;
        for (var i = 0; i < curIndex; i++) {
            var lon = start.longitude + (i + 1) * stepLon;
            var lat = start.latitude + (i + 1) * stepLat;
            var hieght = start.height + (i + 1) * stepHeight;
            result.push(new bmgl.Cartographic(lon, lat, hieght));
        }
        return result;
    }

    function InterpolateIndexLineHeightCartographic(start, end, num, index) {
        if (start && end) {
        } else {
            return null;
        }
        if (start.longitude && start.latitude && end.longitude && end.latitude) {

        } else {
            return null;
        }
        //var delta = _Delta && (typeof _Delta === 'number') ? _Delta : DeltaRadian;
        var stepLon = (end.longitude - start.longitude) / num;
        var stepLat = (end.latitude - start.latitude) / num;
        var stepHeight = (end.height - start.height) / num;
        var lon = start.longitude + index * stepLon;
        var lat = start.latitude + index * stepLat;
        var hieght = start.height + index * stepHeight;
        var result = new bmgl.Cartographic(lon, lat, hieght);
        return result;
    }
</script>
                                                                                
国产久_亚欧精品一区_久久亚洲美女_99精品在线观看_日韩成人三级_久久精品久久久久
<code id="kseui"><acronym id="kseui"></acronym></code>
  • <abbr id="kseui"><tbody id="kseui"></tbody></abbr>
  • <button id="kseui"></button>
  • 亚洲精品影院| 亚洲免费黄色| 国产欧美一区二区视频 | 宅男在线精品国产免费观看| 欧美一级二区| 亚洲福利免费| 一区在线电影| 日韩欧美一区二区在线观看| 久久中文精品| 欧美亚洲三区| 久久成人国产| 亚洲一区日本| 99re国产精品| 亚洲欧洲在线一区| 国产精品yjizz| 欧美高清不卡| 欧美一区二区三区在线播放| 日本在线一区| 日韩电影大全在线观看| 欧美日韩最好看的视频| 精品国产一区二区三区四区vr| 美女日韩在线中文字幕| 亚洲在线一区| 嫩草成人www欧美| 性感少妇一区| 成人黄动漫网站免费| 国产精品伊人日日| 狠狠爱一区二区三区| 久久久久久精| 欧美专区一二三 | 99影视tv| 国产精品久久久久久久久久久久冷 | 亚洲欧美日本视频在线观看| 亚洲精品专区| 久久av在线| 动漫美女被爆操久久久| 国产一区二区三区高清| 精品国产一区二区三区日日嗨| 久久爱av电影| 伊人情人网综合| 国产精品国产精品| 欧美综合77777色婷婷| 国产精品亚洲一区| 日韩精品一区二区三区丰满| 一区二区三区免费看| 狠狠色噜噜狠狠色综合久| 中文在线一区| 国产美女99p| 夜夜爽99久久国产综合精品女不卡 | 亚洲高清资源综合久久精品| 欧美黄在线观看| 久久久久网站| 亚洲欧美日产图| 一区在线视频观看| 国产精品一区二区三区不卡| 欧美三级华人主播| 亚洲精品一品区二品区三品区| 免费久久久一本精品久久区| 狠狠色伊人亚洲综合网站色| 椎名由奈jux491在线播放| 国产精品日韩一区二区三区| 国产三级精品在线不卡| 一区国产精品| 国产成人成网站在线播放青青| 欧美一区二区三区四区夜夜大片 | 国产精品一区二区你懂得| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 久久66热这里只有精品| 欧美日韩精品| 国产精品美女诱惑| 伊人久久青草| 成人自拍网站| 国产主播精品| 久久99精品久久久久久秒播放器| 欧美精品91| 精品乱色一区二区中文字幕| 欧美日韩大片一区二区三区| 国产精品久久九九| 亚洲国产日韩综合一区| 精品一区在线播放| 一区二区高清视频| 天天综合色天天综合色hd| 亚久久调教视频| 黄色欧美日韩| 日本一区二区三区视频在线播放| 亚洲欧美成人| 影音先锋在线一区| 欧美亚洲丝袜| 99精彩视频| 999在线观看精品免费不卡网站| 欧美日韩在线精品| 国产不卡一区二区在线观看| 亚洲人成在线影院| 亚洲精品一区二| 久久99蜜桃综合影院免费观看| 午夜在线播放视频欧美| 欧美日韩高清免费| 日本在线观看一区二区| 高清视频在线观看一区| 国产亚洲毛片在线| 国产精品v欧美精品v日本精品动漫| 蜜桃视频日韩| 激情小说综合区| 久久午夜电影| 欧美亚洲专区| 亚洲欧美网站| 国产亚洲精品久久久久婷婷瑜伽| 亚洲午夜一级| 黄色日韩精品| 国模一区二区三区| 女人色偷偷aa久久天堂| 欧洲亚洲一区二区| 麻豆成人av| 欧美日韩精品免费看| 成人av免费电影| 粉嫩av四季av绯色av第一区| 国产精品乱子乱xxxx| 国产欧美日韩一区二区三区在线| 狠狠干综合网| 亚洲黄色大片| av成人免费观看| 夜夜精品视频| 香蕉精品999视频一区二区| 亚洲青涩在线| 亚洲女同在线| 国产精品久久精品国产| 黄色国产精品一区二区三区| 精品一区二区三区自拍图片区 | 欧美高清视频一区二区三区在线观看| 日韩电影大全在线观看| 亚洲亚洲精品三区日韩精品在线视频| 亚洲国产精品www| 欧美人成网站| 亚洲伦理一区| 成人免费观看网站| 久久99久久精品国产| 日本一区二区高清视频| 在线视频福利一区| 亚洲激情在线| 91九色在线观看| 精品一区二区日本| 综合一区中文字幕| 91久久综合| av免费观看久久| 欧美不卡福利| 欧美日韩一区二区三区免费| 国产日韩精品视频一区二区三区| 18成人免费观看网站下载| 国内外成人免费视频| 一区二区精品国产| 国产日韩一区二区三区在线播放| 91免费看网站| 五月天丁香综合久久国产| 黄色av日韩| 国产一区高清视频| 欧美视频导航| **亚洲第一综合导航网站 | 蜜桃视频成人| 国内精品视频在线播放| 鲁大师影院一区二区三区| 免费一区二区三区在在线视频| 一级日韩一区在线观看| 亚洲一区二区三区四区五区午夜| 久热这里只精品99re8久 | 国产日韩欧美一区二区三区四区| 先锋影音一区二区三区| 国产欧美日韩亚洲| 欧美一二三区| 免费久久久一本精品久久区| 日韩精品一线二线三线| 中文高清一区| 亚洲一区二区在线看| 久久久青草婷婷精品综合日韩| 污视频在线免费观看一区二区三区 | 台湾成人av| 美女国产精品| 国产精品hd| 精品国产一区二区三| 亚洲精品乱码| 欧美日韩电影一区二区三区| 亚洲欧洲视频| 涩涩涩999| 91超碰在线电影| 合欧美一区二区三区| 欧美第一黄网| 久久最新视频| 亚洲国产精品一区制服丝袜| 久久另类ts人妖一区二区| 国产日韩欧美一区| 欧美国产三区| 久久偷看各类wc女厕嘘嘘偷窃 | 中文网丁香综合网| 欧美喷水视频| 欧美一区二区在线视频观看| 米奇777在线欧美播放| 国产精品久久7| 亚洲精品8mav| 日韩三级电影网站| 精品视频第一区| 国产精品青青草|