高德地图API实现
前言
使用JS简单实现高德地图渲染和组件功能。
效果图
实现
API注册
密钥获取
百度搜索相关教程:高德地图API注册/密钥获取
或
前往官网API文档教程注册并获取密钥:https://lbs.amap.com/api/webservice/gettingstarted
教程
官方API:https://lbs.amap.com/api/javascript-api/guide/abc/prepare
引入JS
key=注册的密钥
<script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=3a8**************608a62"></script>
地图容器:宽高度必须设置,高度不可使用%百分百比,建议固定或js赋值
<div id="container"></div>
基础渲染-初始化地图
这样就可以看到基础效果了
var map = new AMap.Map('container', {
pitch: 60, // 倾斜角度
//rotation: -15, // 旋转角度
viewMode: '3D', // 默认使用 2D 模式,如果希望使用带有俯仰角的 3D 模式,请设置 viewMode: '3D',
zoom: 18, // 初始化地图层级,地图默认缩放大小
buildingAnimation:true, // 建筑出现的动画
zoomEnable:true, // 地图是否可缩放,默认值为 true
//doubleClickZoom: true, // 地图是否可通过双击鼠标放大地图,默认 true
//dragEnable: false, // 地图拖拽移动移动,默认 true
//scrollWheel: false, // 关闭缩放,默认 true
//mapStyle: 'amap://styles/whitesmoke', // 设置地图的显示样式 https://lbs.amap.com/api/javascript-api/guide/map/map-style
center: [114.085947, 22.547] // 初始化地图中心点
});
// 重新设置中心点
//map.setCenter([114.085947, 22.547]);
组件/插件引入
引入方式分为两种
第一种
在script路径后面拼接plugin参数,需要的组件逗号隔开
<script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=3a8**************608a62&plugin=AMap.ControlBar,AMap.ToolBar"></script>
js中使用
map.addControl(new AMap.ControlBar({
showZoomBar: true,// 调整zoom
}));
第二种
script直接引入
<script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=3a8**************608a62"></script>
js中使用
// 说明:AMap.plugin 等于 map.plugin
AMap.plugin('AMap.ControlBar', function() {
map.addControl(new AMap.ControlBar({
showZoomBar: true,// 调整zoom
}));
});
本人使用的是第二种
2D和3D切换
就是地图上右上角那个指南针一样的东西
AMap.plugin('AMap.ControlBar', function() {
map.addControl(new AMap.ControlBar({
showZoomBar: true,// 调整zoom
showControlButton: true,// 是否有倾斜旋转角度的功能,默认是true
position: {
right: "10px",
top: "15px"
},// 调整控件位置
}));
});
缩放加减号
右上角的加减号,放大放小的
map.addControl(new AMap.ToolBar({
liteStyle: true,// 简易缩放模式,默认为 false
position: {
right: "40px",
top: "120px"
},// 调整控件位置
}));
构造点标多点标、自定义点标
使用官方默认
var marker = new AMap.Marker({
//content: content, // 自定义点标记覆盖物内容
position: [114.055639, 22.533181], // 坐标
offset: new AMap.Pixel(0, -20) ,// 相对于基点的偏移位置
//draggable: true, // 设置是否可以拖拽
//cursor: 'move', // 鼠标状态
//raiseOnDrag: true // 设置拖拽效果
});
// 拖到标点返回最新坐标
marker.on('dragend', function(e) {
console.log('坐标', marker.getPosition())
});
// 添加点击事件,可以点击后展示详细信息
marker.on('click', function(e) {
console.log("这个标点被点击了", e.target)
})
// 将点标记添加到地图map上
map.add(marker);
// [点标上面显示内容信息]
var infoWindow = new AMap.InfoWindow({offset: new AMap.Pixel(0, -30)});// 地图位置对象
var content = "<div>我是弹出内容</div>"; // 要显示的内容
// 点击弹出内容
// marker.content = content;
// marker.on('click', markerClick);
// function markerClick(e) {
// infoWindow.setContent(e.target.content);
// infoWindow.open(map, e.target.getPosition());
// }
// 直接显示内容
infoWindow.setContent(content);
infoWindow.open(map, position);
// 移除已创建的 marker
//map.remove(marker);
// 多个点标实例组成的数组
//var markerList = [marker1, marker2, marker3];
//map.add(markerList);
自定义图标
// 首先创建 AMap.Icon 实例:
var icon = new AMap.Icon({
//size: new AMap.Size(40, 60), // 图标尺寸
image: 'https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png',// Icon路径
imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等
imageSize: new AMap.Size(40, 60), // 根据所设置的大小拉伸或压缩图片
});
// 将 Icon 实例添加到 marker 上
var marker = new AMap.Marker({position: [114.055639, 22.533181],// icon在地图上显示的位置,数组内对应经纬度
offset: new AMap.Pixel(-18, -56),//设置icon在地上的偏移量
icon: icon, // 添加 Icon 实例
zoom: 13, // 缩放等级
});
// 将点标记添加到地图上
map.add(marker);
点击地图设置点标
// 点击地图设置点标
var marker;
map.on('click',function(e){
//map.clearInfoWindow();
console.log("点击了地图", e);
// 移除已创建的 marker
if(marker){
map.remove(marker);
}
var lnglat = e.lnglat;
// 【构造点标记】
marker = new AMap.Marker({
position: [lnglat.lng, lnglat.lat], // 坐标
offset: new AMap.Pixel(0, -20) ,// 相对于基点的偏移位置
});
// 将点标记添加到地图map上
map.add(marker);
});
通过位置信息获取经纬度坐标
AMap.plugin('AMap.Geocoder', function() {
var geocoder = new AMap.Geocoder({
city: '全国'// city 指定进行编码查询的城市,支持传入城市名、adcode 和 citycode
})
geocoder.getLocation('深圳市福田区平安国际金融中心大厦', function(status, result) {
if (status === 'complete' && result.info === 'OK') {
// result中对应详细地理坐标信息
console.log("位置获取坐标:", result)
}
})
})
通过经纬度坐标获取位置信息
AMap.plugin('AMap.Geocoder', function() {
var geocoder = new AMap.Geocoder({
city: '全国'// city 指定进行编码查询的城市,支持传入城市名、adcode 和 citycode
})
var lnglat = [114.055639, 22.533181]
geocoder.getAddress(lnglat, function(status, result) {
if (status === 'complete' && result.info === 'OK') {
// result为对应的地理位置详细信息
console.log("坐标获取位置:", result)
}
})
})
绘画圆形图、判断是否在圆的范围内
一般可以用于考勤范围、安全范围等
// 圆形围栏绘画
var circle = new AMap.Circle({
center: [114.055639, 22.533181], // 圆心位置,设置的圆形经纬度
radius: 100, // 圆半径,单位:米
fillColor: '#a4d5ff', // 圆形填充颜色
strokeColor: '#59b0fb', // 描边颜色
strokeWeight: 2, // 描边宽度
});
//circle.setMap(map);
map.add(circle);
// 缩放地图到合适的视野级别
map.setFitView([circle]);
// 需要使用延迟,不然会全部判断都是false
setTimeout(function () {
var contains1 = circle.contains([114.055006, 22.533964]); // 用户位置的经纬度
console.log("是否在范围内1:", contains1);
var contains2 = circle.contains([114.055639, 22.533181]); // 用户位置的经纬度
console.log("是否在范围内2:", contains2);
}, 1000)
关键字搜索
默认点标
<div id="panel" style="position: fixed;right: 15px;top: 10px;"></div>
AMap.plugin(["AMap.PlaceSearch"], function () {
//构造地点查询类
var placeSearch = new AMap.PlaceSearch({
pageSize: 5, // 单页显示结果条数
pageIndex: 1, // 页码
city: "全国", // 兴趣点城市
//citylimit: true, //是否强制限制在设置的城市内搜索
map: map, // 展现结果的地图实例
panel: "panel", // 结果列表将在此容器中进行展示。
autoFitView: true // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围
});
//关键字查询,设置成输入框input就好了
placeSearch.search('深圳市福田区平安国际金融中心大厦');
});
替换点标
// 构造地点查询类
var placeSearch = new AMap.PlaceSearch({
city: "全国", // 兴趣点城市
});
// 关键字查询,设置成输入框input就好了,下面返回的集合中有name,可以自己重新查询结果选择
placeSearch.search('深圳市福田区平安国际金融中心大厦', function (status, result) {
// 查询成功时,result即对应匹配的POI信息
console.log("搜索结果坐标:", result)
var pois = result.poiList.pois;
for(var i = 0; i < pois.length; i++){
var poi = pois[i];
var marker = [];
marker[i] = new AMap.Marker({
position: poi.location, // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
offset: new AMap.Pixel(0, -20),// 相对于基点的偏移位置
title: poi.name
});
// 将创建的点标记添加到已有的地图实例:
map.add(marker[i]);
}
map.setFitView();
})
官方文档还有许多组件功能:如线路连线、网格、区域颜色覆盖、模型等等。
更多示例参考官方API:https://lbs.amap.com/api/javascript-api/guide/abc/prepare
官方例子(完整代码的)API【推荐】:https://lbs.amap.com/demo/javascript-api/example/marker/marker-content