react hooks 高德地图的应用

一、准备

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 文件,用作地图组件脚本。

import AMapLoader from '@amap/amap-jsapi-loader';
import { useEffect } from 'react';
import styles from './MapContainer.css';

export default function MapContainer() {
  let map: any = null;

  useEffect(() => {
    AMapLoader.load({
      key: 'key', // 申请好的Web端开发者Key,首次调用 load 时必填
      version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
    })
      .then((AMap: any) => {
        //创建地图实例
        map = new AMap.Map('container', {
          // 设置地图容器id
          viewMode: '2D', // 是否为3D地图模式
          zoom: 10, // 初始化地图级别
          center: [116.397428, 39.90923], // 初始化地图中心点位置
        });
      };)
      .catch((e) => {
        console.log(e);
      });

    return () => {
      map?.destroy(); //销毁地图
    };
  }, []);

  return (
      
); }

4.新建 MapContainer.less 文件

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

.container{
  padding: 0px;
  margin: 0px;
  width: 100%;
}

5.效果图

三、插件的使用

1.基础插件引入

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

更多插件参考官方文档~

 2.信息窗体 InfoWindow

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

        //定义信息窗口
        let infoWindow: any = null;
        
        //打开信息窗体
        map.on('click', function (e: any) {
          //构建信息窗体中显示的内容
          let info = [];
          info.push(
            '
', ); info.push('

高德软件

'); info.push( "

电话 : 010-84107000 邮编 : 100102

", ); info.push( "

地址 :北京市朝阳区望京阜荣街10号首开广场4层

", ); infoWindow = new AMap.InfoWindow({ content: info.join(''), //使用默认信息窗体框样式,显示信息内容 }); infoWindow?.open(map, e.lnglat); }); // 关闭信息窗体 // infoWindow?.close();

react hooks 高德地图的应用_第1张图片

3.右键菜单 ContextMenu

        //添加右键点击事件
        let contextMenu: any = null;

        //地图绑定鼠标右击事件——弹出右键菜单
        map.on('rightclick', function (e: any) {
          let contextMenuPositon: any = null;
          contextMenu = new AMap.ContextMenu({ isOpen: false });
          //右键放大
          contextMenu?.addItem(
            '放大一级',
            function () {
              map.zoomIn();
            },
            0,
          );

          //右键缩小
          contextMenu?.addItem(
            '缩小一级',
            function () {
              map.zoomOut();
            },
            1,
          );

          //右键显示全国范围
          contextMenu?.addItem(
            '缩放至全国范围',
            function () {
              map.setZoomAndCenter(4, [108.946609, 34.262324]);
            },
            2,
          );

          //右键添加Marker标记
          contextMenu?.addItem(
            '添加标记',
            function () {
              new AMap.Marker({
                map: map,
                position: contextMenuPositon, //基点位置
              });
            },
            3,
          );

          contextMenu?.open(map, e.lnglat);
          contextMenuPositon = e.lnglat;
        });

        // 关闭右键弹框
        // contextMenu?.close();

react hooks 高德地图的应用_第2张图片

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

首先需要设置一下密钥

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

创建id为tipinput的输入框 

 

配置 

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

 react hooks 高德地图的应用_第3张图片

四、完整代码

1.效果图

2.代码 

import AMapLoader from '@amap/amap-jsapi-loader';
import { Input } from 'antd';
import { useEffect } from 'react';
import './MapContainer.less';
window._AMapSecurityConfig = {
  securityJsCode: 'b4fcd93bbbaead6bcc38957a0f0e3df6',
};
export default function MapContainer() {
  let map: any = null;

  const createMap = (AMap: any) => {
    //1.创建地图实例
    map = new AMap.Map('container', {
      // 设置地图容器id
      viewMode: '2D', // 是否为3D地图模式
      zoom: 10, // 初始化地图级别
      center: [116.397428, 39.90923], // 初始化地图中心点位置
      resizeEnable: true, // 调整大小启用
      //   layers: [new AMap.TileLayer.Satellite()], //设置图层,可设置成包含一个或多个图层的数组
      //   mapStyle: 'amap://styles/whitesmoke', //设置地图的显示样式
    });

    // 2.加载插件
    AMap.plugin(
      [
        'AMap.ToolBar',
        'AMap.Scale',
        'AMap.HawkEye',
        'AMap.ControlBar',
        'AMap.MapType',
        'AMap.Geolocation',
        'AMap.ContextMenu',
        'AMap.AutoComplete',
        'AMap.PlaceSearch',
      ],
      function () {
        //在回调函数中实例化插件,并使用插件功能
        map.addControl(
          new AMap.ControlBar({
            position: {
              top: '10px',
              right: '10px',
            },
          }),
        ); //控制罗盘
        map.addControl(new AMap.HawkEye()); //鹰眼
        map.addControl(
          new AMap.Geolocation({
            position: {
              bottom: '160px',
              left: '20px',
            },
          }),
        ); //定位控件,用来获取和展示用户主机所在的经纬度位置
        map.addControl(
          new AMap.ToolBar({
            position: {
              bottom: '80px',
              left: '21px',
            },
          }),
        ); //缩放工具条
        map.addControl(
          new AMap.Scale({
            position: {
              bottom: '35px',
              left: '20px',
            },
          }),
        ); //比例尺

        // map.addControl(
        //   new AMap.MapType({
        //     position: {
        //       bottom: '300px',
        //       right: '0',
        //     },
        //   }),
        // ); //类别切换控件

        //3.添加右键点击事件
        let contextMenu: any = null;
        //4.信息窗口
        let infoWindow: any = null;

        //地图绑定鼠标右击事件——弹出右键菜单
        map.on('rightclick', function (e: any) {
          infoWindow?.close(); //清空点击事件弹框
          let contextMenuPositon: any = null;
          contextMenu = new AMap.ContextMenu({ isOpen: false });
          //右键放大
          contextMenu?.addItem(
            '放大一级',
            function () {
              map.zoomIn();
            },
            0,
          );

          //右键缩小
          contextMenu?.addItem(
            '缩小一级',
            function () {
              map.zoomOut();
            },
            1,
          );

          //右键显示全国范围
          contextMenu?.addItem(
            '缩放至全国范围',
            function () {
              map.setZoomAndCenter(4, [108.946609, 34.262324]);
            },
            2,
          );

          //右键添加Marker标记
          contextMenu?.addItem(
            '添加标记',
            function () {
              new AMap.Marker({
                map: map,
                position: contextMenuPositon, //基点位置
              });
            },
            3,
          );

          contextMenu?.open(map, e.lnglat);
          contextMenuPositon = e.lnglat;
        });

        //打开信息窗体
        map.on('click', function (e: any) {
          contextMenu?.close(); //关闭右键弹框
          //构建信息窗体中显示的内容
          let info = [];
          info.push(
            '
', ); info.push('

高德软件

'); info.push( "

电话 : 010-84107000 邮编 : 100102

", ); info.push( "

地址 :北京市朝阳区望京阜荣街10号首开广场4层

", ); infoWindow = new AMap.InfoWindow({ content: info.join(''), //使用默认信息窗体框样式,显示信息内容 }); infoWindow?.open(map, e.lnglat); }); // 4.搜索 let auto = new AMap.AutoComplete({ input: 'tipinput' }); let placeSearch = new AMap.PlaceSearch({ map: map, }); //构造地点查询类 auto.on('select', function (e: any) { placeSearch.setCity(e.poi.adcode); placeSearch.search(e.poi.name); //关键字查询查询 }); //注册监听,当选中某条记录时会触发 }, ); }; const onCatch = (e: any) => { console.log(e); }; const mountMap = () => { map?.destroy(); //销毁地图 }; useEffect(() => { AMapLoader.load({ key: 'e558ae3e565bc8f545a98d88794aada5', // 申请好的Web端开发者Key,首次调用 load 时必填 version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15 plugins: [], // 需要使用的的插件列表,如比例尺'AMap.Scale'等 }) .then(createMap) .catch(onCatch); return mountMap; }, []); return (
); }

3.样式 

.map {
  position: relative;
  .container {
    padding: 0px;
    margin: 0px;
    width: 100%;
  }
  #tipinput {
    position: absolute;
    left: 10px;
    top: 10px;
    width: 200px;
  }
  .amap-sug-result {
    z-index: 9999;
    visibility: visible;
  }
}

你可能感兴趣的:(第三方工具库,react.js,arcgis,前端)