ThingsJs--學習筆記3:在springboot項目前端嵌入thingsjs頁面,並在實現對它的跨域數據對接

效果圖如下:
點擊不同按鈕,會在衛星地圖中相應的數據座標點加載出“水模型”。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

================================================================================

代碼寫的急,寫的不是很好,所以酌情參考。

================================================================================
1.在線編寫thingsjs頁面

var app = new THING.App();
app.background = [0, 0, 0];
// app.camera.earthFlyTo.
THING.Utils.dynamicLoad('https://www.thingjs.com/uearth/uearth.min.js', function () {
    // 創建一個地圖
    var map = app.create({
        type: 'Map',
        attribution: 'Google',// 右下角地圖版權信息   
        style: {
            night: false
        }
    });
    // map.visible = false;// 不顯示地球

    // 創建一個瓦片圖層
    var tileLayer1 = app.create({
        type: 'TileLayer',
        name: '衛星影像圖層',
        // Google WGS84 衛星影像服務
        url: 'https://mt{0,1,2,3}.google.cn/vt/lyrs=s&x={x}&y={y}&z={z}'
    });
    // 將瓦片圖添加到底圖圖層中
    map.addLayer(tileLayer1);
    app.camera.earthFlyTo({
        lonlat: [108.69187085000000000, 34.27071589999999900],
        height: 1500,
        disablePick: false
    });


    // 創建一個 ThingLayer
    var thingLayer = app.create({
        type: "ThingLayer",
        name: "thingLayer01"
    });
    // 將ThingLayer添加到地圖中
    map.addLayer(thingLayer);




    new THING.widget.Button('積水', function () {
        //數據對接
        $.ajax({
            'headers': {
                "token": '31415926'// 請求頭中帶上了token數據,必須要有
            },
            //****PS!!!:請看代碼後面的注意事項note3!!!***
            'url': "//localhost:8081/getModelData",  
            'type': "GET",
            'dataType': "json",
            'data': {},
            'success': function (data) {
                if (data.level0 != null) {
                    var level1 = data.level0;//獲取json對象level0
                    for (var i = 0; i < level1.length; i++) {
                        var x = level1[i].lng;//經度
                        var y = level1[i].lat;//緯度
                     
                        var geoPoint = thingLayer.query('積水')[i];
                        if (!geoPoint) {
                            geoPoint = app.create({
                                type: 'GeoPoint',
                                name: '積水',
                                userData: { '類別': '水' },
                                coordinates: [x, y],
                                modelAngle: 90, // 模型旋轉角度
                                renderer: {
                                    type: 'model', // model 代表使用模型
                                    url: 'https://model.3dmomoda.com/models/1e476bfd0670483695f4b7a2c00b48f3/0/gltf/', // 模型地址
                                    size: 5  // 縮放比例
                                }
                            });
                            //設置不透明度是0.5,如果設置成1.0即爲完全不透明
                            geoPoint.style.opacity = 0.1;
                            //設置物體附加顏色
                            geoPoint.style.color = "#00ffff";//青色
                            thingLayer.add(geoPoint);// 將一個點加到ThingLayer中
                        }
                        else {
                            geoPoint.visible = !geoPoint.visible;
                        }
                    }
                }
                else {
                    alert("沒有“積水”等級的點!");
                }
            },
            error: function (data) {
                console.log("未獲取到level1數據!");
            }
        });
    });

    new THING.widget.Button('輕度內澇', function () {
        //數據對接
        $.ajax({
        ....//和上面的差不多,我就不復制了
        });  
    });

    new THING.widget.Button('中度內澇', function () {
        //數據對接
        $.ajax({
        ....//和上面的差不多,我就不復制了
        });  
    });

    new THING.widget.Button('嚴重內澇', function () {
        //數據對接
        $.ajax({
        ....//和上面的差不多,我就不復制了
        });  
    });
});

note1:
code中的模型地址,可以改變成你想要的模型,只要有的url(https://model.3dmomoda.com/models/+模型id+/0/gltf/)就行。

模型id的獲取方法如下:
在這裏插入圖片描述

2.通過 <iframe標籤> 在項目前端嵌入用 ThingsJs 在線開發的頁面的引用地址

        <!--<iframe src="https//www.thingjs.com/pp/74abe68ce0a3bacc5f019f02" style="width: 100%;height: 1024px"></iframe>-->
        <iframe src="//www.thingjs.com/pp/fb9620041686b0b9d1228f40" style="width: 100%;height: 1024px"></iframe>

note2:
如何獲取在線開發的 ThingsJs頁面的引用地址?
在這裏插入圖片描述
在這裏插入圖片描述

note3:

關於相對協議

我在步驟1代碼中寫到了 ‘url’: “//localhost:8081/getModelData”,****步驟2代碼中寫到了src="//www.thingjs.com/pp/fb9620041686b0b9d1228f40"

完整的URL其實是 “http//localhost:8081/getModelData” ,但是我要引用在springboot項目前端的ThingsJs(在線開發的)頁面實際上默認是https://www.thingjs.com/pp/fb9620041686b0b9d1228f40

這就相當於我在https協議中發起了http請求,這違反了https的安全性要求。最簡單的方法是使用相對協議,即將https和http頭都去掉,這樣他們會自己進行合適的匹配。

值得注意的是,https中嵌套了http和有沒有進行跨域處理無關,因爲瀏覽器處於安全考慮會在跨域前就將請求攔截掉。

(如果還是沒看懂,可以看看這篇文章)->->-> 傳送link

3. springboot中通過@CrossOrigin註解,快速又簡單進行跨域處理

    /**
     * @return 返回給seeperforecast1.html頁面嵌套的thingjs3d立體界面需要的數據(跨域ajax請求)
     */
    //@CrossOrigin(origins = {"https://www.thingjs.com", "3600"})
    @CrossOrigin(origins = {"*", "3600"})
    //實現跨域註解
    //origin="*"代表所有域名都可訪問
    //maxAge飛行前響應的緩存持續時間的最大年齡,簡單來說就是Cookie的有效期 單位爲秒
    //若maxAge是負數,則代表爲臨時Cookie,不會被持久化,Cookie信息保存在瀏覽器內存中,瀏覽器關閉Cookie就消失
    //"Access-Control-Allow-Origin", "*"
    @RequestMapping(value = "/getModelData", method = RequestMethod.GET)
    @ResponseBody
    public Map<String, List<Points>> getModelData() {
        Map<String, List<Points>> returnData = new Main().returnResult();
        return returnData;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章