Skip to content

标注距离 ​

此功能案例实现点击开始标绘按钮后,点击地图,生成路径,并根据点位事实计算路径距离

目录 ​

1. 功能点 ​

  • 场景点击事件 onSceneClick
  • 添加地标图层 addLandmarkLayer
  • 更新地标图层 updateLandmarkLayerCoord
  • 添加路径图层 addPath
  • 更新路径图层 updatePathCoord

返回本章目录

2. 视频演示 ​

返回本章目录

3. 核心代码 ​

引入版本:3.1 起支持

第一步 ​

准备地标图数据变量、路径图数据变量,监听点击地图事件,根据点击次数添加或更新图层

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

监听点击事件

JavaScript
// 注册地图点击事件
window.appInstance.uniCall('addEventListener', {
    eventName: 'onSceneClick',
    callback: (res) => {  // 事件回调
        if (!isMark) {    // 未开启该功能,不做操作
            return
        }
        // 添加地标图数据
        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()
            let dis = getDistance(
                pathData[0].coord[1],
                pathData[0].coord[0],
                pathData[1].coord[1],
                pathData[1].coord[0] 
            )
            console.log('测算距离', dis)
        } else {
            // 更新地标图,更新路径
            upDatePoints()
            upDataPath()

            let dis = clacPathLength()
            document.querySelector('.center').className = 'center'
            document.querySelector('.center span').innerHTML = parseInt(dis) + '米'
            console.log('测算距离', dis)
        }
    }
})

第二步 ​

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

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',           // 限定图层对象
            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
}

返回本章目录

4. 代码下载 ​

点击跳转到下载页面

返回本章目录