高德地图WEB端,在所画的圆(Circle)内显示在圆(Marker)内的点

本文介绍如何使用高德地图API在网页中绘制折线、多边形和圆形,并通过示例展示了如何判断点是否位于圆内。示例中包含了完整的HTML代码,包括地图初始化、圆形绘制及点的判断。

1.圆和点都是自己定义的,如图:

2.在高德地图的示例中心测试通过,代码如下:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
    <title>折线、多边形、圆</title>
    <link rel="stylesheet" href="http://cache.amap.com/lbs/static/main1119.css"/>
    <script src="http://webapi.amap.com/maps?v=1.3&key=您申请的key值"></script>
    <script type="text/javascript" src="http://cache.amap.com/lbs/static/addToolbar.js"></script>
</head>
<body>
<div id="container"></div>
<script>
    var map = new AMap.Map('container', {
        resizeEnable: true,
        center: [116.397428, 39.90923],
        zoom: 13
    });


    var circle = new AMap.Circle({
        center: new AMap.LngLat("116.403322", "39.920255"),// 圆心位置
        radius: 1000, //半径
            strokeColor: "#FF33FF", //线颜色
            strokeOpacity: 0.2, //线透明度
            strokeWeight: 3,    //线宽
            fillColor: "#1791fc", //填充色
            fillOpacity: 0.05//填充透明度
    });

          //声明一个list
        var list={
          "size":4,
          "data":[
            {"x":116.397428,"y": 39.921883},
            {"x":116.397428,"y": 39.920213},
            {"x":116.403322,"y": 39.922282},
            {"x":116.403322,"y": 39.920249}
          ]
        }

        for(var j = 0,map;j < list.size; j++){
            var myObj= list.data[j];
            var myLngLat=new AMap.LngLat(myObj.x,myObj.y);
            console.log(circle.contains(myLngLat));
          if(circle.contains(myLngLat)){//如果点在圆内则输出
              var marker = new AMap.Marker({
                   position: myLngLat,
                   map: map
               });
          }

        }

    circle.setMap(map);//显示圆圈
     map.setFitView();//根据地图上添加的覆盖物分布情况,自动缩放地图到合适的视野级别
</script>
</body>
</html>
<think> 我们正在处理一个Vue2项目,需要在高德地图显示多个用户(即多个标记),并且支持在地图上绘制形区域(画圈),然后实时显示选中的形区域内的用户数据。 根据引用[1]中提到的内容,我们可以使用高德地图SDK的自定义标记(Marker)来显示用户,同时使用高德地图的绘制工具(如Circle)来绘制形区域,并计算哪些用户位于形区域内。 实现步骤大致如下: 1. 在Vue2项目中集成高德地图JS API,并创建地图实例。 2. 准备用户数据(经纬度坐标),并在地图上以标记的形式展示。 3. 使用高德地图的绘制工具(AMap.CircleEditor或AMap.MouseTool)让用户可以在地图上绘制形。 4. 监听形区域的绘制事件,在绘制完成或修改时,实时计算形区域内包含的用户。 5. 将选中的用户数据展示出来。 下面我们详细说明每一步的实现方法。 ### 步骤1:集成高德地图并创建地图实例 首先,在Vue2项目中引入高德地图JS API。可以通过在index.html中引入脚本,或者使用npm安装高德地图的加载器(如vue-amap)。这里我们使用直接引入脚本的方式(简单示例)。 #### 在index.html中引入高德地图JS API(请替换成你的key): ```html <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=你的key&plugin=AMap.MouseTool,AMap.CircleEditor"></script> ``` 注意:我们需要使用绘制形和编辑形的功能,所以需要加载`AMap.MouseTool`和`AMap.CircleEditor`这两个插件。 然后,在Vue组件中创建地图容器: ```html <template> <div id="mapContainer"></div> </template> ``` 在mounted生命周期中初始化地图: ```javascript mounted() { this.initMap(); }, methods: { initMap() { // 创建地图实例 this.map = new AMap.Map('mapContainer', { zoom: 11, // 初始化地图层级 center: [123.4, 41.8] // 沈阳市的大致中心经纬度 }); } } ``` ### 步骤2:添加用户标记 假设我们有一组用户数据(模拟数据),每个用户包含经纬度坐标。我们遍历这些数据,创建标记并添加到地图上。 在data中定义用户数据(模拟数据): ```javascript data() { return { map: null, // 地图实例 markers: [], // 存储所有标记 // 模拟用户数据,实际应从后获取 userList: [ { id: 1, name: '用户1', lnglat: [122.5, 41.2] }, { id: 2, name: '用户2', lnglat: [122.6, 41.3] }, // ... 更多用户 ] } }, ``` 在initMap方法中,添加标记: ```javascript initMap() { // 初始化地图... // 添加标记 this.userList.forEach(user => { const marker = new AMap.Marker({ position: new AMap.LngLat(...user.lnglat), title: user.name }); marker.setMap(this.map); this.markers.push(marker); }); } ``` ### 步骤3:使用绘制工具让用户可以绘制形 我们需要使用高德地图的鼠标工具(AMap.MouseTool)来绘制形。可以添加一个按钮,击后开始绘制形。 在模板中添加一个按钮: ```html <button @click="startDrawCircle">绘制形</button> ``` 在方法中实现绘制形的逻辑: ```javascript methods: { // ...其他方法 startDrawCircle() { // 清除已有的绘制状态 if (this.mouseTool) { this.mouseTool.close(); } // 初始化鼠标工具 this.mouseTool = new AMap.MouseTool(this.map); // 使用鼠标工具绘制形 this.mouseTool.circle({ strokeColor: '#FF33FF', strokeOpacity: 1, strokeWeight: 2, fillColor: '#1791fc', fillOpacity: 0.4, // 可自定义其他样式 }); // 监听绘制完成事件 this.mouseTool.on('draw', (event) => { const circle = event.obj; // 绘制完成的形对象 // 保存形对象,并启动编辑功能(可选) this.circle = circle; this.enableCircleEditor(circle); // 在绘制完成后,立即计算一次形内的用户 this.getUsersInCircle(circle); }); }, // 启用形编辑器,允许用户调整形 enableCircleCircleEditor(circle) { if (this.circleEditor) { this.circleEditor.close(); } this.circleEditor = new AMap.CircleEditor(this.map, circle); this.circleEditor.open(); // 监听编辑事件,当形被修改时重新计算 circle.on('change', () => { this.getUsersInCircle(circle); }); } } ``` ### 步骤4:计算形区域内的用户 我们需要遍历所有用户判断每个是否在绘制的形区域内。高德地图形对象(AMap.Circle)提供了`contains`方法来判断是否内。 实现方法`getUsersInCircle`: ```javascript methods: { getUsersInCircle(circle) { const circleCenter = circle.getCenter(); // 心 const circleRadius = circle.getRadius(); // 半径(米) const usersInCircle = []; this.userList.forEach((user, index) => { const marker = this.markers[index]; const point = marker.getPosition(); // 标记的经纬度 // 计算心的距离 const distance = circleCenter.distance(point); // 单位:米 // 如果距离小于的半径,则在内 if (distance <= circleRadius) { usersInCircle.push(user); } }); // 更新选中的用户数据,用于显示 this.selectedUsers = usersInCircle; // 这里可以触发更新UI显示选中的用户列表 } } ``` ### 步骤5:显示选中的用户数据 在模板中,我们可以通过一个列表来展示选中的用户数据: ```html <div> <h3>选中的用户</h3> <ul> <li v-for="user in selectedUsers" :key="user.id"> {{ user.name }} </li> </ul> </div> ``` 在data中定义selectedUsers: ```javascript data() { return { // ...其他数据 selectedUsers: [] // 选中的用户 } } ``` ### 注意事项 1. 当用户数据量很大时,遍历计算可能会影响性能,可以考虑使用空间索引(如网格索引或四叉树)来优化。 2. 在绘制完成后,我们开启了形的编辑功能,这样用户可以调整形的大小和位置,同时会触发重新计算。 3. 如果不需要编辑功能,可以省略编辑器的部分。 以上就是一个基本的实现流程。根据引用[2],如果你使用Vue+OpenLayers,可能实现方式不同,但用户需求是高德地图,所以这里以高德地图SDK为例。 在实际项目中,你可能需要根据实际情况调整,例如用户数据的获取方式、标记的样式、形的样式以及选中用户数据的展示方式等。 下面生成相关问题。 §§相关问题§§ 1. 在高德地图中,如何优化大量标记的显示性能? 2. 如何在高德地图中绘制多边形区域并计算区域内的用户? 3. Vue2项目中如何使用vue-amap(高德地图Vue组件)来实现上述功能? </think> 根据您的需求,在Vue2项目中实现高德地图多用户展示与圈选功能的完整解决方案如下: ### 一、核心实现步骤 1. **初始化地图与标记** ```vue <template> <div id="mapContainer"></div> </template> <script> export default { mounted() { // 加载高德地图API const key = '您的高德API密钥'; const script = document.createElement('script'); script.src = `https://webapi.amap.com/maps?v=2.0&key=${key}&plugin=AMap.MouseTool,AMap.CircleEditor`; script.onload = this.initMap; document.head.appendChild(script); }, methods: { initMap() { // 创建地图实例(以沈阳市中心为例) this.map = new AMap.Map('mapContainer', { center: [123.43, 41.80], // 沈阳中心坐标 zoom: 12 }); // 加载用户数据(示例数据) this.loadUserMarkers([ { id: 1, name: "用户A", lnglat: [123.40, 41.82] }, { id: 2, name: "用户B", lnglat: [123.45, 41.78] } // ...更多用户数据 ]); }, loadUserMarkers(users) { this.markers = users.map(user => { return new AMap.Marker({ position: user.lnglat, content: `<div class="user-marker">${user.name}</div>` }); }); this.map.add(this.markers); } } } </script> ``` 2. **绘制圈并实时筛选用户** ```javascript methods: { // 启用绘图模式 enableCircleDrawing() { this.mouseTool = new AMap.MouseTool(this.map); this.mouseTool.circle({ strokeColor: '#FF33FF', fillOpacity: 0.3 }); // 监听绘制完成事件 this.mouseTool.on('draw', (e) => { this.circle = e.obj; this.circleEditor = new AMap.CircleEditor(this.map, this.circle); this.circleEditor.open(); this.filterUsersInCircle(); // 监听形编辑事件 this.circle.on('change', this.filterUsersInCircle); }); }, // 筛选圈内用户 filterUsersInCircle() { if (!this.circle) return; const center = this.circle.getCenter(); const radius = this.circle.getRadius(); const usersInCircle = []; this.markers.forEach(marker => { const position = marker.getPosition(); const distance = center.distance(position); // 计算距离(米) if (distance <= radius) { usersInCircle.push(marker); // 高亮显示被选中的标记 marker.setContent('<div class="selected-marker">●</div>'); } else { marker.setContent('<div class="user-marker">○</div>'); } }); this.$emit('users-selected', usersInCircle); } } ``` 3. **实时数据显示组件** ```vue <template> <div class="selection-panel"> <button @click="enableCircleDrawing">绘制选区</button> <div v-if="selectedUsers.length"> <h3>选中用户: {{ selectedUsers.length }}人</h3> <ul> <li v-for="user in selectedUsers" :key="user.id"> {{ user.name }} - 坐标: {{ user.lnglat }} </li> </ul> </div> </div> </template> ``` ### 二、关键优化建议 1. **大数据量优化方案** - 使用`AMap.Loca`云渲染(支持万级) ```javascript const loca = new Loca.Container({ map: this.map }); const pointLayer = new Loca.PointLayer({ zIndex: 10 }); pointLayer.source = new Loca.GeoJSONSource({ data: usersGeoJSON }); ``` 2. **地理围栏算法优化** - 使用四叉树空间索引快速检索 ```javascript // 创建空间索引 this.quadTree = new AMap.QuadTree(); this.markers.forEach(marker => this.quadTree.add(marker)); // 快速查询 const bounds = this.circle.getBounds(); const candidates = this.quadTree.search(bounds); ``` 3. **性能监控** ```javascript // 添加绘制耗时监控 console.time('circle-filter'); // ...筛选逻辑 console.timeEnd('circle-filter'); // 保持 < 50ms ``` ### 三、推荐扩展功能 1. **多边形选区支持** ```javascript this.mouseTool.polygon({ strokeColor: '#28F', fillColor: '#1A6' }); ``` 2. **实时数据同步** - 使用WebSocket推送用户位置更新 ```javascript const ws = new WebSocket('wss://your-server/location-updates'); ws.onmessage = (event) => { this.updateMarkerPositions(JSON.parse(event.data)); }; ``` ### 四、注意事项 1. **坐标系统规范** - 所有坐标需使用GCJ-02坐标系(高德标准) - 经纬度范围验证:`lng: [122.25, 123.48], lat: [41.12, 42.17]` 2. **内存管理** ```javascript beforeDestroy() { // 销毁时释放资源 this.map.destroy(); this.mouseTool.close(); } ``` 完整实现参考高德地图JS API文档: - [标记](https://lbs.amap.com/api/javascript-api/guide/overlays/marker) - [形绘制](https://lbs.amap.com/api/javascript-api/guide/overlays/circle) - [坐标计算](https://lbs.amap.com/api/javascript-api/guide/calcutation/geolocation)[^1]
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值