基于高德地图实现后端传来两点坐标计算两点距离并显示

对于地图的基础使用,一个很常见的功能是知道两点的坐标,计算两点的距离,这个目前来讲无法通过数学计算来实现,这里就要使用高德地图自带的api来实现

首先创建地图并且创建点

html 复制代码
<template>
    <div id="container"></div>
</template>
javascript 复制代码
    window._AMapSecurityConfig = {
        securityJsCode: "23ffe9831a449eaf76f5b8158f5d4a77",
    };
    AMapLoader.load({
        key: "", // 申请好的Web端开发者Key,首次调用 load 时必填
        version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
        plugins: ["AMap.Scale"], //需要使用的的插件列表,如比例尺'AMap.Scale',支持添加多个如:['...','...']
    })
        .then((AMap) => {
            map = new AMap.Map("container", {
                // 设置地图容器id
                viewMode: "3D", // 是否为3D地图模式
                zoom: 17, // 初始化地图级别
                center: [103.89143, 30.765383], // 初始化地图中心点位置
                layers: [
                    // 卫星
                    new AMap.TileLayer.Satellite(),
                    // 路网
                    // new AMap.TileLayer.RoadNet()
                ],
                // mapStyle: "amap://styles/macaron", //设置地图的显示样式
            });
            createIcon(AMap, 'BS', "/map_icon/BS_icon.png", [25, 25], [0, 0], { lon: 103.89229, lat: 30.766229 }, [-15, -5])
            createIcon(AMap, 'UE', "/map_icon/UE_icon.png", [25, 25], [0, 0], { lon: map_data.map_data.lng, lat: map_data.map_data.lat }, [-15, -5])
            createIcon(AMap, 'beam', "/map_icon/beam.png", [50, 60], [0, 0], { lon: 103.89229, lat: 30.766229 }, [-28, 5])
            createIcon(AMap, 'BS_info', "/map_icon/BS_info.png", [120, 82], [0, 0], { lon: 103.89229, lat: 30.766229 }, [8, -35])
            ranging(AMap, map, point.value[0], point.value[1])
            UE_window_data.value = [
                {
                    id: 0,
                    title: '移动速度',
                    content: `${map_data.map_data.speed}m/s`
                },
                {
                    id: 1,
                    title: '经度',
                    content: `${point.value[1].getPosition().lng}°`
                },
                {
                    id: 2,
                    title: '纬度',
                    content: `${point.value[1].getPosition().lat}°`
                },
            ]
            create_window(AMap, map)
        })
        .catch((e) => {
            console.log(e);
        });

随后定义创建点的函数

javascript 复制代码
/**
 * 创建一个 Icon
 * @param {AMap} AMap 高德地图对象
 * @param {string} iconUrl 图标取图地址
 * @param {Array} icon_size 图标尺寸
 * @param {Array} img_size 图标内图片大小
 * @param {Array} icon_offset 图标取图偏移量
 * @param {Object} position 图标位置
 * @param {Array} position_icon_offset 相对坐标点的偏移量
 */
const createIcon = (AMap, marker_name, iconUrl, icon_size = [25, 34], icon_offset = [-9, -3], position, position_icon_offset = [-13, -30]) => {
    let startIcon = new AMap.Icon({
        // 图标尺寸
        size: new AMap.Size(icon_size[0], icon_size[1]),
        // 图标的取图地址
        image: iconUrl,
        // 图标所用图片大小
        imageSize: new AMap.Size(icon_size[0], icon_size[1]),
        // 图标取图偏移量
        imageOffset: new AMap.Pixel(icon_offset[0], icon_offset[1])
    });

    // 将 icon 传入 marker
    marker_name = new AMap.Marker({
        position: new AMap.LngLat(position.lon, position.lat),
        icon: startIcon,
        offset: new AMap.Pixel(position_icon_offset[0], position_icon_offset[1])
    });
    point.value.push(marker_name)
    map.add(marker_name);
}

接下来实现测距功能

javascript 复制代码
/**
 * 该方法用于实现测距功能
 * @param {AMap} AMap 高德地图对象
 * @param {map} map 已经实例化的地图对象
 * @param {Point} m1 第一个点
 * @param {Point} m2 第二个点
 */
const ranging = (AMap, map, m1, m2) => {
    console.log(map);

    // 添加测距功能
    let line = new AMap.Polyline({
        strokeOpacity: 1,
        strokeWeight: 0.1,
        strokeColor: '#80d8ff',
        isOutline: true,
        borderWeight: 2,
        outlineColor: '#80d8ff'
    });
    line.setMap(map);
    let text = new AMap.Text({
        text: '',
        style: {
            'background-color': 'rgba(0,0,0,0.4)',
            'border-color': 'rgba(0,0,0,0)',
            'font-size': '12px'
        }
    });
    text.setMap(map)
    function computeDis() {
        console.log(m2.getPosition());

        let p1 = m1.getPosition();
        let p2 = m2.getPosition();
        let textPos = p1.divideBy(2).add(p2.divideBy(2));
        let distance = Math.round(p1.distance(p2));
        let path = [p1, p2];
        line.setPath(path);
        text.setText('两点相距' + distance + '米')
        text.setPosition(textPos)
    }
    computeDis();
}

构建自定义信息窗体

javascript 复制代码
let UE_window_data = ref([])

const create_window = (AMap, map) => {
    let infoWindow = new AMap.InfoWindow({
        isCustom: true,  //使用自定义窗体
        content: createInfoWindow(),
        offset: new AMap.Pixel(-90, 70)
    });
    infoWindow.open(map, point.value[1].getPosition());
}

//构建自定义信息窗体
function createInfoWindow() {
    let info = document.createElement("div");
    info.className = "ue_info";
    let window_title = document.createElement("div");
    window_title.className = "window_title";
    let window_title_icon = document.createElement("div");
    window_title_icon.className = "window_title_icon";
    let window_title_content = document.createElement("div");
    window_title_content.className = "window_title_content";
    window_title_content.innerHTML = 'UE小车';
    window_title.appendChild(window_title_icon);
    window_title.appendChild(window_title_content);
    info.appendChild(window_title);
    for (let i = 0; i < UE_window_data.value.length; i++) {
        let ue_title = document.createElement("div");
        let ue_value = document.createElement("div");
        let title = `${UE_window_data.value[i].title}`
        let value = `${UE_window_data.value[i].content}`
        ue_title.innerHTML = title;
        ue_value.innerHTML = value;
        ue_title.className = "single_ue_box dark";
        ue_value.className = "single_ue_box light";
        info.appendChild(ue_title);
        info.appendChild(ue_value);
    }
    return info;
}

最后销毁地图

javascript 复制代码
onUnmounted(() => {
    map?.destroy();
});

看看最终效果

相关推荐
baozj3 分钟前
🚀 手动改 500 个文件?不存在的!我用 AST 撸了个 Vue 国际化神器
前端·javascript·vue.js
用户40993225021211 分钟前
为什么Vue 3的计算属性能解决模板臃肿、性能优化和双向同步三大痛点?
前端·ai编程·trae
海云前端112 分钟前
Vue首屏加速秘籍 组件按需加载真能省一半时间
前端
蛋仔聊测试13 分钟前
Playwright 中route 方法模拟测试数据(Mocking)详解
前端·python·测试
零号机24 分钟前
使用TRAE 30分钟极速开发一款划词中英互译浏览器插件
前端·人工智能
molly cheung1 小时前
FetchAPI 请求流式数据 基本用法
javascript·fetch·请求取消·流式·流式数据·流式请求取消
疯狂踩坑人1 小时前
结合400行mini-react代码,图文解说React原理
前端·react.js·面试
Mintopia1 小时前
🚀 共绩算力:3分钟拥有自己的文生图AI服务-容器化部署 StableDiffusion1.5-WebUI 应用
前端·人工智能·aigc
街尾杂货店&1 小时前
CSS - transition 过渡属性及使用方法(示例代码)
前端·css
CH_X_M1 小时前
为什么在AI对话中选择用sse而不是web socket?
前端