Skip to content

上卷下钻 ​

此功能案例实现楼层点位展示,拆解楼层及散点显隐等。

目录 ​

1. 功能点 ​

  • 添加地标图 addLandmarkLayer
  • 地标图点击事件 pickOverlay、 onLandmarkLayerClick
  • 设置相机 setCamera
  • 拆解楼层 showBuildingFloor
  • 控制图层显隐 setOverlayVisibility
  • 删除图层 removeOverlay
  • 恢复楼层 resetBuildingFloor

返回本章目录

2. 视频演示 ​

返回本章目录

3. 核心代码 ​

引入版本:3.0 起支持

第一步 ​

准备图层数据,点击按钮 1,切换视角,添加图层,在成功回调中,开启该图层点击事件

JavaScript
// 添加鼠标点击事件
document.querySelectorAll('.btns div')[0].onclick = function () {
    // 展示大楼
    setCamera1(); 
    // 添加楼层地标图层
    addFloors();	
};

切换大楼视角

JavaScript
// 展示大楼
function setCamera1() {
    window.appInstance.uniCall('setCamera', {
        centerCoord: [113.94008542655, 22.52094558212], // 中心点的坐标 lng,lat
        coordType: 0,                                   // XY 轴坐标类别,0:X 经度,Y 纬度;1:X 米,Y米,相对世界00点
        coordTypeZ: 0,                                  // Z 轴坐标类别,0:相对 3D 世界 0 海拔;1:相对 3D 世界地表;2:相对 3D 模型表面(单位:米)
        coordZ: 19.5,                                   // Z 轴高度(单位:米)
        distance: 656,                                  // 镜头距中心点距离(单位:米)
        heading: 16,                                    // 镜头偏航角(0正北, 0~359)
        pitch: 25,                                      // 镜头俯仰角(5~89)
        duration: 2,                                    // 飞行时间,秒
        fly: true                                       // true: 飞行动画(飞行时间根据当前点与目标点计算,则pitch及heading不生效, 会自行计算);
    });
}

添加楼层点位

JavaScript
// 楼层点位数据
let points1 = [
    {
        id: 'floor1',                             // 图层子对象 id,新建时调用者自己传入的唯一标识,用于各种操作的对象识别
        label: '一楼',                             // 图标标签文本
        coord: [113.93968949408, 22.51875640972], // XY 轴坐标,X:经度;Y:纬度
        coordZ: 80,                               // Z 轴高度(单位:米)
        type: 'legendName1' // 地标点的图例类别名称
    },
    {
        id: 'floor2',
        label: '二楼',
        coord: [113.93968949408, 22.51876640972],
        coordZ: 90,
        type: 'legendName1'
    },
    {
        id: 'floor3',
        label: '三楼',
        coord: [113.93968949408, 22.51877640972],
        coordZ: 100,
        type: 'legendName1'
    }
];
    

// 添加楼层地标图层
function addFloors() {
    let jsonData = {
        id: 'landmarkLayerId',      	// 图层对象 id,新建时调用者自己传入的唯一标识,用于各种操作的对象识别
        name: 'layerName',          	// 图层名称,支持为图层自定义名称
        coordType: 0,               	// XY 轴坐标类别,0:X 经度,Y 纬度;1:X 米,Y米,相对世界00点
        coordTypeZ: 0,              	// Z 轴坐标类别,0:相对 3D 世界 0 海拔;1:相对 3D 世界地表;2:相对 3D 模型表面(单位:米)
        autoScale: false,           	// 如果开启后,图标会按照摄像机远近自动缩放大小
        legends: [                  	// 定义图层包含图例,支持为不同图例定义各自样式
            {
                name: 'legendName1',    // 图层内图例名称,新建时调用者自己传入的唯一名称,用于各种操作的图例识别
                color: '#ffffff',       // 颜色(HEX 颜色值)
                iconName: 'site_03'
            }
        ],
        data: points1
    };
    window.appInstance.uniCall('addLandmarkLayer', jsonData, (res) => {
        window.appInstance.uniCall('pickOverlay', {
            overlayType: 'landmarkLayer',   // 图层对象类别
            idLayer: 'landmarkLayerId',     // 如果具体想限定图层对象,则填写图层对象 id,如不限制,可不填
            type: 'click',                  // 单选模式,click:点击选中;hover:悬停选中
            isShowDecorator: false          // 表示是否显示选中的高亮装饰符,true:显示,false:不显示,默认:true
        });
    });
}

第二步 ​

监听楼层点位点击事件,切换楼层视野,隐藏楼层点位,拆解楼层,添加楼层中相关图层

JavaScript
window.appInstance.uniCall('onLandmarkLayerClick', {}, (res) => {
    setPointShow(false);                //隐藏楼层点位
    showFloor(res.idObj.split('r')[1]); //拆解楼层
    setCamera2();                       //切换楼层视野
    addFloorPoints();                   //展示楼层中相关图层
});

隐藏楼层点位

JavaScript
function setPointShow(flag) {
    window.appInstance.uniCall('setOverlayVisibility', {
        id: 'landmarkLayerId',        // 图层对象 id,新建时调用者自己传入的唯一标识,用于各种操作的对象识别
        overlayType: 'landmarkLayer', // 图层对象类别,详见下表:图层对象类别
        visible: flag                 // 显隐控制,true:显示;false:隐藏
    });
}

拆解楼层

JavaScript
// 拆解楼层
function showFloor(floor) {
    let jsonData = {
        id: 'building01', // 模型对象 id,新建时调用者自己传入的唯一标识,用于各种操作的对象识别
        floor: floor,     // 要拆解的楼层号,1 楼为 1,地下一楼为 -1,依此类推
        animation: 1      // 楼层拆解动画类型,1:默认动画类型
    };
    appInstance.uniCall('showBuildingFloor', jsonData, (result) => {
        console.log('showBuildingFloor', result);
    });
}

聚焦楼层

JavaScript
function setCamera2() {
    window.appInstance.uniCall('setCamera', {
        centerCoord: [113.93969626514, 22.51876787552],
        coordType: 0,
        coordTypeZ: 0,
        coordZ: 19.5,
        distance: 300,
        heading: 16,
        pitch: 89,
        duration: 2,
        fly: true
    });
}

添加楼层中相关图层

JavaScript
function addFloorPoints() {
    let jsonData = {
        id: 'floorPoints',
        name: 'layerName',
        coordType: 0,
        coordTypeZ: 0,
        autoScale: false,
        legends: [
            {
                name: 'legend',
                color: '#ff0000',
                iconName: 'wifi'
            },
        ],
        data: points2
    };
    window.appInstance.uniCall('addLandmarkLayer', jsonData, (res) => {
        console.log('addLandmarkLayer', res);
    });
}

第三步 ​

点击返回按钮,恢复楼层,删除楼层内部点位,显示楼层点位

JavaScript
document.querySelectorAll('.btns div')[1].onclick = function () {
    setCamera1();
    resetBuilding();
    setPointShow(true);
    removeLayer();
};

恢复建筑

JavaScript
function resetBuilding() {
    let jsonData = {
        id: 'building01', // 模型对象 id,新建时调用者自己传入的唯一标识,用于各种操作的对象识别
        animation: 1     // 楼层拆解动画类型,1:默认动画类型
    };
    appInstance.uniCall('resetBuildingFloor', jsonData, (result) => {
        console.log('resetBuildingFloor', result);
    });
}

删除楼层内部点位

JavaScript
function removeLayer(flag) {
    window.appInstance.uniCall('removeOverlay', {
        id: 'floorPoints',
        overlayType: 'landmarkLayer'
    });
}

返回本章目录

4. 代码下载 ​

点击跳转到下载页面

返回本章目录