高德地图 JS API 学习摘要2

自定义地图

指定Map.mapStyle属性,实现自定义样式地图。

var map = new AMap.Map('container', {
    resizeEnable: true,
    zoom:4,
    center: [116.397428, 39.90923],
    mapStyle:'amap://styles/a92c23c68ca519ec235825c3be99462b'
    //前往创建自定义地图样式:https://lbs.amap.com/dev/mapstyle/index
});

使用Map.setMapStyle()方法,加载高德提供的模版样式。

map.setMapStyle("amap://styles/normal");
地图显示要素

使用Map.setFeatures()方法,定制地图显示的元素类别。

var map = new AMap.Map('container', {
    resizeEnable: true, //是否监控地图容器尺寸变化
    zoom: 17,
    center: [116.408075, 39.950187],
    features: ['bg', 'road', 'building', 'point']
    // bg区域面 road道路 building建筑物 point标注
});

map.setFeatures(myFeatures);
隐藏文字标注

showLabel设定为 false 隐藏文字标注。

//初始化地图
var map = new AMap.Map('container', {
    resizeEnable: true, //是否监控地图容器尺寸变化
    showLabel: false //不显示地图文字标记
});
3D地图
var map = new AMap.Map('container', {
    resizeEnable: true, // 地图容器尺寸变化
    rotateEnable:true, // 旋转 写为false将固定视角无法旋转
    pitchEnable:true, // 倾斜  写为false将固定时间无法倾斜
    zoom: 17,
    pitch:80,
    rotation:-15,
    viewMode:'3D',//开启3D视图,默认为关闭
    buildingAnimation:true,//楼块出现是否带动画

    expandZoomRange:true,
    zooms:[3,20],
    center:[116.333926,39.997245]
});

// 添加控件按钮 控制旋转 倾斜角度
map.addControl(new AMap.ControlBar({
    showZoomBar:false, // 是否显示缩放按钮
    showControlButton:true, // 是否显示控制旋转 倾斜角度按钮
    position:{
      right:'10px',
      top:'10px'
    } // 控件显示的位置
}))
坐标系转换

使用 lnglatTocontainer()containTolnglat() 将经纬度坐标与地图容器像素坐标相互转换

var pixel = new AMap.Pixel(x,y); // 参数为x,y 容器像素坐标
var lnglat = map.containerToLngLat(pixel); // 得到转换的经纬度

var lnglat = new AMap.LngLat(lng, lat);// 参数为经度,纬度
var pixel = map.lnglatTocontainer(lnglat); // 得到转换的容器像素坐标

var lnglat = new AMap.LngLat(lng, lat);// 参数为经度,纬度
var pixel = map.lnglatToPixel(lnglat,zoom); // 参数为经纬度和缩放层级。得到转换的平面坐标
pixel.x = parseInt(pixel.x); // 取整
pixel.y = parseInt(pixel.y);

var pixel = new AMap.Pixel(x,y); // 参数为平面坐标x,y
var lnglat = map.pixelToLngLat(pixel,zoom); // 参数为平面坐标和缩放层级 得到转换的经纬度

// 经纬度转换为三维坐标
var lnglat = new AMap.LngLat(lng, lat);
var pixel = map.lngLatToGeodeticCoord(lnglat);
pixel.x = parseInt(pixel.x);
pixel.y = parseInt(pixel.y);

// 三维坐标转换为经纬度
var pixel = new AMap.Pixel(x,y);   
var lnglat = map.geodeticCoordToLngLat(pixel);
事件
  • 地图加载完成事件: map.on('complete', function() {})

  • 地图移动相关事件

    • map.on('movestart', mapMovestart); :移动开始
    • map.on('mapmove', mapMove);: 移动中
    • map.on('moveend', mapMoveend);: 移动结束
    • map.off('movestart', mapMovestart); :off移除事件
    • map.off('mapmove', mapMove);
    • map.off('moveend', mapMoveend);
  • 地图缩放相关事件

    • map.on('zoomstart', mapZoomstart);: 缩放开始
    • map.on('zoomchange', mapZoom); :缩放等级改变
    • map.on('zoomend', mapZoomend);:缩放结束
    • map.off('zoomstart', mapZoomstart);
    • map.off('zoomchange', mapZoom);
    • map.off('zoomend', mapZoomend);
  • 地图点击和鼠标事件

    • map.on('dblclick', showInfoDbClick); :双击
    • map.on('click', showInfoClick);:单击
    • map.on('mousemove', showInfoMove);:移动
    • map.off('click', showInfoClick);
    • map.off('dblclick', showInfoDbClick);
    • map.off('mousemove', showInfoMove);
  • 地图拖拽相关事件

    • map.on('dragstart', showInfoDragstart);:拖拽开始
    • map.on('dragging', showInfoDragging);:拖拽中
    • map.on('dragend', showInfoDragend);:拖拽结束
    • map.off('dragstart', showInfoDragstart);
    • map.off('dragging', showInfoDragging);
    • map.off('dragend', showInfoDragend);
  • 覆盖物点击和鼠标事件

var map = new AMap.Map("container", {
    resizeEnable: true
});
var marker = new AMap.Marker({
    map: map,
    icon: "https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png",
    position: [116.405467, 39.907761]
});
var lnglat =[116.368904, 39.913423];
var circle = new AMap.Circle({
    map: map,
    center: lnglat ,          //设置圆心
    radius: 1500,
    strokeColor: "#3366FF", //边框线颜色
    strokeOpacity: 0.3,       //边框线透明度
    strokeWeight: 3,        //边框线宽
    fillColor: "#FFA500", //填充色
    fillOpacity: 0.35//填充透明度
});
var polygonArr = [[116.403322, 39.920255],
    [116.410703, 39.897555],
    [116.402292, 39.892353],
    [116.389846, 39.891365]];
var polygon = new AMap.Polygon({
    map: map,
    path: polygonArr,//设置多边形边界路径
    strokeColor: "#FF33FF", //线颜色
    strokeOpacity: 0.2, //线透明度
    strokeWeight: 3,    //线宽
    fillColor: "#1791fc", //填充色
    fillOpacity: 0.35//填充透明度
});
map.setFitView();

// 注册
marker.on('click', showInfoM);
circle.on('click', showInfoC);
polygon.on('click', showInfoP);

marker.on('mouseover', showInfoOver);
circle.on('mouseover', showInfoOver);
polygon.on('mouseover', showInfoOver);

marker.on('mouseout', showInfoOut);
circle.on('mouseout', showInfoOut);
polygon.on('mouseout', showInfoOut);
// 解除
marker.off('click', showInfoM);
circle.off('click', showInfoC);
polygon.off('click', showInfoP);

marker.off('mouseover', showInfoOver);
circle.off('mouseover', showInfoOver);
polygon.off('mouseover', showInfoOver);

marker.off('mouseout', showInfoOut);
circle.off('mouseout', showInfoOut);
  • 覆盖物拖拽事件

需要在初始化的时候添加属性draggable: true

marker.on('dragging', showInfoM);
circle.on('dragging', showInfoC);
polygon.on('dragging', showInfoP);

marker.off('dragging', showInfoM);
circle.off('dragging', showInfoC);
polygon.off('dragging', showInfoP);
  • 信息窗体打开关闭事件
var info = [];
info.push("
"); info.push("
高德软件"); info.push("电话 : 010-84107000 邮编 : 100102"); info.push("地址 :北京市朝阳区望京阜荣街10号首开广场4层
"); infoWindow = new AMap.InfoWindow({ content: info.join("
") //使用默认信息窗体框样式,显示信息内容 }); infoWindow.open(map, map.getCenter()); // 打开信息窗体 infoWindow.close(); // 关闭信息窗体 infoWindow.on('open',showInfoOpen) // 监听信息窗体打开事件 infoWindow.on('close',showInfoClose) // 监听信息窗体关闭事件
  • DOM事件
var button1 = document.getElementById('bt1');
AMap.event.addDomListener(button1, 'click', handle);//给div绑定单击事件  

var clickListener;
function handle() {
    remove(); //防止重复绑定
    clickListener = AMap.event.addListener(map, "click", function(e) { // 注意这里是给地图绑定事件
        new AMap.Marker({
            position: e.lnglat,
            map: map
        });// 鼠标点击哪在哪生成标记
    });
};

function remove() {
    if (clickListener) {
        AMap.event.removeListener(clickListener);//移除事件,以绑定时返回的对象作为参数
    }
};  
  • 自定义事件
map.on("myEvents", fn); //绑定自定义事件,返回监听对象
var fn = function(e) {
    console.log(e.msg)
}
map.emit('myEvents', {msg: 'hello wrold'});//触发自定义事件

使用 emit 模拟事件触发。 本例通过模拟click点击事件打开信息窗体

var map = new AMap.Map("container", {
    resizeEnable: true,
    zoom: 13
});
var clickHandler = function(e) {
    log.success("您模拟触发了地图click事件!");
    new AMap.InfoWindow({
        content:'模拟事件触发',
    }).open(map,e.lnglat)
};
// 
map.on('click', clickHandler);
map.on('complete', function() { // 在地图加载完成时模拟了鼠标点击事件
    setTimeout(function(){
        // 模拟触发地图click事件
        map.emit('click',{
            lnglat : map.getCenter()
        });
    },2000)
})
批量管理图层
// 初始化实时路况图层
var trafficLayer = new AMap.TileLayer.Traffic({ 
    zIndex: 11
});
// 初始化路网图层
var roadNetLayer = new AMap.TileLayer.RoadNet({
    zIndex: 10
});
// 注册图层
var layerGroup = new AMap.LayerGroup([trafficLayer, roadNetLayer]);
// 设置图层
layerGroup.setMap(map);

layerGroup.show(); // 显示图层
layerGroup.hide(); // 隐藏图层
layerGroup.setOptions({ opacity: Math.random() }) // 设置图层属性 透明度
layerGroup.reload() // 重载图层
图层的添加和移除
var map = new AMap.Map('container', {
    resizeEnable: true,
    center: [116.40, 39.91],
    features: ['road', 'bg'],
    zoom: 13
});
// 初始化卫星图层
var satellite = new AMap.TileLayer.Satellite({
    map: map,
});

satellite.setMap(map); // 添加图层
satellite.setMap(null); // 移除图层
satellite.show(); // 显示图层
satellite.hide(); // 隐藏图层

// 设置 zIndex 属性
satellite.setzIndex(z); // 接受一个zIndex数值做参数
satellite.setOpacity(val); // 设置图层透明度 参数 0~1 eg:0.6
高德官方图层
  • new AMap.TileLayer():高德默认标准图层,只显示默认图层的时候,layers可以缺省
 var map = new AMap.Map('container', {
    center: [116.397428, 39.90923],
    layers: [//只显示默认图层的时候,layers可以缺省
        new AMap.TileLayer()//高德默认标准图层
    ],
    zoom: 13
});
  • new AMap.TileLayer.Traffic:实时路况图层
var trafficLayer = new AMap.TileLayer.Traffic({
    zIndex: 10
});

trafficLayer.setMap(map);
  • new AMap.TileLayer.Satellite(): 卫星图
  • new AMap.TileLayer.RoadNet():路网图
 var map = new AMap.Map('container', {
    center: [116.397428, 39.90923],
    layers: [
        // 卫星
        new AMap.TileLayer.Satellite(),
        // 路网
        new AMap.TileLayer.RoadNet()
    ],
    zoom: 13
});
  • 楼块图层
var map = new AMap.Map('container', {
    center: [116.397428, 39.90923],
    viewMode: '3D',
    pitch: 60,
    rotation: -35,
    // 隐藏默认楼块
    features: ['bg', 'road', 'point'],
    mapStyle: 'amap://styles/light',
    layers: [
        // 高德默认标准图层
        new AMap.TileLayer.Satellite(),
        // 楼块图层
        new AMap.Buildings({
            zooms: [16, 18],
            zIndex: 10,
            heightFactor: 2//2倍于默认高度,3D下有效
        })
    ],
    zoom: 16
});
自定义数据图层
  • 图片图层 new AMap.ImageLayer()
var imageLayer = new AMap.ImageLayer({
    url: 'http://amappc.cn-hangzhou.oss-pub.aliyun-inc.com/lbs/static/img/dongwuyuan.jpg',
    bounds: new AMap.Bounds(
        [116.327911, 39.939229],
        [116.342659, 39.946275]
    ),
    zooms: [15, 18]
});
var map = new AMap.Map('container', {
    resizeEnable: true,
    center: [116.33719, 39.942384],
    zoom: 15,
    layers: [
        new AMap.TileLayer(),
        imageLayer
    ]
});
  • 视频图层 new AMap.VideoLayer() & VideoLayer.setMap(map);
var map = new AMap.Map('container', {
    resizeEnable: true,
    viewMode: "3D",
    zoom: 3,
    center: [115.811491, 12.423935]
});

var bounds = new AMap.Bounds([93, -9], [147, 32]);

var VideoLayer = new AMap.VideoLayer({
    autoplay: true,
    loop: true,
    zIndex: 130,
    //可提供不同格式以达到多浏览器兼容
    url: [
        'https://a.amap.com/jsapi_demos/static/video/cloud.m4v',
        'https://a.amap.com/jsapi_demos/static/video/cloud.mov'
    ],
    bounds: bounds,
    zooms: [3, 18],
    opacity: 0.7
});

VideoLayer.setMap(map);
  • canvas图层
var map = new AMap.Map('container', {
    resizeEnable: true,
    zoom: 15,
    center: [116.335183, 39.941735]
});

var canvas = document.createElement('canvas');
canvas.width = canvas.height = 200;

var context = canvas.getContext('2d')
context.fillStyle = 'rgb(0,100,255)';
context.strokeStyle = 'white';
context.globalAlpha = 1;
context.lineWidth = 2;

var radious = 0;
var draw = function () {
    context.clearRect(0, 0, 200, 200)
    context.globalAlpha = (context.globalAlpha - 0.01 + 1) % 1;
    radious = (radious + 1) % 100;

    context.beginPath();
    context.arc(100, 100, radious, 0, 2 * Math.PI);
    context.fill();
    context.stroke();

    //2D视图时可以省略
    CanvasLayer.reFresh();

    AMap.Util.requestAnimFrame(draw);
};

var CanvasLayer = new AMap.CanvasLayer({
    canvas: canvas,
    bounds: new AMap.Bounds(
        [116.328911, 39.937229],
        [116.342659, 39.946275]
    ),
    zooms: [3, 18],
});

CanvasLayer.setMap(map);
draw();
  • 自定义图层-canvas
var map = new AMap.Map('container', {
    center: [116.306206, 39.975468],
    zooms: [3, 10],
    zoom:3
});

function getData(callback){
    AMap.plugin('AMap.DistrictSearch', function() {
        var search = new AMap.DistrictSearch();
        search.search('中国', function(status, data) {
            if (status === 'complete') {
                var positions = []
                var provinces = data['districtList'][0]['districtList']
                for (var i = 0; i < provinces.length; i += 1) {
                    positions.push({
                        center: provinces[i].center,
                        radius:10
                    })
                }
                callback(positions)
            }
        });
    });
}
function addLayer(positions){
    AMap.plugin('AMap.CustomLayer', function() {
        var canvas = document.createElement('canvas');
        var customLayer = new AMap.CustomLayer(canvas, {
            zooms: [3, 10],
            alwaysRender:true,//缩放过程中是否重绘,复杂绘制建议设为false
            zIndex: 120
        });
        var onRender = function(){
            var retina = AMap.Browser.retina;
            var size = map.getSize();//resize
            var width = size.width;
            var height = size.height;
            canvas.style.width = width+'px'
            canvas.style.height = height+'px'
            if(retina){//高清适配
                width*=2;
                height*=2;
            }
            canvas.width = width;
            canvas.height = height;//清除画布
            var ctx = canvas.getContext("2d");
            ctx.fillStyle = '#08f';
            ctx.strokeStyle = '#fff';
            ctx.beginPath();
            for (var i = 0; i < positions.length; i += 1) {
                var center = positions[i].center;
                var pos = map.lngLatToContainer(center);
                var r = positions[i].radius;
                if(retina){
                    pos = pos.multiplyBy(2);
                    r*=2
                }
                ctx.moveTo(pos.x+r, pos.y)
                ctx.arc(pos.x, pos.y, r, 0, 2*Math.PI);
            }
            ctx.lineWidth = retina?6:3
            ctx.closePath();
            ctx.stroke();
            ctx.fill();
        }
        customLayer.render = onRender;
        customLayer.setMap(map);
    });
}
getData(addLayer);
  • Canvas作为切片 new AMap.TileLayer.Flexible()
var map = new AMap.Map('container', {
    resizeEnable: true,
    zoom: 14,
    zooms: [3, 20],
    expandZoomRange: true
});

var layer = new AMap.TileLayer.Flexible({
    cacheSize: 30,
    zIndex: 200,
    createTile: function (x, y, z, success, fail) {
        var c = document.createElement('canvas');
        c.width = c.height = 256;

        var cxt = c.getContext("2d");
        cxt.font = "15px Verdana";
        cxt.fillStyle = "#ff0000";
        cxt.strokeStyle = "#FF0000";
        cxt.strokeRect(0, 0, 256, 256);
        cxt.fillText('(' + [x, y, z].join(',') + ')', 10, 30);

        // 通知API切片创建完成
        success(c);
    }
});

layer.setMap(map);

  • img作为切片(模拟水印)
var map = new AMap.Map('container', {
    resizeEnable: true,
    zoom: 14,
    zooms: [3, 20],
    expandZoomRange: true
});

//该demo可模拟水印效果
var layer = new AMap.TileLayer.Flexible({
    cacheSize: 30,
    opacity: 0.3,
    createTile: function (x, y, z, success, fail) {
        if ((x + y) % 3) {
            fail();
            return;
        } // 打散分布

        var img = document.createElement('img');
        img.onload = function () {
            success(img)
        };
        // img.crossOrigin = "anonymous";//3D 的时候添加,同时图片要有跨域头
        img.onerror = function () {
            fail()
        };

        img.src = 'https://a.amap.com/jsapi_demos/static/images/amap.png';
    }
});

layer.setMap(map);

你可能感兴趣的:(高德地图 JS API 学习摘要2)