高德地图自定义marker图标及点击marker显示内容框

本文介绍了如何通过高德地图API创建地图,设置样式,添加自定义标记,并实现点击标记后的信息窗口展示。关键步骤包括申请API key,创建地图容器,以及利用Geocoder进行地址解析。

1、首先创建高德地图账号,根据调用的接口申请高德地图API,这里使用了地图js API和Web服务 的key。首先引入高德地图调用的js接口

<script src="https://webapi.amap.com/maps?v=1.4.15&key=申请的key"></script>//Web服务 的key
<script src="https://webapi.amap.com/maps?v=1.4.15&key=申请的key&plugin=AMap.Geocoder"></script>//地图js API的key

2、创建一个地图容器

<div id="container"></div>

3、需要给容器设定高度和宽度

html,body{
	width: 100%;
	height: 100%;
}
#container {
	width: 100%;
	height: 100%;
	overflow-y: hidden;
}

4、js代码

//初始化地图对象,加载地图
var map = new AMap.Map("container", {
	resizeEnable: true, 
	mapStyle: 'amap://styles/whitesmoke', //设置地图的显示样式
	center: [104.164941,30.671515],
});
var geocoder = new AMap.Geocoder({
    city: "", //城市设为北京,默认:“全国”
});
var infoWindow = new AMap.InfoWindow({offset: new AMap.Pixel(0, -30)});
var lnglats = ["104.100303","30.654034"];//标记点的经纬度
//创建marker图标的大小和图片路径 ---如果是多个点可把下方代码放入循环进行循环标点
var startIcon = new AMap.Icon({
	// 图标尺寸
	size: new AMap.Size(32, 32),
	// 图标的取图地址
	image: '../img/biaoji.png',
	// 图标所用图片大小
	imageSize: new AMap.Size(32, 32),
	// 图标取图偏移量
	imageOffset: new AMap.Pixel(-5, 0)
});
//创建marker
var marker = new AMap.Marker({
	position: lnglats,
	icon: startIcon ,
    map: map
});
marker.content = "<div>我是弹出内容</div>";//绑定点击marker弹出的内容样式
marker.on('click', markerClick);
function markerClick(e) {
		infoWindow.setContent(e.target.content);
		infoWindow.open(map, e.target.getPosition());
}
//如果多个点循环结束的地方
map.setFitView();
window.onload = function() {
	map.plugin(["AMap.ToolBar"], function() {
		map.addControl(new AMap.ToolBar());
	});
	if(location.href.indexOf('&guide=1')!==-1){
		map.setStatus({scrollWheel:false})
	}
}
<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.安装L7L7高德地图驱动:```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],具体实现需根据项目实际需求调整。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值