使用L7map从零开始打造在地图上展示自定义图标,并可以动态定位

1.创建点图层并展示在地图上

 快速上手 | L7

1.1初始化地图 

<template>

 <div ref="l7MapContainer" class="l7-map"></div> //地图位置

</template>

<script setup>

import { Map as L7Map } from '@antv/l7-maps'

import { Scene, PointLayer, RasterLayer, HeatmapLayer } from '@antv/l7'  

import LocateIcon from '@/assets/icons/svg/locate-icon.svg'   //自定义图片位置

//地图初始化加载

function initMap() {
  let mapDom = l7MapContainer.value
  scene = new Scene({
    id: mapDom,
    logoVisible: false,
    renderer: 'regl',
    // pickBufferScale: 2,
    map: new L7Map({
      // pitch: 40,
      // style:'dark',
      zoom: 13, // 初始化地图层级
      center: [115, 39]  //此处换成自己想要的地图中心经纬度
    })
  })

  scene.on('loaded', () => {

  //添加定位图片,此处的作用是将自定义图片加载进scene中
    scene.addImage('tubiao', LocateIcon)
    // 添加聚合点图片
    scene.addImage('allpoint', getAssetsImages('allpoint.png'))
  })

//地图缩放时,执行。

scene.on('zoomend', () => {
            changeIocn() //我自定义的方法,后续介绍,用来精确定位点位的
    })
}

</script>

1.2初始化点图层

 //单点图层

pointsLayer.value = new PointLayer({ zIndex: 666 })
    .source(pointData, {
      parser: {
  &nb

<think>我们正在使用Vue.js集成高德地图实现自定义Marker图标。根据引用[1]和引用[2]中的示例,我们可以通过两种方式实现:一种是使用高德地图原生Marker类,另一种是使用AntV L7(基于高德地图)的Marker。用户需求:在Vue使用高德地图自定义Marker图标。我们将提供两种方法的实现步骤:方法一:使用高德地图原生JavaScriptAPI(适合直接使用高德地图的情况)步骤:1.在项目中引入高德地图JavaScriptAPI。2.Vue组件中创建地图容器。3.在data中定义需要显示的markers数组,每个marker对象包含位置(position)、图标(icon)等属性。4.在mounted生命周期钩子中初始化地图遍历markers数组创建自定义Marker,添加到地图上。方法二:使用AntVL7(适合需要更丰富可视化效果的场景)步骤:1.安装AntV L7依赖。2.Vue组件中创建地图容器。3.在data中定义marker数据。4.在mounted生命周期钩子中初始化L7场景,然后使用自定义的HTML元素创建Marker添加到场景中。下面分别详细说明:方法一:使用高德地图原生API步骤详解:1.引入高德地图JSAPI:在public/index.html中引入高德地图JSAPI的script标签,或者使用npm方式(如使用vue-amap等,但这里我们使用直接引入的方式,因为用户没有指定具体使用方式,且引用[1]中也是直接使用)。注意:如果使用npm方式,可以安装`@amap/amap-jsapi-loader`,但这里为了简单,我们采用引用[1]中的方式。2.Vue组件中:-模板中定义一个div作为地图容器,设置id和样式。-在data中定义地图对象和markers数组(包含位置和图标)。-在mounted中初始化地图,然后循环创建Marker。示例代码(参考引用[1]):```vue<template><divid="map-container" style="width:100%;height:500px;"></div></template> <script>export default{data(){return {map: null,markers:[{ position: [118.791545,31.9624], icon: require("../assets/xc/ren.png")},// ...其他点]};},mounted(){//初始化地图this.map= newAMap.Map('map-container', {zoom:13,//初始化地图级别center: [118.791545,31.9624] //初始化地图中心点});//创建markerthis.markers.forEach(item =>{const marker= newAMap.Marker({position:item.position,icon: item.icon,//这里可以是图片路径,也可以是AMap.Icon的实例offset: newAMap.Pixel(-13, -30)//偏移量,根据图标大小调整,使图标中心对准坐标点});marker.setMap(this.map);});} };</script> ```注意:如果使用require引入图片,确保图片路径正确。也可以直接使用在线图片链接。方法二:使用AntVL7(需要安装依赖)步骤详解:1.安装L7和L7高德地图驱动:```bashnpminstall @antv/l7@antv/l7-maps```2.Vue组件中:-创建地图容器(同上)。-在data中定义数据。-在mounted中初始化L7场景,然后使用L7.Marker添加自定义Marker。示例代码(参考引用[2]):```vue<template><div id="map-container"style="width:100%; height:500px;"></div> </template><script> import{ Scene} from'@antv/l7';import {GaodeMap} from'@antv/l7-maps';export default{data(){return {scene: null,data: [{lng:118.791545, lat:31.9624, name: '点1' },//...其他点]};},mounted(){this.initMap();},methods:{async initMap(){//初始化场景this.scene =new Scene({id:'map-container',map: newGaodeMap({pitch:0,style: 'dark',center: [118.791545,31.9624],zoom:13})});this.scene.on('loaded',() =>{this.drawMarker();});},drawMarker(){this.data.forEach(item=> {//创建自定义的HTML元素作为markerletel =document.createElement('div');el.className ='marker-wrap';//这里可以自定义HTML结构,例如添加图标和文字el.innerHTML =`<divclass="marker"><imgsrc="${require('../assets/xc/ren.png')}"alt="marker"style="width:30px;height:30px;"><span class="title">${item.name}</span></div>`;//创建L7Marker添加到场景constmarker =new L7.Marker({element:el }).setLnglat([item.lng, item.lat]).addTo(this.scene);});}} };</script> <style>/*可以在这里定义marker的样式 */.marker-wrap{position:relative;} .marker{text-align: center; }.title{display:block;margin-top:5px;background: rgba(0,0,0,0.5);color:#fff;padding:2px5px;border-radius:3px;white-space:nowrap; }</style> ```两种方法比较:方法一:直接使用高德地图API,简单直接,适合基础标记点功能。方法二:使用AntVL7,适合需要复杂可视化效果(如热力图、轨迹图等)的场景,自定义Marker更灵活(可以任意HTML内容),但需要额外学习L7。根据用户需求,如果只需要自定义图标使用方法一即可。如果希望有更丰富的自定义内容(比如在Marker上添加复杂的HTML结构),则可以选择方法二。注意事项:1.使用高德地图需要申请key,在初始化地图时传入(在两种方法中都需要)。在方法一中,如果通过script标签引入,需要在引入时带上key(如:`https://webapi.amap.com/maps?v=1.4.15&key=你的key`)。在方法二中,初始化GaodeMap时传入key(参数:map:newGaodeMap({key:'你的key',... }))。2.图标路径:使用require引入本地图片时,确保路径正确。也可以使用在线图片地址。相关问题:1.如何在高德地图中给自定义Marker添加点击事件?2.如何优化大量Marker的显示性能?3.Vue使用高德地图有哪些常见问题?</think>在 Vue使用高德地图自定义 Marker 图标,可以通过以下两种方法实现: ### 方法一:使用高德地图原生 API(推荐) ```vue <template> <div id="map-container" style="width: 100%; height: 500px"></div> </template> <script> export default { data() { return { map: null, markers: [ { position: [116.397428, 39.90923], // 经纬度 icon: require("@/assets/marker1.png") // 本地图标 }, { position: [116.407428, 39.91923], icon: "https://example.com/marker2.png" // 在线图标 } ] }; }, mounted() { // 初始化地图 this.map = new AMap.Map("map-container", { zoom: 13, center: [116.397428, 39.90923] }); // 添加自定义 Marker this.addCustomMarkers(); }, methods: { addCustomMarkers() { this.markers.forEach(item => { const marker = new AMap.Marker({ position: item.position, icon: item.icon, // 直接使用图标路径 offset: new AMap.Pixel(-15, -30) // 调整图标锚点 }); marker.setMap(this.map); }); } } }; </script> ``` ### 方法二:使用 AntV L7 可视化库 ```vue <template> <div id="map-container" style="width: 100%; height: 500px"></div> </template> <script> import { Scene } from '@antv/l7'; import { GaodeMap } from '@antv/l7-maps'; export default { data() { return { scene: null, markers: [ { lng: 116.397428, lat: 39.90923, name: "位置1" }, { lng: 116.407428, lat: 39.91923, name: "位置2" } ] }; }, mounted() { this.initMap(); }, methods: { async initMap() { this.scene = new Scene({ id: "map-container", map: new GaodeMap({ center: [116.397428, 39.90923], zoom: 13 }) }); await this.scene.once("loaded"); this.addCustomMarkers(); }, addCustomMarkers() { this.markers.forEach(item => { const el = document.createElement("div"); el.className = "custom-marker"; el.innerHTML = ` <img src="${require('@/assets/marker.png')}" alt="标记"> <span>${item.name}</span> `; new L7.Marker({ element: el }) .setLnglat([item.lng, item.lat]) .addTo(this.scene); }); } } }; </script> <style> .custom-marker { text-align: center; } .custom-marker img { width: 30px; height: 40px; } .custom-marker span { display: block; background: white; padding: 2px 5px; border-radius: 3px; } </style> ``` ### 关键说明: 1. **图标配置** - 本地图片:使用 `require('@/assets/icon.png')` - 在线图片:直接使用 URL 字符串 - 锚点调整:通过 `offset` 属性微调位置(单位:像素) 2. **注意事项** - 高德地图 API 需提前引入(推荐通过 `<script>` 标签或 `@amap/amap-jsapi-loader`) - 图标尺寸建议:32x32px 或 64x64px - 内存管理:组件销毁时手动移除 Marker(`marker.setMap(null)`) 3. **性能优化** - 大量 Marker 使用 `AMap.MarkerCluster` 聚合 - 动态加载图标(仅可视区域内渲染) ### 相关问题 1. 如何在高德地图实现 Marker 的点击事件交互? 2. 大量 Marker 显示时如何进行性能优化? 3. Vue 中如何封装可复用的高德地图组件? 4. 如何实现自定义 Marker 的动画效果(如跳动、旋转)? 5. 在移动端使用高德地图有哪些特殊注意事项? > 引用说明:示例代码参考了高德地图官方文档和社区实践中 Marker 的实现方式[^1][^2],具体实现需根据项目实际需求调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路过的帅小虎

感谢帅哥美女的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值