react hooks 高德地图的应用

news2024/11/18 7:51:38

一、准备

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 (
      <div
        id="container"
        className={styles.container}
        style={{ height: '800px' }}
      ></div>
  );
}

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(
            '<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> ',
          );
          info.push('<div style="padding:7px 0px 0px 0px;"><h4>高德软件</h4>');
          info.push(
            "<p class='input-item'>电话 : 010-84107000   邮编 : 100102</p>",
          );
          info.push(
            "<p class='input-item'>地址 :北京市朝阳区望京阜荣街10号首开广场4层</p></div></div>",
          );

          infoWindow = new AMap.InfoWindow({
            content: info.join(''), //使用默认信息窗体框样式,显示信息内容
          });

          infoWindow?.open(map, e.lnglat);
        });

        // 关闭信息窗体
        // infoWindow?.close();

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();

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

首先需要设置一下密钥

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

创建id为tipinput的输入框 

<input 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); //关键字查询查询
        }); //注册监听,当选中某条记录时会触发

 

四、完整代码

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(
            '<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> ',
          );
          info.push('<div style="padding:7px 0px 0px 0px;"><h4>高德软件</h4>');
          info.push(
            "<p class='input-item'>电话 : 010-84107000   邮编 : 100102</p>",
          );
          info.push(
            "<p class='input-item'>地址 :北京市朝阳区望京阜荣街10号首开广场4层</p></div></div>",
          );

          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 (
    <div className="map">
      <div id="container" style={{ height: '800px' }}></div>
      <Input id="tipinput" placeholder="请输入搜索内容" />
    </div>
  );
}

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;
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1376105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins+nexus

jiekins安装完成 1、安装java环境 [rootnexus ~]# tar -xf jdk-8u211-linux-x64.tar.gz -C /usr/local [rootnexus ~]# vim /etc/profile.d/java.sh JAVA_HOME/usr/local/jdk1.8.0_211 PATH$PATH:$JAVA_HOME/bin [rootnexus ~]# source /etc/profile.d/java.sh 必须要选择与n…

使用Notepad++将多行数据合并成一行

步骤 1、按CtrlF&#xff0c;弹出“替换”的窗口&#xff1b; 2、选择“替换”菜单&#xff1b; 3、“查找目标”内容输入为&#xff1a;\r\n&#xff1b; 4、“替换为”内容为空&#xff1b; 5、“查找模式”选择为正则表达式&#xff1b; 6、设置好之后&#xff0c;点击“全…

Unity URP下阴影锯齿

1.概述 在Unity开发的URP项目中出现阴影有明显锯齿。如下图所示&#xff1a; 并且在主光源的Shadow Type已经是Soft Shadows模式了。 2.URP Asset 阴影出现锯齿说明阴影质量不高&#xff0c;所以要先找到URP Asset文件进行阴影质量参数的设置。 1.打开PlayerSetting找到Graph…

概率论与数理统计-第6章 参数估计

6.1 点估计问题概述 一、点估计的概念 二、评价估计量的标准 无偏性 定义1&#xff1a;设^ θ(X1,…,Xn)是未知参数θ的估计量&#xff0c;若E(^ θ)θ,则称^θ为θ的无偏估计量定理1&#xff1a;设X1,…,Xn,为取自总体X的样本&#xff0c;总体X的均值为μ&#xff0c;方差为…

LT8911EX LVDS 转 eDP

概述 Lontium LT8911EX 是 LVDS 至 eDP 转换器&#xff0c;具有单端口或双端口可配置 LVDS 接收器&#xff0c;具有 1 个时钟通道和多达 8 个数据通道&#xff0c;每个数据通道的最大工作速率为 1.2Gbps&#xff0c;最大输入带宽为 9.6Gbps。该转换器对输入LVDS数据进行反串行…

上海亚商投顾:创业板指放量涨近2% 全市场超4400只个股上涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡反弹&#xff0c;创业板指午后涨超2%。华为概念股爆发&#xff0c;鸿蒙方向领涨&#xff0c;创识…

聚乙烯PE的特性有哪些?UV胶水能够粘接聚乙烯PE吗?

聚乙烯&#xff08;Polyethylene&#xff0c;PE&#xff09;是一种聚合物&#xff0c;是由乙烯&#xff08;ethylene&#xff09;单体通过聚合反应形成的合成塑料。以下是聚乙烯的一些主要化学特性&#xff1a; 1.化学式&#xff1a; 聚乙烯的基本化学式是 (C2H4)n&#xff0c;…

闩锁效应(Latch-up)

闩锁效应&#xff08;Latch-up&#xff09;原理解析 什么是闩锁效应&#xff08;Latch-up&#xff09;&#xff1f; 在CMOS N阱设计中&#xff0c;实际上是由于CMOS电路中基极和集电极相互连接的两个PNP和NPN双极性BJT管子(下图中&#xff0c;侧面式NPN和垂直式PNP)的回路放大…

python股票分析挖掘预测技术指标知识跳空缺口指标详解(5)

本人股市多年的老韭菜&#xff0c;各种股票分析书籍&#xff0c;技术指标书籍阅历无数&#xff0c;萌发想法&#xff0c;何不自己开发个股票预测分析软件&#xff0c;选择python因为够强大&#xff0c;它提供了很多高效便捷的数据分析工具包。 我们已经初步的接触与学习其中数…

Discourse 未活动的用户是怎么处理的

Discourse 目前有一个参数为 clean up inactive users after days 来控制不活跃或者未激活的用户。 如果你的用户满足下面的条件的话&#xff0c;系统将会在到期后对用户进行清理和删除 从未在 Discourse 站点上发布任何内容 如果你在 Discourse 站点上发布了内容&#xff0c…

使用srs_librtmp实现RTMP推流

1、背景 由于项目有需求在一个现有的产品上增加RTMP推流的功能&#xff0c;目前只推视频流。 2、方案选择 由于是在现有的产品上新增功能&#xff0c;那么为了减少总的成本&#xff0c;故选择只动应用软件的来实现需求。 现有的产品中的第三方库比较有限&#xff0c;连个ffmp…

2024深圳国际电池创新技术交流展览会

2024深圳国际电池创新技术交流展览会 2024 Shenzhen International Battery Technology Exchange Exhibition 时间&#xff1a;2024年08月28-30日 地点&#xff1a;深圳国际会展中心(国际) 详询主办方陆先生 I38&#xff08;前三位&#xff09; I82I&#xff08;中间四位…

【C语言】ipoib驱动 - ipoib_cm_post_receive_nonsrq_rss函数

一、ipoib_cm_post_receive_nonsrq_rss函数定义 static int ipoib_cm_post_receive_nonsrq_rss(struct net_device *dev,struct ipoib_cm_rx *rx, int id) {struct ipoib_dev_priv *priv ipoib_priv(dev);struct ipoib_recv_ring *recv_ring priv->recv_ring rx->ind…

首个云原生、分布式、全栈国产化银行核心业务系统投产上线丨TiDB × 杭州银行

日前&#xff0c;杭州银行新一代核心业务系统成功投产上线。 新核心系统是业内首个实际投产的云原生、分布式、全栈国产化的银行核心系统&#xff0c;是金融科技领域突破关键核心技术应用的重大实践。 新核心系统自上线以来运行安全稳定&#xff0c;大幅提升了业务处理效率&am…

基于JavaWeb+BS架构+SpringBoot+Vue基于hive旅游数据的分析与应用系统的设计和实现

基于JavaWebBS架构SpringBootVue基于hive旅游数据的分析与应用系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 1 概 述 5 1.1 研究背景 5 1.2 研究意义 5 1.3 研究内容…

香港Web3:Web3的新热土

相关推荐点击查看TechubNews 随着区块链技术的快速发展&#xff0c;Web3的概念逐渐在全球范围内受到关注。作为亚洲的金融中心&#xff0c;香港在Web3领域也展现出了极大的热情和潜力。本文将探讨香港在Web3领域的发展现状、机遇与挑战。 一、香港Web3的发展现状 香港在Web3…

使用python执行系统命令的五种方式

在日常开发中&#xff0c;有时需要在Python脚本中执行系统命令&#xff0c;Python有五种方式来执行系统命令&#xff0c;推荐使用第五种。 python执行系统命令的五种方式 方法1: os.system 这是最简单的方法&#xff0c;适合简单的业务场景&#xff0c;输入为完整命令字符串…

用Python做一个2048小游戏

文章目录 逻辑设计绘图逻辑主循环 逻辑设计 2048的逻辑无非是操作 4 4 4\times4 44的方格&#xff0c;每个方格中有一个数&#xff0c;这些数可以移动&#xff0c;如果两个相同的数字在移动时相撞了&#xff0c;就可以彼此合并。 而这个 4 4 4\times4 44的方格&#xff0c;…

scratch考试“画图”相关考点一网打尽

最近2023年12月17日举行的第15届蓝桥STEMA测评Scratch编程初/中级组编程第3题—六花阵图 在讲解这个题目&#xff0c;可以延申scratch所有的基础图形&#xff0c;学会这篇&#xff0c;碰到关于“图形”类题目基本上都可以搞定 六花阵图 编程实现&#xff1a; 六花阵图。 注…

C#,入门教程(15)——类(class)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(14)——字符串与其他数据类型的转换https://blog.csdn.net/beijinghorn/article/details/124004562 物以类聚&#xff0c;凡物必类。 类的使用&#xff0c;须遵循几个简单的原则&#xff1a; &#xff08;1&#xff09;能类则类&a…