文章目录

  • 写在前面
  • 为什么选择高德地图?对比腾讯、百度、OpenLayers
    • OpenLayers
    • 腾讯地图
    • 百度地图
    • 高德地图
  • 基本的开发步骤,开始实现自己的地图应用
  • 快速掌握 API 模块、架构、知识点思维导图
  • 使用高德地图实现常见的地图效果
    • 使用一个 URL,自动调取地图导航
    • 展示省份的图层
    • 显示一个城市的地铁线
  • 高德地图在各个框架里的使用
  • 写在最后

写在前面

前段时间换了工作,从以前的 996 变成了现在的 965,周末有了一些空闲时间,于是就想着写一些文章和大家分享一下。思考了很久,最终确定了主题为前端高德地图的教程。

这是一个比较宽泛的主题,而且高德地图的官网文档以及 API 实例已经真的是做得很好了,自己再去写一个教程出来,很难不和官网重复。所以我这篇 Chat,除了简单介绍高德地图的入门教程,更重要的是介绍整个框架,以及遇到不同种类的 LBS 需求改如何去做,思考的路线是如何,快速去实现它。

当然由于笔者水平有限,欢迎各位看官一起来讨论,学习。

这里我先解释一下一个名词 LBS:

LBS(Location Based Service)基于位置的服务,是利用各类型的定位技术来获取定位设备当前的所在位置,通过移动互联网向定位设备提供信息资源和基础服务。我们所使用的高德地图,路线搜索、自定定位、地图标记、导航、室内地图、定位,这些都是基于 LBS 做出来的。可以说 LBS 与我们的生活息息相关。

另外,本篇的技术栈是高德地图 JSAPI,属于前端范畴。

下面进入正题。

为什么选择高德地图?对比腾讯、百度、OpenLayers

目前做 LBS 需求的前端有几个 API 选择,高德地图、腾讯地图、百度地图,还有一个由于某些原因相对用的人比较少的 OpenLayers。

下面我就来简单说一下几个 SDK 的区别,同时也借鉴了一些网上的资源。

先说下很多人不熟悉的 OpenLayers。

OpenLayers

先放个官网:https://openlayers.org/。

打开链接,首先映入眼帘的是全站的英文,光看这一眼,就丢失一批国内翻译都要靠有道的 IT 有志青年。看一下百度百科的介绍:

OpenLayers 是一个专为 Web GIS 客户端开发提供的 JavaScript 类库包,用于实现标准格式发布的地图数据访问。

再看下官网的介绍:

OpenLayers makes it easy to put a dynamic map in any web page. It can display map tiles,vector data and markers loaded from any source. OpenLayers has been developed to further the use of geographic information of all kinds. It is completely free,Open Source JavaScript,released under the 2-clause BSD License (also known as the FreeBSD)。

OpenLayers 使在任何 Web 页面中放置动态地图变得很容易。它可以显示从任何源加载的地图块、矢量数据和标记。OpenLayers 的开发是为了进一步利用各种地理信息。它是完全免费的、开源的 JavaScript,以句 BSD 许可(也称为 FreeBSD)发布。地图渲染方式为 Canvas 和 WebGL。

网站并不大,只有四个模块,文档、API、示例、代码。

这个库在所有的地图库中是最灵活的,也是最原始的,只提供了很基础的地图操作 API,缩放、坐标、标记、加载图层、面向对象。

由于面向对象,并且是开源的,所以库本身是非常易于定制和扩展的。

可以瞅一眼 OpenLayers 的框架架构:

(图片来源于网络)

如果想要对 GIS、LBS 非常感兴趣,OpenLayers 真是一个不错的选择,不过学习难度有点高,文档都是英文的,并且官网有些案例打开的很慢。

接着在说一下腾讯地图。

腾讯地图

其实这个库我是真的没用过,看了一下官网:

https://lbs.qq.com/webApi/javascriptV2/jsGuide/jsOverview

又查了一些资料。很多服务型 API,如路线规划、距离计算都是要调用 HTTP 的接口,而不是和类库直接发起了,甚至有些参数还需要用户手动进行 URL 编码,使用 encodeURI。

目前的 JSAPI 是 2019-01-14 日更新的 v2.4.1.111,看了是好久没更新了啊。

其实腾讯地图 App 还是有不少人使用的,只是这个 JSAPI 实在用的很不多。有朋友知道用过的也可以多和我讨论讨论。

百度地图

JSAPI 传送门,目前是 3.0:

http://lbsyun.baidu.com/index.php?title=jspopular3.0

目前的版本是 2017 年 12 月 27 日上线的 V3.0,功能要比腾讯地图完整一些,有些功能和控件还是要借助其他的库,如点聚合过程需要加载 TextIconOverlay 和 MarkerClusterer 这两个类,有些时候,类之间的调用有很多 Bug,之前就遇到个图层显示不出来的问题。

示例和文档都要比腾讯的齐全,完整.很多人在选择地图类库的时候,往往看这个功能的平台以及相似功能的实例,比如小程序的有很多是使用腾讯,在做地图图表时,常常使用 EChart 搭配百度地图。各家推荐各家的产品,这也是人之常情。但作为开发的我们,只有选择最合适,最趁手的工具,才能把事情做得又快又好。

高德地图

高德之前是一家独立的公司,2002 年成立,2010 年上市,后来在 2014 年被阿里巴巴收购。

高德地图 JSAPI 最新版本是 2020-05-12 发布的 V2.0,从更新日志上来看,API 的更新还是比较频繁的,大部分是性能优化和开发新的特性,兼以 Bug 的修复。官方已经提供 JSAPI Loader 加载器和提供 TypeScript 声明,对于前端开发更方便,快捷,规范了。高德地图还有数据可视化的 API,叫做 loca-api 完完全全就是在地图上玩大数据、路径、热力图,相关示例可以查看:

https://lbs.amap.com/demo-center/loca-api

目前使用高德的有很多案例,不管从数据、市场和服务,都是一流的。

综合比较,高德地图是目前国内前端开发使用最广的地图 API,也是目前功能最完善、文档最详细、丰富的地图 API,有任何基于 LBS 的应用,首选高德就对了。

基本的开发步骤,开始实现自己的地图应用

为了照顾一些初接触前端的开发者,我这里增加了一章节 5 分钟教程。便于大家快速体验效果。

使用高德地图需要申请 appkey,有了 appkey 才能调用其 JS 的 SDK,每个 appkey 是不同限制的。

  • 申请 appkey 申请地址在此页面,先创建应用,在点击添加,增加一个 Web 端 JSAPI 的 key
  • 使用 key 引用 JS,调用 SDK

直接复制一下代码,保存为 HTML,浏览器打开,即可正常显示效果。此处使用的是我的 appkey:6d715cd10a703544388c24c35e7e89d6。

代码如下:

<!doctype html>
<html>
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="initial-scale=1.0,user-scalable=no,width=device-width"><title>地图加载完成事件</title><link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css"/><style>html,body,#container{height:100%;width:100%;}</style></head>
<body>
<div id="container"></div>
<div id="tip" class="info">地图正在加载</div>
<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=6d715cd10a703544388c24c35e7e89d6"></script>
<script type="text/javascript">//初始化地图对象,加载地图var map = new AMap.Map("container",{resizeEnable: true});map.on('complete',function() {document.getElementById('tip').innerHTML = "地图图块加载完毕!当前地图中心点为:" + map.getCenter();});
</script>
</body>
</html>

效果如下:

我们在 HTML 中引用 JS,地址为

https://webapi.amap.com/maps?v=1.4.15&key=6d715cd10a703544388c24c35e7e89d6

这是 1.4 版本,最新的是 2.0。key 就是我申请的 appkey。

使用 new AMap 去实例化一个地图的对象,第一个参数是一个 dom 的 id 或者是 dom 元素。

高德的 SDK 文档:

https://lbs.amap.com/api/javascript-api/reference/core

所有的官方示例:

https://lbs.amap.com/api/javascript-api/example/map-lifecycle/map-show

快速掌握 API 模块、架构、知识点思维导图

一共有 20 个模块:

  • 基础类:经纬度、像素、边界、大小、这些是地图 JSAPI 开发必须了解的基本类型
  • 事件:地图 JSAPI 具有完备的事件体系,在 2.0 版本中所有类型的实例均使用 on/off 方法进行时间的绑定和移除
  • 地图:地图对象类,封装了地图的属性设置、图层变更、事件交互等接口的类。
  • 高德官方图层:由高德官方提供数据或图像的地图图层
  • 行业标准图层:符合 OGC 标准或者行业通行规范的的图层类型
  • 自有数据图层:用于加载展示开发者自己拥有的数据或者图像的图层类型
  • 点标记:用于在地图上添加点状地图要素的类型
  • 信息窗体:用于在地图上展示复杂的说明性信息的类型
  • 右键菜单:控制右键菜单
  • 矢量图形:用于在地图上绘制线、面等矢量地图要素的类型
  • 群组:用于批量操作图层和覆盖物的群组类型,可以简化代码书写
  • 地图控件:固定于地图最上层的用于控制地图某些状态的 DOM 组件类型
  • 工具类:用于满足一定专门功能的工具类型
  • 服务类:用于调用 Web 服务 API,直接透传查询条件和返回结果
  • 搜索:用于进行 POI 搜索联想与数据查询的相关类型
  • 地理编码:用于经纬度与地址之间的相互查询
  • 路线规划:用于驾车、货车、骑行、步行、公交等的路线规划查询
  • 其他服务:行政区查询、天气查询、公交站点和公交线路查询
  • 定位:用于进行城市定位或者精确定位的插件类型
  • 通用库:一些通用的函数库

最新的 JSAPI 2.0 的所有类的详解文档,请查看:

https://lbs.amap.com/api/jsapi-v2/documentation

关于直接获取此页面的所有类,只需要在页面下执行这段代码就能获取所有的类:

let arr = [];
[...document.querySelectorAll('.py1-ul li a.namespace')].forEach(x => {arr.push(x.innerText)
})
console.log(`一共有${arr.length}个模块`)
console.log(arr.join('\n'))

如图,所有基于 LBS 的功能实现,都离不开这些类,直接看这些类,可能会有点抽象,所有大家学习的时候最好对比着官方提供的示例来看,图文结合。更好地了解每个 API 的真实效果。

除了要图文结合学习 SDK,还需要了解一些地图的基本的基础知识,不然你无法将你功能上的点无法映射到地图中的某个对象。

比如你的设计图上有一个这样的效果:

如果你了解地图的一些基本概念,就知道这是一个 Marker,好,那就找关于 Marker 的文档。看到 Marker 的文档后,你可以看到,Marker 可以设置对于经纬度的偏移量,为了不阻挡要看到的建筑或兴趣点,也可以社会 Marker 的 title 和 label。每个 Marker 都可以显示自己的信息内容。

除了 Marker 点标记之外还需要了解这些,地图容器、图层 Layers、矢量图形、地图控件、插件 Plugins、地图级别、经纬度、地图要素 Map Features(道路、区域面、POI 标注、路名……)等等。

这里官方都是有详细的解释:

https://lbs.amap.com/api/javascript-api/guide/abc/components

而其他的地图框架是没有这些解释的。

下面我就按照上面的学习方法以及文档搜索方法,来实现一个,滴滴打车选择上车地点的功能。

首先详解一下滴滴打车的选上车地点的功能:

  1. 打开页面后,地图自动定位到当前位置,
  2. 地图中心点有一个 Marker 表示,表示上车地点
  3. 拖动地图或缩放地图,重新定位上车地点显示出上车地点

功能细分后,我们需要去查询以下 API:

  • 地图的自动定位
  • 添加 Marker 并动态设置 Marker 的内容
  • 监听地图拖放,缩放事件
  • 根据地图中心查询地点位置

通过查询文档,我们需要翻阅以下几个模块的类:

  • 地理编码
  • 定位
  • 点标记
  • 地图
  • 事件

然后我们查询文档,可以得出一下的技术实现路线:

  1. 页面记载后,使用初始化地图,选择合适缩放比例,new AMap.Geolocation(options: GeolocationOptions) 进行自动定位,将地图中心设置为自定定位的经纬度。
  2. 然后添加在地图中心添加一个 Marker。
  3. 监听地图拖放,缩放事件 moveend zoomend,获取地图中心,移动 Marker。
  4. 获取最新的地址,设置 marker 的 label。

思索片刻,编码、调试一刻钟,于是就有了以下的代码:

<!doctype html>
<html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="initial-scale=1.0,user-scalable=no,width=device-width"><title>地图加载完成事件</title><link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" /><style>html,body,#container {height: 100%;width: 100%;}.amap-marker-label {border: 0;background-color: transparent;}.info {position: relative;top: 0;right: 0;min-width: 0;}.flex-center {display: flex;align-items: center;justify-content: center;}.center-icon {position: fixed;z-index: 99;top: calc(50% - 31px);left: calc(50% - 9px);}</style></head><body><img class="center-icon" src="https://webapi.amap.com/theme/v1.3/markers/n/mark_bs.png" /><div id="container"></div><div id="tip" class="info">地图正在加载</div><script type="text/javascript"src="https://webapi.amap.com/maps?v=1.4.15&key=6d715cd10a703544388c24c35e7e89d6&plugin=AMap.Geocoder"></script><script type="text/javascript">//初始化地图对象,加载地图var map = new AMap.Map("container",{resizeEnable: true,zoom: 18});var marker = new AMap.Marker({// icon: "https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png",content: ' ',position: map.getCenter()});var geocoder = new AMap.Geocoder({// city: "010",//城市设为北京,默认:“全国”// radius: 500 //范围,默认:500});// 设置 label 标签// label 默认蓝框白底左上角显示,样式 className 为:amap-marker-labelmarker.setLabel({offset: new AMap.Pixel(-72,-40), //设置文本标注偏移量content: "<div class='info'>我是 marker 的 label 标签</div>",//设置文本标注内容});map.add(marker);//显示地图层级与中心点信息function logMapinfo() {var center = map.getCenter(); //获取当前地图中心位置geocoder.getAddress(center,function (status,result) {if (status === 'complete' && result.regeocode) {var address = result.regeocode.formattedAddress;marker.setLabel({offset: new AMap.Pixel(-72,-40), //设置文本标注偏移量content: `<div class='info'>${address}</div>`,//设置文本标注内容});} else {log.error('根据经纬度查询地址失败')}});marker.setPosition(center)marker.setAnimation('AMAP_ANIMATION_DROP')};//绑定地图移动与缩放事件map.on('moveend',logMapinfo);map.on('zoomend',logMapinfo);</script>
</body></html>

复制代码保存 HTML,浏览器打开即可看到效果:

稍微解释一下这端代码。

为了获得更好的用户体验,也为了更加逼近真实的滴滴打车上车地点的选择,我使用了一个地图上方的虚假的图片来代替真实 Marker。真实的 Marker 是隐藏在其下面的,两者完全重叠。应该还有其他更好的方法,比如使用添加一个图层,将 Marker 的坐标在拖动地图时,相对于浏览器视口位置不动,始终垂直居中。如果有大佬出来指教,我将不耻下问。

当然了这里还有很多细节可以处理,比如 Marker 的样式、Marker 的 label、显示的长短,以及颜色都与原版不一致,大家就不要太纠结这些了。毕竟这里只是为了给大家演示一下接到需求后如何拆分、细化。查阅文档,制定技术细节,最终形成成品。

需要注意的是,这里有使用了一个经纬度查询地点的插件 AMap.Geocoder,使用方法就是在引入 SDK 是添加一个 plugin 的参数,如链接。

https://webapi.amap.com/maps?v=1.4.15&key=6d715cd10a703544388c24c35e7e89d6&plugin=AMap.Geocoder

除此之外还有另一种使用办法:

AMap.plugin('AMap.Geolocation',function() {// 使用插件编写业务代码
})

最后,拖拽地图选点,其实官方是有这样的组件的,使用起来非常方便。

点击链接查看

使用高德地图实现常见的地图效果

  1. 使用一个 URL,自动调取地图导航
  2. 展示省份的图层
  3. 显示一个城市的地铁线

使用一个 URL,自动调取地图导航

基本思路就是将经纬度当做参数,放在 URL 中,进入页面后,获取 URL 中的参数作为终点,与此同时,使用自动定位获取当前的经纬度,然后当做起点经纬度。然后调用 new AMap.Driving 去实例化一个搜索路径的示例。将起点和重点的经纬度传入,然后一条路线。核心代码

 <!doctype html>
<html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width"><title>地图加载完成事件</title><link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" /><style>html,body,#container {height: 100%;width: 100%;}.amap-marker-label {border: 0;background-color: transparent;}.info {position: relative;top: 0;right: 0;min-width: 0;}.flex-center {display: flex;align-items: center;justify-content: center;}.center-icon {position: fixed;z-index: 99;top: calc(50% - 31px);left: calc(50% - 9px);}#panel {position: fixed;background-color: white;max-height: 90%;overflow-y: auto;top: 10px;right: 10px;width: 280px;}#panel .amap-call {background-color: #009cf9;border-top-left-radius: 4px;border-top-right-radius: 4px;}#panel .amap-lib-driving {border-bottom-left-radius: 4px;border-bottom-right-radius: 4px;overflow: hidden;}</style></head><body><div id="container"></div><div id="panel"></div><script type="text/javascript"src="https://webapi.amap.com/maps?v=1.4.15&key=6d715cd10a703544388c24c35e7e89d6&plugin=AMap.Driving"></script><script type="text/javascript">//初始化地图对象,加载地图var endPosition;function setEndPosition() {var lat = getQueryValue1('lat') // || 34.433988var lng = getQueryValue1('lng') // || 115.61957endPosition = new AMap.LngLat(lng, lat)}setEndPosition()var map = new AMap.Map("container", {resizeEnable: true,zoom: 18});AMap.plugin('AMap.Geolocation', function () {var geolocation = new AMap.Geolocation({enableHighAccuracy: true,//是否使用高精度定位,默认:truetimeout: 10000,          //超过 10 秒后停止定位,默认:5sbuttonPosition: 'RB',    //定位按钮的停靠位置buttonOffset: new AMap.Pixel(10, 20),//定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)zoomToAccuracy: true,   //定位成功后是否自动调整地图视野到定位点});map.addControl(geolocation);geolocation.getCurrentPosition(function (status, result) {if (status == 'complete') {onComplete(result)} else {onError(result)}});});//解析定位结果function onComplete(data) {console.log(data, '定位成功后的数据')startPosition = new AMap.LngLat(data.position.lng, data.position.lat)var str = [];str.push('定位结果:' + data.position);str.push('定位类别:' + data.location_type);if (data.accuracy) {str.push('精度:' + data.accuracy + ' 米');}//如为 IP 精确定位结果则没有精度信息str.push('是否经过偏移:' + (data.isConverted ? '是' : '否'));console.log(str.join('<br>'));startDriveLine(startPosition, endPosition)}//解析定位错误信息function onError(data) {console.log('定位失败', data)}function getQueryValue1(queryName) {var reg = new RegExp("(^|&)" + queryName + "=([^&]*)(&|$)", "i");var r = window.location.search.substr(1).match(reg);if (r != null) {return decodeURI(r[2]);} else {return null;}}function startDriveLine(start, end) {//构造路线导航类var driving = new AMap.Driving({map: map,panel: "panel"});// 根据起终点经纬度规划驾车导航路线driving.search(start, end, function (status, result) {// result 即是对应的驾车导航信息,相关数据结构文档请参考  https://lbs.amap.com/api/javascript-api/reference/route-search#m_DrivingResultif (status === 'complete') {console.log('绘制驾车路线完成')} else {console.error('获取驾车数据失败:' + result)}});}</script>
</body></html>

需要注意此功能需要的插件,AMap.Driving、AMap.Geolocation。如

http://192.168.0.105:8000/?lat=34.433988&lng=115.61957

展示省份的图层

有时候我们不需要根据展示地图的河流、街道、地点,只需要显示省份的轮廓,这个时候我们就可以行政区图了,主要用到的是这个类 AMap.DistrictLayer 可以满足日常的行政区块的数据可视化、行政区边界展示。

如下面这种效果:

以下是核心代码:

<script language="javascript"src="https://webapi.amap.com/maps?v=2.0&key=6d715cd10a703544388c24c35e7e89d6&plugin=Map3D,AMap.DistrictLayer,AMap.Scale,AMap.ToolBar"></script><script type="text/javascript" src="https://a.amap.com/jsapi_demos/static/demo-center/data/china-pp.js"></script><script type="text/javascript">var SOC = 'CHN'var colors = {};var GDPSpeed = {'520000': 10,//贵州'540000': 10,//西藏'530000': 8.5,//云南'500000': 8.5,//重庆'360000': 8.5,//江西'340000': 8.0,//安徽'510000': 7.5,//四川'350000': 8.5,//福建'430000': 8.0,//湖南'420000': 7.5, //湖北'410000': 7.5,//河南'330000': 7.0,//浙江'640000': 7.5,//宁夏'650000': 7.0,//新疆'440000': 7.0,//广东'370000': 7.0,//山东'450000': 7.3,//广西'630000': 7.0,//青海'320000': 7.0,//江苏'140000': 6.5,//山西'460000': 7,// 海南'310000': 6.5,//上海'110000': 6.5, // 北京'130000': 6.5, // 河北'230000': 6, // 黑龙江'220000': 6,// 吉林'210000': 6.5, //辽宁'150000': 6.5,//内蒙古'120000': 5,// 天津'620000': 6,// 甘肃'610000': 8.5,// 甘肃'710000': 2.64, //台湾'810000': 3.0, //香港'820000': 4.7 //澳门}var getColorByDGP = function (adcode) {if (!colors[adcode]) {var gdp = GDPSpeed[adcode];if (!gdp) {colors[adcode] = 'rgb(227,227,227)'} else {var r = 3;var g = 140;var b = 230;var a = gdp / 10;colors[adcode] = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';}}return colors[adcode]}var disCountry = new AMap.DistrictLayer.Country({zIndex: 10,SOC: 'CHN',depth: 1,styles: {'nation-stroke': '#ff6600','coastline-stroke': 'ff8800','province-stroke': 'white','fill': function (props) {return getColorByDGP(props.adcode_pro)}}})console.log(disCountry, 'disCountry')var map = new AMap.Map("container", {zooms: [4, 10],center: [106.122082, 33.719192],zoom: 4,isHotspot: false,defaultCursor: 'pointer',layers: [disCountry],viewMode: '2D',resizeEnable: true})map.addControl(new AMap.Scale());map.addControl(new AMap.ToolBar({ liteStyle: true }));map.on('complete', function () {var layer = new AMap.LabelsLayer({// 开启标注避让,默认为开启,v1.4.15 新增属性collision: false,// 开启标注淡入动画,默认为开启,v1.4.15 新增属性animation: true,});for (var i = 0; i < LabelsData.length; i++) {var labelsMarker = new AMap.LabelMarker(LabelsData[i]);labelsMarker.on('click', function(e){console.log(labelsMarker)// labelMarker.setOpacity(0.5);});layer.add(labelsMarker);}map.add(layer);})</script>

官方提供的 API 可以支持,修改填充颜色和行政区的描边。
需要注意的是 每一个行政区都需要一个唯一标识,adcode 官方有提供 行政区对应的 ascode。

显示一个城市的地铁线

如果要显示一个城市的地铁图,官方也是提供了不一样的 API,与地图 SDK 是不一样的。

地图的 SDK 链接是这样的:

https://webapi.amap.com/subway?v=1.0&key=6d715cd10a703544388c24c35e7e89d6&callback=cbk

注意看 URL 中有一个 subway、key 和 callbanck。cbk 就是 SDK 加载完成后,需要执行的函数。

下面这段代码就是显示上海的地铁图:

<html><head><meta charset="UTF-8"><!--重要 meta, 必须!--><meta name="viewport"content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0,shrink-to-fit=no" /><title>SUBWAY</title>
</head><body><div id="mysubway"></div><script src="https://webapi.amap.com/subway?v=1.0&key=6d715cd10a703544388c24c35e7e89d6&callback=cbk"></script><script type="text/javascript">//开启 easy 模式, 直接完成地铁图基本功能, 无需自己写交互window.cbk = function () {var mysubway = subway("mysubway", { easy: 1, adcode: 3100 });};</script>
</body></html>

效果图:

生成的地图可以拖动,可以选择起点终点,进行地图路线规划,同时我们也可以添加标记:

mysubway.addMarker('南锣鼓巷');

高德地图在各个框架里的使用

在之前单页面项目中,地图 SDK 的引入,我们可以在根目录 index.html 中直接引入,也可以在组件里引入,但看起来都不是很规范。

于是高德地图在 2.0 的时候,提供一个官方的 SDK 加载方式,使用 JSAPI Loader 来加载高德地图 SDK。

具体方式如下:

npm i @amap/amap-jsapi-loader --save-dev

安装依赖包:

import AMapLoader from '@amap/amap-jsapi-loader';
AMapLoader.load({"key": "您申请的 key 值", // 申请好的 Web 端开发者 Key,首次调用 load 时必填"version": "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15"plugins": [] //插件列表
}).then((AMap) => {map = new AMap.Map('container');
}).catch(e => {console.log(e);
})

以上是高德地图 SDK 在单页面应用中的使用,除此之外,在小程序中使用也可以使用此方法。

在微信小程序中使用高德 SDK 是比较麻烦的,因为小程序限制不能加载外部的脚本,并且不能使用 dom 接口。

所有需要将 SDK 下载到项目中:

高地地图微信小程序 SDK 下载地址

首先需要先申请一个微信小程序的 SDK 的 appkey:

将 SDK 下载项目目录里,像这样子引用:

var amapFile = require('../../sdk/amap-wx.js');//如:..­/..­/libs/amap-wx.js

Demo 的核心代码如下:

var amapFile = require('../../sdk/amap-wx.js');//如:..­/..­/libs/amap-wx.js
var markersData = [];
Page({data: {markers: [],latitude: '',longitude: '',textData: {}},makertap: function(e) {var id = e.markerId;var that = this;that.showMarkerInfo(markersData,id);that.changeMarkerColor(markersData,id);},onLoad: function() {var that = this;var myAmapFun = new amapFile.AMapWX({key:'fee03d59db0d38196582cf0cbb734e05'});myAmapFun.getPoiAround({iconPathSelected: '选中 marker 图标的相对路径', //如:..­/..­/img/marker_checked.pngiconPath: '未选中 marker 图标的相对路径', //如:..­/..­/img/marker.pngsuccess: function(data){markersData = data.markers;that.setData({markers: markersData});that.setData({latitude: markersData[0].latitude});that.setData({longitude: markersData[0].longitude});that.showMarkerInfo(markersData,0);},fail: function(info){wx.showModal({title:info.errMsg})}})},showMarkerInfo: function(data,i){var that = this;that.setData({textData: {name: data[i].name,desc: data[i].address}});},changeMarkerColor: function(data,i){var that = this;var markers = [];for(var j = 0; j < data.length; j++){if(j==i){data[j].iconPath = "选中 marker 图标的相对路径"; //如:..­/..­/img/marker_checked.png}else{data[j].iconPath = "未选中 marker 图标的相对路径"; //如:..­/..­/img/marker.png}markers.push(data[j]);}that.setData({markers: markers});}})

以上是核心代码,完整代码请查看这里。

Demo 截图:

写在最后

文章到这里就算写完了,文中有哪些不清楚,或不够完善的,都可以加我微信来咨询我 demon_0212,谢谢大家了。


本文首发于 GitChat,未经授权不得转载,转载需与 GitChat 联系。

基于高德地图开发 Web 应用相关推荐

  1. 滴滴打车,打车软件app实现。小车在地图上平滑移动的实现,Android,基于高德地图开发实现

    最近闲的没事干,发现滴滴出行的app,地图上的小汽车可以跑,很炫是不是,我们公司也是做车辆监控的app的,我就一直揣摩着怎么也让我们的小汽车在地图上跑来跑去啊,这样给人感觉好点,废话不说了,先看下滴滴 ...

  2. 快速掌握Web高德地图开发

    本文章致力于帮助对Web高德地图开发感兴趣的朋友快速掌握开发要领,如果能对屏幕前的您有所助益,我将十分荣幸. 如何快速掌握Web高德地图开发? 要领如下: 一. 首先要知道高德地图本身有提供开放的地图 ...

  3. [WEB地图] 2017高德地图API WEB开发(key申请,地图搭建)简约教程

    前端时间因为公司需要研究 了一下百度的教程 然后写个简约的笔记记录一下自己学习的收获,只为了满足自己暂时的写作热情 高德地图WEB开发(key申请.api)简约教程 1.首先我们需要去"高德 ...

  4. python交通调查数据处理_GitHub - unlimitbladeworks/traffic-monitor: 基于高德地图的交通数据分析...

    traffic-monitor(基于高德地图的交通数据分析) 设计需求在于每天上班早高峰期,每次都提前出门,虽然有地图可以实时查看路况,但是再过一阵时间 就会异常的堵车如果通过数据监控分析每天指定路段 ...

  5. 基于高德地图JsAPI进行浏览器精确定位,实现手机端考勤打卡功能

    前言: 由于项目需求需要在项目中实现手机端(基于网页)考勤打卡功能,最初考虑使用H5自身定位功能,但尝试过后,效果很不稳定.然后尝试使用百度地图JsAPI,百度家的稳定倒是很稳定,没想到的是定位位置和 ...

  6. 基于高德地图实现vue3的移动端物流路线相关功能

    基于高德地图实现vue3的移动端物流路线相关功能 自我记录 一.参考文档 高德地图开放平台: https://lbs.amap.com/ Web开发-JSAPI文档: https://lbs.amap ...

  7. 只用一个marker 替换 高德_Android基于高德地图完全自定义Marker的实现方法

    前言 相信做地图社交类APP开发的大家都知道,一般情况下,为了整体的美观和用户体验度,我们需要定制化Marker的样式.本文中实现的方式都是基于高德地图的,百度地图也类似,大家可以照葫芦画瓢,废话不多 ...

  8. android 基于高德地图的轨迹回放

    android 基于高德地图的轨迹回放 前段时间公司项目有一个需求,就是需要看到设备上传之后的轨迹路线,并且可以实现回放的整个过程,功能包括路线回放.地图位置插点.回放之后的轨迹标记颜色.回放加速等功 ...

  9. 南邮Android实验报告三:基于高德地图的综合应用

    实验三 基于高德地图的综合应用 一.目的要求 1.学会安卓应用中涉及位置服务时的解决方案. 2.练习在使用第三方插件时,遇到版本不兼容时的处理步骤和方法. 二.实验环境 1.硬件配置:Intel Co ...

最新文章

  1. Codeforces Round #556 (Div. 2)
  2. while循环语句用法_EXCEL退出DO LOOP循环语句|until、while
  3. 分组查询最晚一条数据(ORACLE)
  4. php.ini settimelimit,PHP-set_time_limit()和ini_set('max_execution_time',...)之间的区别...
  5. python之虚拟环境
  6. 5折交叉验证_交叉验证的方法主要分为哪些?
  7. tensorflow版本1.11.0
  8. 大学计算机实验教程实验报告2.2,大学计算机实验2 实验报告.pdf
  9. 神经网络基本原理简明教程之线性回归预测房价
  10. 华为云主机被植入挖矿,主机变肉鸡破解实录。
  11. linux系统软路由软件,使用Linux+Zebra构建软路由系统
  12. UE4 DataAsset 的使用
  13. 不愿意和别人打交道_一个人不愿意和同事打交道,大多是这3个原因,你了解吗...
  14. 21个经典故事,值得收藏
  15. H5DS简单又强大的H5编辑器
  16. linux shell 中文输入,Linux操作系统的Shell环境中输入中文
  17. th标签内的Cannot resolve ‘msg‘爆红出现的问题
  18. 建造属于你的无人驾驶车——(七)为XACRO模型添加GAZEBO属性与运动控制插件
  19. 移动硬盘无法读取怎么修复?这一招好用
  20. C语言读取BMP文件

热门文章

  1. 报文、报文段、分组、包、数据报、帧、数据流的概念区别
  2. dataframe格式知识点总结
  3. Android下音频的测试程序tinyalsa(录音,放音,查看声卡信息)
  4. 如何从光盘启动计算机!
  5. 对电瓶车管控问题的思考
  6. alexa api php,PHP通过Alexa官方API获取网站Alexa排名 - 米扑博客
  7. Ubuntu下不能看视频的解决办法
  8. VS2019生成Steup文件在其他处理器运行
  9. sqlserver数据库清理(收缩文件)
  10. 2022字节跳动数仓实习面经(2、3面、hr面)