cesium 自定义百度底图

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>自定义地图</title>
    <link href="../Build/Cesium/Widgets/widgets.css" rel="stylesheet" />
    <script src="../Build/Cesium/Cesium.js"></script>
    <script src="../js/jquery.min.js"></script>
    <script src="../js/baidu.js"></script>
    <style>
        html, body, #cesiumContainer {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
            overflow: hidden;
        }
        .cesium-viewer-fullscreenContainer{
            display: none !important;
        }
    </style>
    <!--leaflet风格气泡窗口样式模板-->
    <style>
        .trackPopUp {
            display: none;
            color: #ffffff;
            position: absolute;
            top:5px;
            width: 330px;
            height: 250px;
            background-image: url(../img/infoBg.png) !important;
            background-size: 100% 100%;
            background-repeat: no-repeat;
        }
        .trackPopUp .popup-top{
            width: 100%;
            height: 35px;
            /*background: linear-gradient(to right bottom,#0e89d0,#3fbbe8);*/
            border-top-right-radius: 5px;
            border-top-left-radius: 5px;
        }
        .popup-top .top-title{
            line-height: 35px;
            margin-left: 5px;
            color: #333333;
            font-weight: bolder;
        }

        .popup-top .leaflet-popup-close-button {
            position: absolute;
            top: 0;
            right: 0;
            padding: 4px 4px 0 0;
            text-align: center;
            font: 25px/25px Tahoma, Verdana, sans-serif;
            color: #333333;
            text-decoration: none;
            font-weight: bolder;
            background: transparent;
        }

        .trackPopUp .popup-content{
            overflow-y: auto;
            height: auto;
            width: auto;
            min-width: 220px;
            border-bottom-left-radius: 5px;
            border-bottom-right-radius: 5px;
        }
        .popup-content .video-content {
            width: 100%;
            height: auto;

        }
        .videoBox{
            position: relative;
            top: 0;
            display: flex;
            justify-content: center;
            align-items: center;
        }
    </style>
</head>
<body>
<div id="cesiumContainer"></div>
<script>
    var viewer, scene;
    let params = {
        tx: 117.4525, //模型中心X轴坐标(经度,单位:十进制度)
        ty: 36.5253, //模型中心Y轴坐标(纬度,单位:十进制度)
        tz: 0, //模型中心Z轴坐标(高程,单位:米)
        rx: 0, //X轴(经度)方向旋转角度(单位:度)
        ry: 0, //Y轴(纬度)方向旋转角度(单位:度)
        rz: -1 //Z轴(高程)方向旋转角度(单位:度)
    };
    let gltfArr = [
        {   id : '001',
            name : '灯杆001',
            position:[117.4590, 36.5283],
            heading:-90,
            color:Cesium.Color.ROYALBLUE
        },{
            id : '002',
            name : '灯杆002',
            position:[117.4540, 36.5285],
            heading:160,
            color:Cesium.Color.ROYALBLUE
        },{
            id : '003',
            name : '灯杆003',
            position:[117.4490, 36.5226],
            heading:0,
            color:Cesium.Color.ROYALBLUE
        },{
            id : '004',
            name : '灯杆004',
            position:[117.4540, 36.5226],
            heading:-30,
            color:Cesium.Color.ROYALBLUE
        },{
            id : '005',
            name : '灯杆005',
            position:[117.4460, 36.5283],
            heading:90,
            color:Cesium.Color.ROYALBLUE
        },{
            id : '006',
            name : '灯杆006',
            position:[117.4580, 36.5230],
            heading:-30,
            color:Cesium.Color.ROYALBLUE
        }
    ];
    let popupArr = [
        {
            text:'博学楼',
            position:[117.452, 36.5245],
            height:85
        },
        {
            text:'实验楼',
            position:[117.452, 36.5270],
            height:85
        },
        {
            text:'声乐楼',
            position:[117.456, 36.5275],
            height:80
        },
        {
            text:'体育楼',
            position:[117.456, 36.5242],
            height:105
        }
    ];
    //设置初始范围
    var cartographic1 = [117.4500, 36.5080];//西南
    var cartographic2 = [117.4600, 36.5120];//东北
    //创建地图初始范围对象
    var initExtent = new Cesium.Rectangle(cartographic1[0], cartographic1[1], cartographic2[0], cartographic2[1]);
    var defaultResetView = Cesium.Rectangle.fromDegrees(initExtent.west, initExtent.south, initExtent.east,initExtent.north);
    /* 设置地图 */
    initMap();
    function initMap() {
        viewer = new Cesium.Viewer('cesiumContainer', {
            imageryProvider: new BaiduImageryProvider({
                //街道图
               //url: "http://online{s}.map.bdimg.com/onlinelabel/?qt=tile&x={x}&y={y}&z={z}&styles=pl&scaler=1&p=1",
                //自定义底图
                //可选值:dark,midnight,grayscale,hardedge,light,redalert,googlelite,grassgreen,pink,darkgreen,bluish
                url: "http://api{s}.map.bdimg.com/customimage/tile?&x={x}&y={y}&z={z}&scale=1&customid=darkgreen" ,
                //地形图
                //url: "http://shangetu{s}.map.bdimg.com/it/u=x={x};y={y};z={z};v=009;type=sate&fm=46" ,
                //实时路况
                //url:'http://its.map.baidu.com:8002/traffic/TrafficTileService?x={x}&y={y}&level={z}&time=20210825&label=web2D&v=017'
            }),
            homeButton: false, // 是否显示home控件
            vrButton: false,
            fullscreenButton: true,
            animation: true, // 是否显示动画控件
            geocoder: false, // 是否显示地名查找控件
            timeline: true, // 是否显示时间线控件
            sceneModePicker: false, // 是否显示投影方式控件
            navigationHelpButton: false, // 是否显示帮助信息控件
            infoBox: false, // 是否显示点击要素之后显示的信息
            baseLayerPicker: false, // 是否显示图层选择控件
            selectionIndicator: true, // Disable selection indicator
            shouldAnimate: true
            // requestRenderMode: true
        });
        // 不显示三维信息
        viewer._cesiumWidget._creditContainer.style.display = 'none'
        viewer.animation.container.style.visibility = 'hidden'; // 不显示动画控件
        viewer.timeline.container.style.visibility = 'hidden'; // 不显示时间控件
        scene = viewer.scene;

        //viewer.scene.screenSpaceCameraController.maximumZoomDistance = 1400;

        scene.screenSpaceCameraController.enableRotate = true;
        scene.screenSpaceCameraController.enableTranslate = true;
        scene.screenSpaceCameraController.enableZoom = true;
        scene.screenSpaceCameraController.enableTilt = true;
        initWork();
    }
    /*添加模型*/
    function initWork() {
        var palaceTileset = new Cesium.Cesium3DTileset({
            url: '../modelData/guangda/tileset.json',
            maximumScreenSpaceError: 16,//默认16,最大屏幕空间错误
            maximumNumberOfLoadedTiles: 1000,
            maximumMemoryUsage: 4096//默认512,内存MB的最大数量
        });
        palaceTileset.readyPromise.then(function (palaceTileset) {
            //添加到场景
            viewer.scene.primitives.add(palaceTileset);
            palaceTileset._root.transform = update3dtilesMaxtrix(params);
            //viewer.zoomTo(palaceTileset);
            viewer.camera.flyTo({
                destination:Cesium.Rectangle.fromDegrees(initExtent.west, initExtent.south, initExtent.east,initExtent.north),
                duration:0.1,
                orientation: {
                    heading: Cesium.Math.toRadians(0),//东西朝向
                    pitch: Cesium.Math.toRadians(-25.5),//角度
                    roll:0.0//左右朝向
                },
                easingFunction: Cesium.EasingFunction.LINEAR_NONE

            });
            dengGan();
            popup();
        });
    }
    /*放置灯杆*/
    function dengGan() {
        var gltfUrl = "../gltf/dengGan/scene.gltf";
        for(var dg=0;dg<gltfArr.length;dg++){
            var position = Cesium.Cartesian3.fromDegrees(gltfArr[dg].position[0], gltfArr[dg].position[1]);
            var heading = Cesium.Math.toRadians(gltfArr[dg].heading);
            var hpr = new Cesium.HeadingPitchRoll(heading, 0, 0);
            var orientation = Cesium.Transforms.headingPitchRollQuaternion(position, hpr);
            var entity = viewer.entities.add({
                id : gltfArr[dg].id,
                name : gltfArr[dg].name,
                position : position,
                orientation:orientation,
                model : {
                    uri : gltfUrl,
                    scale: 0.02,
                    minimumPixelSize : 120, //最小可视化比例
                    maximumScale : 500,    //最大可视化比例
                    color:gltfArr[dg].color,
                    heightReference: Cesium.HeightReference.RELATIVE_TO_GROUND
                },
            });
        }
        creatHandler()
    }
    /*显示气泡*/
    function popup() {
        var pinBuilder = new Cesium.PinBuilder();
        for(var i=0;i<popupArr.length; i++){
            viewer.entities.add({
                name: "popup",
                position: Cesium.Cartesian3.fromDegrees(popupArr[i].position[0],popupArr[i].position[1],popupArr[i].height),
                billboard: {
                    image:pinBuilder.fromText(popupArr[i].text,Cesium.Color.ROYALBLUE, 100).toDataURL(),
                    verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
                },
            });
        }
    }
    //点击事件
    function creatHandler() {
        var handler3D = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
        var scene = viewer.scene;
        var infoDiv = '<div id="trackPopUp" class="trackPopUp">' +
            '<div class="popup-top"><div class="top-title">灯杆视频</div><a class="leaflet-popup-close-button" href="#">×</a></div>' +
            '<div class="popup-content">' +
            '<div id="trackPopUpLink" class="video-content"></div>' +
            '</div>' +
            '</div>';
        $("#cesiumContainer").append(infoDiv);
        //绑定鼠标点击
        handler3D.setInputAction(function (movement) {
            var pick = scene.pick(movement.position); //判断是否拾取到模型
            if (scene.pickPositionSupported && Cesium.defined(pick)) {
                var cartesian = viewer.scene.pickPosition(movement.position);
                var cartographic = Cesium.Cartographic.fromCartesian(cartesian); //根据笛卡尔坐标获取到弧度
                var lng = Cesium.Math.toDegrees(cartographic.longitude).toFixed(3); //根据弧度获取到经度
                var lat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(4); //根据弧度获取到纬度
                console.log(lng,lat)
                var height = cartographic.height;//模型高度
                for(var dg=0;dg<gltfArr.length;dg++){
                    console.log(gltfArr[dg].position[0],gltfArr[dg].position[1])
                    if(lng == gltfArr[dg].position[0] && lat == gltfArr[dg].position[1] || lng+0.001 == gltfArr[dg].position[0] && lat+0.0001 == gltfArr[dg].position[1] || lng-0.001 == gltfArr[dg].position[0] && lat-0.0001 == gltfArr[dg].position[1]){
                        //$('#trackPopUp').show();
                        var content = ' <div class="videoBox"><video src="../img/fullView.mp4" width="320" height="200"  controls autoplay>\n' +
                            '</video></div></div>';
                        var obj = { position: movement.position, content: content };
                        //videoWindow(obj);
                    }
                }

            }
            else {
                $('#trackPopUp').hide();
            }

        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

    }
    //视频弹窗
    function videoWindow(obj) {
        var picked = scene.pick(obj.position);
        if (Cesium.defined(picked)) {
            $(".cesium-selection-wrapper").show();
            $('#trackPopUpLink').empty();
            $('#trackPopUpLink').append(obj.content);
            var c = new Cesium.Cartesian2(obj.position.x, obj.position.y);
            $('#trackPopUp').show();
            positionPopUp(c); // Initial position
            $('.leaflet-popup-close-button').click(function () {
                $('#trackPopUp').hide();
                $('#trackPopUpLink').empty();
                $(".cesium-selection-wrapper").hide();
                return false;
            });

        }
    }
    //弹窗定位
    function positionPopUp(c) {
        var x = c.x - ($('#trackPopUp').width()) / 2;
        var y = c.y - 100;
        $('#trackPopUp').css('transform', 'translate3d(' + x + 'px, ' + y + 'px, 0)');
    }
    //模型缩放
    function update3dtilesMaxtrix(params) {
        //旋转
        let mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(params.rx));
        let my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(params.ry));
        let mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(params.rz));
        let rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
        let rotationY = Cesium.Matrix4.fromRotationTranslation(my);
        let rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);
        //平移
        let position = Cesium.Cartesian3.fromDegrees(params.tx, params.ty, params.tz);
        let m = Cesium.Transforms.eastNorthUpToFixedFrame(position);

        let scale = Cesium.Matrix4.fromUniformScale(4.0);
        // //缩放
        Cesium.Matrix4.multiply(m, scale, m);
        //旋转、平移矩阵相乘
        Cesium.Matrix4.multiply(m, rotationX, m);
        Cesium.Matrix4.multiply(m, rotationY, m);
        Cesium.Matrix4.multiply(m, rotationZ, m);
        //赋值给tileset
        return m;
    }
</script>
</body>
</html>

baudu.js

BaiduImageryProvider = function(options) {
    this._errorEvent = new Cesium.Event();
    this._tileWidth = 256;
    this._tileHeight = 256;
    this._maximumLevel = 18;
    this._minimumLevel = 1;
    let southwestInMeters = new Cesium.Cartesian2(-33554054, -33746824);
    let northeastInMeters = new Cesium.Cartesian2(33554054, 33746824);
    this._tilingScheme = new Cesium.WebMercatorTilingScheme({
        rectangleSouthwestInMeters: southwestInMeters,
        rectangleNortheastInMeters: northeastInMeters
    });
    this._rectangle = this._tilingScheme.rectangle;
    this._resource = Cesium.Resource.createIfNeeded(options.url);
    this._tileDiscardPolicy = undefined;
    this._credit = undefined;
    this._readyPromise = undefined;
};

Object.defineProperties(BaiduImageryProvider.prototype, {
    url: {
        get: function () {
            return this._resource.url;
        }
    },
    proxy: {
        get: function () {
            return this._resource.proxy;
        }
    },
    tileWidth: {
        get: function () {
            if (!this.ready) {
                throw new Cesium.DeveloperError('tileWidth must not be called before the imagery provider is ready.');
            }
            return this._tileWidth;
        }
    },

    tileHeight: {
        get: function () {
            if (!this.ready) {
                throw new Cesium.DeveloperError('tileHeight must not be called before the imagery provider is ready.');
            }
            return this._tileHeight;
        }
    },

    maximumLevel: {
        get: function () {
            if (!this.ready) {
                throw new Cesium.DeveloperError('maximumLevel must not be called before the imagery provider is ready.');
            }
            return this._maximumLevel;
        }
    },

    minimumLevel: {
        get: function () {
            if (!this.ready) {
                throw new Cesium.DeveloperError('minimumLevel must not be called before the imagery provider is ready.');
            }
            return this._minimumLevel;
        }
    },

    tilingScheme: {
        get: function () {
            if (!this.ready) {
                throw new Cesium.DeveloperError('tilingScheme must not be called before the imagery provider is ready.');
            }
            return this._tilingScheme;
        }
    },

    tileDiscardPolicy: {
        get: function () {
            if (!this.ready) {
                throw new Cesium.DeveloperError('tileDiscardPolicy must not be called before the imagery provider is ready.');
            }
            return this._tileDiscardPolicy;
        }
    },

    rectangle: {
        get: function () {
            if (!this.ready) {
                throw new Cesium.DeveloperError('rectangle must not be called before the imagery provider is ready.');
            }
            return this._rectangle;
        }
    },

    errorEvent: {
        get: function () {
            return this._errorEvent;
        }
    },
    ready: {
        get: function () {
            return this._resource;
        }
    },
    readyPromise: {
        get: function () {
            return this._readyPromise;
        }
    },
    credit: {
        get: function () {
            if (!this.ready) {
                throw new Cesium.DeveloperError('credit must not be called before the imagery provider is ready.');
            }
            return this._credit;
        }
    },
});

BaiduImageryProvider.prototype.requestImage = function (x, y, level, request) {
    let xTileCount = this._tilingScheme.getNumberOfXTilesAtLevel(level);
    let yTileCount = this._tilingScheme.getNumberOfYTilesAtLevel(level);
    let url = this.url
        .replace("{x}", x - xTileCount / 2)
        .replace("{y}", yTileCount / 2 - y - 1)
        .replace("{z}", level)
        .replace("{s}", Math.floor(10 * Math.random()));
    //console.log("zxy:" + level + ", " + x + ", " + y + "; " + url);
    return Cesium.ImageryProvider.loadImage(this, url);
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值