当前位置:   article > 正文

amap/amap-jsapi-loader -- 高德地图

amap-jsapi-loader

一、准备

1.登录控制台

登录 高德开放平台控制台,如果没有开发者账号,请 注册开发者

2.创建 key

进入应用管理,创建新应用,新应用中添加 key,服务平台选择 Web端(JS API)。

3.获取 key 和密钥

创建成功后,可获取 key 和安全密钥。

 

二、初始化地图

1.下载依赖包

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

2.引入 JS API  Loader

import AMapLoader from '@amap/amap-jsapi-loader'; 

3.新建 MapContainer.jsx 文件

在项目中新建 MapContainer.jsx 文件,用作地图组件脚本。

  1. import AMapLoader from '@amap/amap-jsapi-loader';
  2. import { useEffect } from 'react';
  3. import styles from './MapContainer.css';
  4. export default function MapContainer() {
  5. let map: any = null;
  6. useEffect(() => {
  7. AMapLoader.load({
  8. key: 'key', // 申请好的Web端开发者Key,首次调用 load 时必填
  9. version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
  10. })
  11. .then((AMap: any) => {
  12. //创建地图实例
  13. map = new AMap.Map('container', {
  14. // 设置地图容器id
  15. viewMode: '2D', // 是否为3D地图模式
  16. zoom: 10, // 初始化地图级别
  17. center: [116.397428, 39.90923], // 初始化地图中心点位置
  18. });
  19. };)
  20. .catch((e) => {
  21. console.log(e);
  22. });
  23. return () => {
  24. map?.destroy(); //销毁地图
  25. };
  26. }, []);
  27. return (
  28. <div
  29. id="container"
  30. className={styles.container}
  31. style={{ height: '800px' }}
  32. ></div>
  33. );
  34. }

4.新建 MapContainer.less 文件

在项目中新建 MapContainer.less 文件,用作地图组件样式。

  1. .container{
  2. padding: 0px;
  3. margin: 0px;
  4. width: 100%;
  5. }

5.效果图

三、插件的使用

1.基础插件引入

  1. AMap.plugin(
  2. ['AMap.Scale', 'AMap.Geolocation', 'AMap.ToolBar', 'AMap.ControlBar'],
  3. function () {
  4. //在回调函数中实例化插件,并使用插件功能
  5. map.addControl(new AMap.Scale()); //比例尺
  6. map.addControl(new AMap.ToolBar()); //缩放工具条
  7. map.addControl(new AMap.ControlBar()); //控制罗盘
  8. map.addControl(
  9. new AMap.Geolocation({
  10. position: {
  11. bottom: '80px',
  12. left: '15px',
  13. },
  14. }),
  15. ); //定位控件,用来获取和展示用户主机所在的经纬度位置
  16. },
  17. );

更多插件参考官方文档

 2.信息窗体 InfoWindow

默认信息窗体封装了关闭按钮,使用 API 默认的信息窗体样式,这个时候只需要对 InfoWindow 设定 content 属性即可,content 可以是 dom 对象,也可以是 html 识别的字符串。

  1. //定义信息窗口
  2. let infoWindow: any = null;
  3. //打开信息窗体
  4. map.on('click', function (e: any) {
  5. //构建信息窗体中显示的内容
  6. let info = [];
  7. info.push(
  8. '<div class=\'input-card content-window-card\'><div><img style="float:left;width:67px;height:16px;" src=" https://webapi.amap.com/images/autonavi.png "/></div> ',
  9. );
  10. info.push('<div style="padding:7px 0px 0px 0px;"><h4>高德软件</h4>');
  11. info.push(
  12. "<p class='input-item'>电话 : 010-84107000 邮编 : 100102</p>",
  13. );
  14. info.push(
  15. "<p class='input-item'>地址 :北京市朝阳区望京阜荣街10号首开广场4层</p></div></div>",
  16. );
  17. infoWindow = new AMap.InfoWindow({
  18. content: info.join(''), //使用默认信息窗体框样式,显示信息内容
  19. });
  20. infoWindow?.open(map, e.lnglat);
  21. });
  22. // 关闭信息窗体
  23. // infoWindow?.close();

3.右键菜单 ContextMenu

  1. //添加右键点击事件
  2. let contextMenu: any = null;
  3. //地图绑定鼠标右击事件——弹出右键菜单
  4. map.on('rightclick', function (e: any) {
  5. let contextMenuPositon: any = null;
  6. contextMenu = new AMap.ContextMenu({ isOpen: false });
  7. //右键放大
  8. contextMenu?.addItem(
  9. '放大一级',
  10. function () {
  11. map.zoomIn();
  12. },
  13. 0,
  14. );
  15. //右键缩小
  16. contextMenu?.addItem(
  17. '缩小一级',
  18. function () {
  19. map.zoomOut();
  20. },
  21. 1,
  22. );
  23. //右键显示全国范围
  24. contextMenu?.addItem(
  25. '缩放至全国范围',
  26. function () {
  27. map.setZoomAndCenter(4, [108.946609, 34.262324]);
  28. },
  29. 2,
  30. );
  31. //右键添加Marker标记
  32. contextMenu?.addItem(
  33. '添加标记',
  34. function () {
  35. new AMap.Marker({
  36. map: map,
  37. position: contextMenuPositon, //基点位置
  38. });
  39. },
  40. 3,
  41. );
  42. contextMenu?.open(map, e.lnglat);
  43. contextMenuPositon = e.lnglat;
  44. });
  45. // 关闭右键弹框
  46. // contextMenu?.close();

4.输入提示与 POI 搜索示例

首先需要设置一下密钥

  1. window._AMapSecurityConfig = {
  2. securityJsCode: 'b4fcd93bbbaead6bcc38957a0f0e3df6',
  3. };

创建id为tipinput的输入框 

<input id="tipinput" /> 

配置 

  1. // 搜索
  2. let auto = new AMap.AutoComplete({ input: 'tipinput' });
  3. let placeSearch = new AMap.PlaceSearch({
  4. map: map,
  5. }); //构造地点查询类
  6. auto.on('select', function (e: any) {
  7. placeSearch.setCity(e.poi.adcode);
  8. placeSearch.search(e.poi.name); //关键字查询查询
  9. }); //注册监听,当选中某条记录时会触发

 

四、完整代码

1.效果图

2.代码 

  1. import AMapLoader from '@amap/amap-jsapi-loader';
  2. import { Input } from 'antd';
  3. import { useEffect } from 'react';
  4. import './MapContainer.less';
  5. window._AMapSecurityConfig = {
  6. securityJsCode: 'b4fcd93bbbaead6bcc38957a0f0e3df6',
  7. };
  8. export default function MapContainer() {
  9. let map: any = null;
  10. const createMap = (AMap: any) => {
  11. //1.创建地图实例
  12. map = new AMap.Map('container', {
  13. // 设置地图容器id
  14. viewMode: '2D', // 是否为3D地图模式
  15. zoom: 10, // 初始化地图级别
  16. center: [116.397428, 39.90923], // 初始化地图中心点位置
  17. resizeEnable: true, // 调整大小启用
  18. // layers: [new AMap.TileLayer.Satellite()], //设置图层,可设置成包含一个或多个图层的数组
  19. // mapStyle: 'amap://styles/whitesmoke', //设置地图的显示样式
  20. });
  21. // 2.加载插件
  22. AMap.plugin(
  23. [
  24. 'AMap.ToolBar',
  25. 'AMap.Scale',
  26. 'AMap.HawkEye',
  27. 'AMap.ControlBar',
  28. 'AMap.MapType',
  29. 'AMap.Geolocation',
  30. 'AMap.ContextMenu',
  31. 'AMap.AutoComplete',
  32. 'AMap.PlaceSearch',
  33. ],
  34. function () {
  35. //在回调函数中实例化插件,并使用插件功能
  36. map.addControl(
  37. new AMap.ControlBar({
  38. position: {
  39. top: '10px',
  40. right: '10px',
  41. },
  42. }),
  43. ); //控制罗盘
  44. map.addControl(new AMap.HawkEye()); //鹰眼
  45. map.addControl(
  46. new AMap.Geolocation({
  47. position: {
  48. bottom: '160px',
  49. left: '20px',
  50. },
  51. }),
  52. ); //定位控件,用来获取和展示用户主机所在的经纬度位置
  53. map.addControl(
  54. new AMap.ToolBar({
  55. position: {
  56. bottom: '80px',
  57. left: '21px',
  58. },
  59. }),
  60. ); //缩放工具条
  61. map.addControl(
  62. new AMap.Scale({
  63. position: {
  64. bottom: '35px',
  65. left: '20px',
  66. },
  67. }),
  68. ); //比例尺
  69. // map.addControl(
  70. // new AMap.MapType({
  71. // position: {
  72. // bottom: '300px',
  73. // right: '0',
  74. // },
  75. // }),
  76. // ); //类别切换控件
  77. //3.添加右键点击事件
  78. let contextMenu: any = null;
  79. //4.信息窗口
  80. let infoWindow: any = null;
  81. //地图绑定鼠标右击事件——弹出右键菜单
  82. map.on('rightclick', function (e: any) {
  83. infoWindow?.close(); //清空点击事件弹框
  84. let contextMenuPositon: any = null;
  85. contextMenu = new AMap.ContextMenu({ isOpen: false });
  86. //右键放大
  87. contextMenu?.addItem(
  88. '放大一级',
  89. function () {
  90. map.zoomIn();
  91. },
  92. 0,
  93. );
  94. //右键缩小
  95. contextMenu?.addItem(
  96. '缩小一级',
  97. function () {
  98. map.zoomOut();
  99. },
  100. 1,
  101. );
  102. //右键显示全国范围
  103. contextMenu?.addItem(
  104. '缩放至全国范围',
  105. function () {
  106. map.setZoomAndCenter(4, [108.946609, 34.262324]);
  107. },
  108. 2,
  109. );
  110. //右键添加Marker标记
  111. contextMenu?.addItem(
  112. '添加标记',
  113. function () {
  114. new AMap.Marker({
  115. map: map,
  116. position: contextMenuPositon, //基点位置
  117. });
  118. },
  119. 3,
  120. );
  121. contextMenu?.open(map, e.lnglat);
  122. contextMenuPositon = e.lnglat;
  123. });
  124. //打开信息窗体
  125. map.on('click', function (e: any) {
  126. contextMenu?.close(); //关闭右键弹框
  127. //构建信息窗体中显示的内容
  128. let info = [];
  129. info.push(
  130. '<div class=\'input-card content-window-card\'><div><img style="float:left;width:67px;height:16px;" src=" https://webapi.amap.com/images/autonavi.png "/></div> ',
  131. );
  132. info.push('<div style="padding:7px 0px 0px 0px;"><h4>高德软件</h4>');
  133. info.push(
  134. "<p class='input-item'>电话 : 010-84107000 邮编 : 100102</p>",
  135. );
  136. info.push(
  137. "<p class='input-item'>地址 :北京市朝阳区望京阜荣街10号首开广场4层</p></div></div>",
  138. );
  139. infoWindow = new AMap.InfoWindow({
  140. content: info.join(''), //使用默认信息窗体框样式,显示信息内容
  141. });
  142. infoWindow?.open(map, e.lnglat);
  143. });
  144. // 4.搜索
  145. let auto = new AMap.AutoComplete({ input: 'tipinput' });
  146. let placeSearch = new AMap.PlaceSearch({
  147. map: map,
  148. }); //构造地点查询类
  149. auto.on('select', function (e: any) {
  150. placeSearch.setCity(e.poi.adcode);
  151. placeSearch.search(e.poi.name); //关键字查询查询
  152. }); //注册监听,当选中某条记录时会触发
  153. },
  154. );
  155. };
  156. const onCatch = (e: any) => {
  157. console.log(e);
  158. };
  159. const mountMap = () => {
  160. map?.destroy(); //销毁地图
  161. };
  162. useEffect(() => {
  163. AMapLoader.load({
  164. key: 'e558ae3e565bc8f545a98d88794aada5', // 申请好的Web端开发者Key,首次调用 load 时必填
  165. version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
  166. plugins: [], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
  167. })
  168. .then(createMap)
  169. .catch(onCatch);
  170. return mountMap;
  171. }, []);
  172. return (
  173. <div className="map">
  174. <div id="container" style={{ height: '800px' }}></div>
  175. <Input id="tipinput" placeholder="请输入搜索内容" />
  176. </div>
  177. );
  178. }

3.样式 

  1. .map {
  2. position: relative;
  3. .container {
  4. padding: 0px;
  5. margin: 0px;
  6. width: 100%;
  7. }
  8. #tipinput {
  9. position: absolute;
  10. left: 10px;
  11. top: 10px;
  12. width: 200px;
  13. }
  14. .amap-sug-result {
  15. z-index: 9999;
  16. visibility: visible;
  17. }
  18. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号