Skip to content

区域标绘 ​

此功能案例实现点击开始标绘按钮后,点击地图,生成路径,点击结束标绘按钮,按照路径,生成区域图

目录 ​

1. 功能点 ​

  • 场景点击事件 onSceneClick
  • 添加地标图层 addLandmarkLayer
  • 更新地标图层 updateLandmarkLayerCoord
  • 添加路径图层 addPath
  • 更新路径图层 updatePathCoord
  • 删除图层 removeOverlay
  • 添加区域图 addArea

返回本章目录

2. 视频演示 ​

返回本章目录

3. 核心代码 ​

引入版本:3.1 起支持

第一步 ​

准备地标图数据变量、路径图数据变量,点击开始标绘按钮,监听点击地图事件,根据回调信息,添加数据

JavaScript
// 地标图数据
let pointsData = []
// 路径图数据
let pathData = [] 
// 区域图数据
let pathData = []

监听点击事件

JavaScript
// 注册地图点击事件
window.appInstance.uniCall('addEventListener', {
    eventName: 'onSceneClick',
    callback: (res) => {
        if (!isMark) {
            return
        }
        console.log(res.data[0].coordZ, 111)

        let point = {
            id: 'point' + Date.now(),
            label: '',
            coord: res.data[0].coord,
            coordZ: res.data[0].coordZ,
            type: 'legendName1',
        }
        pointsData.push(point)
        pathData.push({
            coord: res.data[0].coord,
            coordZ: res.data[0].coordZ,
        })
        if (pointsData.length == 1) {
            addPoints()
        } else if (pointsData.length == 2) {
            upDatePoints()
            addPath()
        } else {
            upDatePoints()
            upDataPath()
        }
    }
})

第二步 ​

添加地标图方法封装,更新地标图方法封装,添加轨迹图方法封装,更新轨迹图方法封装

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

更新地标图

JavaScript
// 更新点位数据
function upDatePoints() {
    window.appInstance.uniCall('updateLandmarkLayerCoord', {
        id: 'layerId',     // 图层对象 id,新建时调用者自己传入的唯一标识,用于各种操作的对象识别
        name: 'layerName', // 图层名称,支持为图层自定义名称
        coordType: 0,      // XY 轴坐标类别,0:X 经度,Y 纬度;1:X 米,Y米,相对世界00点
        coordTypeZ: 0,     // Z 轴坐标类别,0:相对 3D 世界 0 海拔;1:相对 3D 世界地表;2:相对 3D 模型表面(单位:米)
        isAppend: true,    // 是否追加数据(按顺序),true:按新数据 更新原有重复数据 & 追加新数据;false:清除原有数据 & 重建新数据
        data: pointsData   // 定义图层可视化数据
    })
}

添加轨迹图

JavaScript
// 添加路径
function addPath() {
    window.appInstance.uniCall('addPath', {
        id: 'pathID',         // 图层对象 id,新建时调用者自己传入的唯一标识,用于各种操作的对象识别
        name: 'layerName',    // 图层名称,支持为图层自定义名称
        coordType: 0,         // XY 轴坐标类别,0:X 经度,Y 纬度;1:X 米,Y米,相对世界00点
        coordTypeZ: 0,        // Z 轴坐标类别,0:相对 3D 世界 0 海拔;1:相对 3D 世界地表;2:相对 3D 模型表面(单位:米)
        type: 'Segment03',    // 路线样式类别,详见下表:路线样式类别
        color: '#ff0000',     // 路线颜色,"" 颜色透明(HEX 颜色值)
        colorPass: '#ffff00', // 模型对象 移动经过后的 路径颜色(HEX 颜色值)
        width: 20,            // 路径宽度(单位:米)
        points: [             // 定义路径途径点
            {
                coord: pointsData[0].coord,   // XY 轴坐标,X:经度;Y:纬度
                coordZ: pointsData[0].coordZ  // Z 轴高度(单位:米)
            },
            {
                coord: pointsData[1].coord,
                coordZ: pointsData[1].coordZ 
            }
        ]
    })
}

更新轨迹图

JavaScript
// 更新路径图
function upDataPath() {
    window.appInstance.uniCall('updatePathCoord', {
        id: 'pathID',      // 图层对象 id,新建时调用者自己传入的唯一标识,用于各种操作的对象识别
        name: 'layerName', // 图层名称,支持为图层自定义名称
        coordType: 0,      // XY 轴坐标类别,0:X 经度,Y 纬度;1:X 米,Y米,相对世界00点
        coordTypeZ: 0,     // Z 轴坐标类别,0:相对 3D 世界 0 海拔;1:相对 3D 世界地表;2:相对 3D 模型表面(单位:米)
        isAppend: false,   // 是否追加数据(按数据顺序),true:在原有数据后方追加数据;false:清除原有数据,更新数据
        points: pathData   // 定义路径途径点
    })
}

第三步 ​

封装测距方法,在页面中展示距离

JavaScript
// 两点间距离
function getDistance(lat1, lon1, lat2, lon2) {
    lat1 = lat1 || 0
    lon1 = lon1 || 0
    lat2 = lat2 || 0
    lon2 = lon2 || 0

    var rad1 = (lat1 * Math.PI) / 180.0
    var rad2 = (lat2 * Math.PI) / 180.0
    var a = rad1 - rad2
    var b = (lon1 * Math.PI) / 180.0 - (lon2 * Math.PI) / 180.0
    var r = 6378137
    var distance =
        r *
        2 *
        Math.asin(
            Math.sqrt(
                Math.pow(Math.sin(a / 2), 2) +
                Math.cos(rad1) * Math.cos(rad2) * Math.pow(Math.sin(b / 2), 2) 
            )
        )
    return distance
}

// 计算路径距离
function getPathDistance() {
    let dis = 0
    for (let i = 1; i < pointsData.length; i++) {
        let temp = [
            pointsData[i - 1].coord[1],
            pointsData[i - 1].coord[0],
            pointsData[i].coord[1],
            pointsData[i].coord[0] 
        ]
        dis += getDistance(temp[0], temp[1], temp[2], temp[3])
    }
    return dis
}

第四步 ​

结束标绘后,删除地表图,删除路径图,添加区域图

JavaScript
// 删除图层
function removeLayer(id, layerType) {
    window.appInstance.uniCall('removeOverlay', {
        id: id,                 // 图层Id
        overlayType: layerType  //图层类型
    })
}

根据点位数据信息,生成区域图数据,添加区域图

JavaScript
// 添加区域图
function addArea() {
    let areaData = pathData.map((item) => {
        return {
            coord: item.coord
        }
    })
    window.appInstance.uniCall('addArea', {
        id: 'AreaId',                      // 图层对象 id,新建时调用者自己传入的唯一标识,用于各种操作的对象识别
        name: 'layerArea',                 // 图层名称,支持为图层自定义名称
        coordType: 0,                      // XY 轴坐标类别,0:X 经度,Y 纬度;1:X 米,Y米,相对世界00点
        coordTypeZ: 0,                     // Z 轴坐标类别,0:相对 3D 世界 0 海拔;1:相对 3D 世界地表;2:相对 3D 模型表面(单位:米)
        coordZ: pointsData[0].coordZ + 30, // 高度(单位:米)
        type: 'Segment01',                 // 区域边界样式类别
        color: '#ff0000',                  // 颜色(HEX 颜色值)
        areaHeight: 30,                    // 围栏高度(单位:米)
        fillArea: 'Segment01',             // 区域填充样式类别
        fillPosition: 'top',               // 区域填充的位置,top/bottom,默认top
        points: areaData                   // 定义区域边界
    })
}

返回本章目录

4. 代码下载 ​

点击跳转到下载页面

返回本章目录