百度地图api
方式一
注册账号密码,拿到ak 将html的demo改造成vue格式 BMapGL of undefined报错:vue中需要用window.xxx来处理
var map = new BMapGL.Map ( "baidumap" ) ; // 创建Map实例
var point = new BMapGL.Point ( 116.404, 39.915) ; // 创建点坐标
以上改为----》
var map = new window.BMapGL.Map ( "baidumap" ) ; // 创建Map实例
var point = new window.BMapGL.Point ( 116.404, 39.915) ; // 创建点坐标
}
Map of undefined报错:接口地址问题、地图没有高度
接口地址:-------api改为getscript
https : //api.map.baidu.com/getscript?type=webgl&v=1.0&ak=换为自己的
地图容器赋予高度
height:100% 按需改掉,比如 : height : 80vw
自定义图标。图标一片漆黑错误:setImageSize方法没写。图标不显示错误:setImageSize方法值不是对象。完整写法
let myIcon = new BMap.Icon (
"图片地址" ,
new BMap.Size ( 60, 60) //图标可视区大小
) ;
//设置图标大小。注意:值必须为new的大小(不写导致图标漆黑,写错导致图标不展示)
myIcon.setImageSize ( new BMap.Size ( 60, 60) ) ;
自定义信息窗口。通过InfoBox,具体看文档demo(这种信息窗口可随意加css样式)
1 、将文档demo中的js代码拷贝引入vue,不用import ,要等地图api的js文件加载完后再引入(此js代码可用于处理关闭信息窗口的事件)
2 、BMapLib也要用window. BMapLib
3 、InfoBox中的boxStyle中设置有背景图片,所以在样式中自己设置没有效果
4 、将html部分包括样式,提出到单独的html文件中(因为在一个vue中代码太多,样式不好调试)
5 、用axios异步导入html文件,打印一下res. data发现就是html全代码
6 、注意:关闭按钮图片需要closeIconUrl设置,图片大小需要改动引入的js文件中的对应样式
7 、最后带入到InfoBox中
< template>
< div>
< div id= "baidumap" > < / div>
< / div>
< / template>
< script>
let BMap = { } ;
let map = { } ;
import axios from "axios" ;
export default {
data ( ) {
return {
point: { } ,
} ;
} ,
mounted ( ) {
this . loadMainJScript ( ) ;
setTimeout ( ( ) => {
this . addMarker ( ) ;
} , 2000 ) ;
} ,
methods: {
loadMainJScript ( ) {
console. log ( "主函数加载完成" ) ;
var script = document. createElement ( "script" ) ;
script. type = "text/javascript" ;
script. src =
"https://api.map.baidu.com/getscript?v=3.0&ak=mB4WGpYi4lnUliCGurcCU0mW0EBjlILG" ;
script. onload = ( ) => {
this . loadinfoBoxJScript ( ) ;
} ;
document. body. appendChild ( script) ;
} ,
loadinfoBoxJScript ( ) {
console. log ( "信息窗口函数加载完成" ) ;
var script = document. createElement ( "script" ) ;
script. type = "text/javascript" ;
script. src = "/infoBox.js" ;
script. onload = ( ) => {
this . init ( ) ;
} ;
document. body. appendChild ( script) ;
} ,
init ( ) {
console. log ( "地图加载完成" ) ;
BMap = window. BMap;
map = new BMap. Map ( "baidumap" ) ;
this . point = new BMap. Point ( 116.404 , 39.915 ) ;
map. centerAndZoom ( this . point, 15 ) ;
map. enableScrollWheelZoom ( ) ;
} ,
addMarker ( ) {
console. log ( "覆盖点加载完成" ) ;
let myIcon = new BMap. Icon (
"https://pic.baike.soso.com/ugc/baikepic2/2356/ori-20190510154707-1915134820_jpeg_1280_1920_208404.jpg/0" ,
new BMap. Size ( 60 , 60 )
) ;
myIcon. setImageSize ( new BMap. Size ( 60 , 60 ) ) ;
let marker = new BMap. Marker ( this . point, {
icon: myIcon,
} ) ;
map. addOverlay ( marker) ;
marker. addEventListener ( "click" , ( ) => {
axios. get ( "/template.html" ) . then ( ( res) => {
console. log ( res. data) ;
var infoBox = new window. BMapLib. InfoBox ( map, res. data, {
boxStyle: {
background: "#fff" ,
width: "270px" ,
height: "300px" ,
} ,
closeIconUrl: '/link.jpg' ,
closeIconMargin: "1px 1px 0 0" ,
enableAutoPan: true ,
align: window. INFOBOX_AT_TOP ,
} ) ;
infoBox. open ( marker) ;
} ) ;
} ) ;
} ,
} ,
} ;
< / script>
< style lang= "scss" scoped>
#baidumap {
overflow: hidden;
width: 90 vw;
height: 60 vh;
margin: 0 ;
font- family: "微软雅黑" ;
}
< / style>
方式二
vue-baidu-map 安装使用,具体看github
主体文档
地图属性。通过map.xxx设置 (地图能否缩放、中心点、建筑文字图标显示与否等等) 地图控件。通过BMapGL.xxx设置 (地图缩放键、定位键、3D键等) 覆盖物 。通过BMapGL.Marker设置(地图覆盖的点、线、图标等) 自定义点覆盖物。图片需要放在public中,再用/xxx 选中图片(图片放在public并使用其中路径才能读取成功,原理暂时不动) 信息窗口。点击点覆盖物弹出的窗口
高德地图api
与百度地图一样方式引入(不用改api地址,依旧需要加window.地图) 覆盖物添加事件。不能用marker.addEventListener,也用不了官网文档的marker.on/off
window.AMap.event.addListener ( marker, "click" , ( ) => console.log ( 1) ) ;
自定义信息窗口。不需要引入js文件,直接拷贝案例代码再修改。再通过axios异步导入html文件,然后渲染为信息窗口。 问题1:异步导入html文件后,用nexttick操作dom节点获取不到? 问题2:异步导入html中给dom节点添加的事件,在vue中失效了?
window. AMap. event. addListener ( marker, "click" , ( ) => {
console. log ( "信息窗口创建成功" ) ;
axios. get ( "/template.html" ) . then ( ( res) => {
let infoWindow = new window. AMap. InfoWindow ( {
isCustom: true ,
content: res. data,
offset: new window. AMap. Pixel ( 16 , - 45 ) ,
} ) ;
infoWindow. open ( map, marker. getPosition ( ) ) ;
} ) ;
} ) ;