二、前端高德地图、渲染标记(Marker)引入自定义icon,手动设置zoom

news2024/11/15 15:30:26

要实现这个效果,我们先看一下目前的页面展示:
在这里插入图片描述
左边有一个图例,我们可以方法缩小地图,右边是动态的marker标记,到时候肯定时候是后端将对应的颜色标识、文字展示、坐标点给咱们返回、我们肯定可以拿到一个list,这个时候我们可以循环创建marker节点,然后统一增加到map中。
可以先看这部分代码:


import React, { Component } from 'react';
import AMapLoader from '@amap/amap-jsapi-loader';
// 目前主要设置了地图的宽和高
import '../index.scss'
//为了方便直接使用了已有的base64编码的图片
import {base64PNG,sanjiaoSVG,gray,red,green} from './base64png.js'
//小圆点下方的文字显示 以及样式
const content = `<div style="width:auto;padding:3px;background:gray;color:#000;border:none">EU126,租凭<br/>XX.XX MW</div>`
class  MapComponent extends Component{
    constructor(){
        super();      
        this.map ={};
        this.AMap = null
        this.state={
        // 模拟后端返回的数据
            datalist:[
                {
                    icon:1,
                    position:[121.487899486,31.24916171],
                    title:'aaaaa',
                    zoom:3,
                    content,
                },
                {
                    icon:2,
                    position:[121.287899486,31.34916171],
                    title:'bbb',
                    zoom:3,
                    content,
                },
                {
                    icon:3,
                    position:[121.387899486,31.44916171],
                    title:'ccc',
                    zoom:3,
                    content,
                },
                {
                    icon:3,
                    position:[121.487899486,31.44916171],
                    title:'ddd',
                    zoom:3,
                    content,
                },
                {
                    icon:3,
                    position:[121.487899486,31.54916171],
                    title:'eee',
                    zoom:3,
                    content,
                },
            ]
        }
    }

    // 2.dom渲染成功后进行map对象的创建
    componentDidMount(){
        AMapLoader.reset()  //需要把这个reset一下
        AMapLoader.load({
            key:"79d80321f75bf125cb18953d4c4b2f3a",   // 申请好的Web端开发者Key,首次调用 load 时必填
            version:"2.0",              // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
            plugins:[''],               // 需要使用的的插件列表,如比例尺'AMap.Scale'等
        }).then((AMap)=>{
            console.log(AMap,'AMap')
            //将map对象保存起来
            this.AMap =AMap
            this.renderMapFun()
        }).catch(e=>{
            console.log(e);
        })
    }
    // 每次切换数据的时候单独调用即可
    renderMapFun(){
        this.map = new this.AMap.Map("container111",{ //设置地图容器id
            // viewMode:"3D",         //是否为3D地图模式
            // zoom:5,                //初始化地图级别
            // center:[105.602725,37.076636], //初始化地图中心点位置
            zoom: 10, //初始化地图级别
            center: [121.487899486,31.24916171 ] //初始化地图中心点位置-上海
        });
        const obj = {
            1:green,
            2:red,
            3:gray
        }
        let arr = []
        //循环创建marker对象
        this.state.datalist.map(i=>{
            var marker1 = new AMap.Marker({
                icon: obj[i.icon],
                position: i.position,
                title:i.title,
                zoom:i.zoom,
            });
            marker1.setLabel({
                content:i.content,
                offset:new AMap.Pixel(-20,28)
            })
            arr = [...arr,marker1]
        })
        // 统计加入到map对象中绘制
        this.map.add(arr);
    }
    render(){
        // 1.初始化创建地图容器,div标签作为地图容器,同时为该div指定id属性;
        return (
              <div id="container111" className="map"  > 
              </div>
          );
    }
}
//导出地图组建类
export default MapComponent;

现在要显示左侧的图例盒子,我们使用绝对定位即可:
当然也是需要一部分的样式的。

#container111{
  padding: 0px;
  margin: 0px;
  width: 100%;
  height: 500px;
  position: relative;
  .leftBox{
    width: 130px;
    // height: 150px;
    position: absolute;
    top: 60px;
    left: 30px;
    z-index: 9999;
    background-color: #fff;
    padding: 10px 0 ;
    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
    .top{
      font-size: 16px;
      display: flex;
      align-items: center;
      height: 24px;
      line-height: 24px;
      border-bottom: 1px solid #aaa;
      justify-content: space-around;
      padding-left: 10px;
      padding-bottom: 8px;
      padding-right: 10px;
    }
    .bottom{
      display: flex;
      flex-direction: column;

      .box{
        width: 100%;
        font-size: 14px;
        height: 40px;
        line-height: 40px;
        display: flex;
        align-items: center;
        padding-left: 20px;
        // justify-content: center;
        img{
          width: 16px;
          height: 16px;
          margin-right: 8px;
        }
      }
    }
  }
}

主要就是实现 父绝子相 定位 实现了效果;
页面代码:

import React, { Component } from 'react';
import { Icon } from '@alife/aisc';
import AMapLoader from '@amap/amap-jsapi-loader';
import '../index.scss';
import { base64PNG, sanjiaoSVG, gray, red, green } from './base64png.js';
const content = `<div style="width:auto;padding:3px;background:gray;color:#000;border:none">EU126,租凭<br/>XX.XX MW</div>`;
class MapComponent extends Component {
  constructor() {
    super();
    this.map = {};
    this.AMap = null;
    this.state = {
      zoom: 10,
      datalist: [
        {
          icon: 1,
          position: [121.487899486, 31.24916171],
          title: 'aaaaa',
          zoom: 3,
          content,
        },
        {
          icon: 2,
          position: [121.287899486, 31.34916171],
          title: 'bbb',
          zoom: 3,
          content,
        },
        {
          icon: 3,
          position: [121.387899486, 31.44916171],
          title: 'ccc',
          zoom: 3,
          content,
        },
        {
          icon: 3,
          position: [121.487899486, 31.44916171],
          title: 'ddd',
          zoom: 3,
          content,
        },
        {
          icon: 3,
          position: [121.487899486, 31.54916171],
          title: 'eee',
          zoom: 3,
          content,
        },
      ],
    };
  }

  // 2.dom渲染成功后进行map对象的创建
  componentDidMount() {
    AMapLoader.reset(); //需要把这个reset一下
    AMapLoader.load({
      key: '', // 申请好的Web端开发者Key,首次调用 load 时必填
      version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
      plugins: [''], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
    })
      .then((AMap) => {
        console.log(AMap, 'AMap');
        this.AMap = AMap;
        this.renderMapFun();
        // var circle = new AMap.Circle({
        //     center: new AMap.LngLat("121.487899486", "31.24916171"), // 圆心位置
        //     radius: 10000,  //半径
        //     strokeColor: "#F33",  //线颜色
        //     strokeOpacity: 1,  //线透明度
        //     strokeWeight: 3,  //线粗细度
        //     fillColor: "#ee2200",  //填充颜色
        //     fillOpacity: 0.35 //填充透明度
        // });
        // this.map.add([marker1,marker2,marker3]);
        // this.map.add([marker1,marker2,marker3,circle]);
        // this.map.add(marker);
      })
      .catch((e) => {
        console.log(e);
      });
  }
  renderMapFun() {
    this.map = new this.AMap.Map('container111', {
      //设置地图容器id
      // viewMode:"3D",         //是否为3D地图模式
      // zoom:5,                //初始化地图级别
      // center:[105.602725,37.076636], //初始化地图中心点位置
      zoom: this.state.zoom, //初始化地图级别
      center: [121.487899486, 31.24916171], //初始化地图中心点位置-上海
    });
    const obj = {
      1: green,
      2: red,
      3: gray,
    };
    let arr = [];
    this.state.datalist.map((i) => {
      var marker1 = new AMap.Marker({
        icon: obj[i.icon],
        position: i.position,
        title: i.title,
        zoom: i.zoom,
      });
      marker1.setLabel({
        content: i.content,
        offset: new AMap.Pixel(-20, 28),
      });
      arr = [...arr, marker1];
    });
    this.map.add(arr);
  }
  addFun=()=>{
    // console.log(this.map,'this.map')
    const {zoom} = this.state
    if(zoom!==18){
        this.setState({
            zoom:zoom+1
        },()=>{
            // 设置地图显示的缩放级别,在PC上,参数zoom可设范围:[3,18];
            // 在移动端:参数zoom可设范围:[3,19]。3D地图下,可将zoom设置为浮点数。/
            this.map.setZoom(this.state.zoom)
            // this.renderMapFun()
        })
    }
  }
  downFun=()=>{
    const {zoom} = this.state
    if(zoom!==3){
        this.setState({
            zoom:zoom-1
        },()=>{
            this.map.setZoom(this.state.zoom)
            // this.renderMapFun()
        })
    }
  }
  render() {
    // 1.初始化创建地图容器,div标签作为地图容器,同时为该div指定id属性;
    return (
      <div style={{ width: '100%', height: '100%' }}>
        <div id="container111" className="map">
          <div className="leftBox">
            <div className="top">
              <Icon type="add" onClick={this.addFun}/>
              {this.state.zoom} <Icon type="minus" onClick={this.downFun}/>
            </div>
            <div className="bottom">
              <div className="box">
                <img src={gray} alt="" />
                预计裁撤
              </div>
              <div className="box">
                <img src={red} alt="" />
                建设中
              </div>
              <div className="box">
                <img src={green} alt="" />
                预计保留
              </div>
            </div>
          </div>
        </div>
      </div>
    );
  }
}
//导出地图组建类
export default MapComponent;

我们想实现点击左侧的 + 来实现放大; - 实现 缩小;
在这里插入图片描述
后来查询相关文档,官方文档上解释:
在这里插入图片描述

setZoom:设置地图显示的缩放级别,在PC上,参数zoom可设范围:[3,18];在移动端:参数zoom可设范围:[3,19]。3D地图下,可将zoom设置为浮点数。

意思是说我们在PC中使用只能使用的放大缩小范围为 3 - 18
所以我们在点击按钮的时候放大缩小就需要控制最大值:

  addFun=()=>{
    // console.log(this.map,'this.map')
    const {zoom} = this.state
    if(zoom!==18){
        this.setState({
            zoom:zoom+1
        },()=>{
            // 设置地图显示的缩放级别,在PC上,参数zoom可设范围:[3,18];
            // 在移动端:参数zoom可设范围:[3,19]。3D地图下,可将zoom设置为浮点数。/
            this.map.setZoom(this.state.zoom)
            // this.renderMapFun()
        })
    }
  }
  downFun=()=>{
    const {zoom} = this.state
    if(zoom!==3){
        this.setState({
            zoom:zoom-1
        },()=>{
            this.map.setZoom(this.state.zoom)
            // this.renderMapFun()
        })
    }
  }

另外献上官方连接:
https://lbs.amap.com/api/javascript-api/guide/map/state
https://lbs.amap.com/demo/javascript-api/example/map/click-to-get-lnglat
https://lbs.amap.com/demo/javascript-api/example/map/get-mapzoom

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

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

相关文章

怎么清空电脑回收站?教您这三招(附上清空的回收站数据怎么恢复教程)

电脑回收站是一个临时存放被删除文件的地方&#xff0c;如果不清空回收站&#xff0c;这些文件仍然占用磁盘空间。清空回收站可以释放这些空间&#xff0c;提高磁盘的可用空间。那么&#xff0c;怎么清空电脑回收站的东西呢&#xff1f;清空的回收站数据怎么恢复呢&#xff1f;…

ICMP隐蔽隧道攻击分析与检测

• ICMP隧道攻击工具特征分析 一、原理 由于ICMP报文自身可以携带数据&#xff0c;而且ICMP报文是由系统内核处理的&#xff0c;不占用任何端口&#xff0c;因此具有很高的隐蔽性。 通过改变操作系统默认填充的Data&#xff0c;替换成自己构造的数据&#xff0c;这就是ICMP隐…

测试开发第一章、软件测试介绍

一、什么是软件测试 最常见的理解是:软件测试就是找BUG,发现缺陷。 软件测试就是验证软件产品特性是否满足用户的需求。 从这话我们可以看出以下两点: 测试试图验证软件是“工作的”,也就是验证软件功能执行的正确性测试的活动是以测试人员“预期的结果”为依据,这里的…

centos7 部署 k8s 1m2n

1 系统环境准备 1.1 安装所需工具 yum -y install vim yum -y install wget# 设置yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo1.2 修改…

【性能优化篇】.ttf字体包过大引起的网页加载过慢 font-spider 压缩字体包 适用于任何前端项目

背景 项目使用的是阿里巴巴普惠2.0字体&#xff0c;型号分别是 35-thin 和 45-light 这两个字体包 都是 8mb 左右 本地加载的时候可能速度不会收影响&#xff0c;发到生产和测试环境下&#xff0c;速度会很慢&#xff0c;尤其是测试环境&#xff0c;字体包加载了一分钟&#…

详细分析Python中运算符“==“和“is“的区别

目录 Python中运算符"" Python中运算符"is" ""和"is"的区别 总结 Python中运算符"" 在Python中&#xff0c;双等号运算符"" 用于比较两个值是否相等。它返回一个布尔值&#xff0c;即True或False&#xff0c;…

自动完成网页局部区域截图的方法

一般网页包含标题、导航、正文、图片、广告、外链等内容&#xff0c;但只有正文内容对我们才有价值&#xff0c;或者我们只关心其中的数据分析图表。希望把网页有价值的区域截图下来&#xff0c;在手工截图时&#xff0c;可以利用截图工具选择截图区域&#xff0c;那么能自动截…

如何评估自动化测试脚本的编写时间和维护工作量?

一、如何评估自动化测试脚本的编写时间和维护工作量&#xff1f; 评估自动化测试脚本的编写时间和维护工作量是一个复杂的过程&#xff0c;需要综合考虑以下因素&#xff1a; 脚本复杂性&#xff1a;评估脚本的复杂性&#xff0c;包括测试需求的复杂程度、涉及的功能和模块的复…

简单认识Redis 数据库的高可用

文章目录 一、Redis 高可用&#xff1a;1.简介&#xff1a;2、在Redis中实现高可用的技术 二、Redis持久化&#xff1a;1.持久化的功能&#xff1a;2.Redis 提供两种方式进行持久化&#xff1a; 三、RDB 持久化&#xff1a;1.简介&#xff1a;2.触发条件&#xff1a;4.启动时加…

LeetCode 2050. 并行课程 III:DFS

【LetMeFly】2050.并行课程 III&#xff1a;DFS 力扣题目链接&#xff1a;https://leetcode.cn/problems/parallel-courses-iii/ 给你一个整数 n &#xff0c;表示有 n 节课&#xff0c;课程编号从 1 到 n 。同时给你一个二维整数数组 relations &#xff0c;其中 relations[…

jpa生成实体类,jpa根据数据库表生成实体类

jpa生成实体类&#xff0c;jpa根据数据库表生成实体类jpa根据数据库表结构生成实体idea下SpringbootJPA从数据库自动生成实体类JPA用数据库表直接生成实体类Spring boot整合jpa(一),根据表生成实体IDEA下SpringData-JPA根据数据库表生成实体类idea怎么根据数据库表自动生成JPA实…

为什么你在用 ChatGPT 的提示词 Prompt 似乎效果不如人意?

“ 在使用ChatGPT的神奇提示词Prompt时&#xff0c;或许你会发现它的效果并不总是如人所愿。让我们看看其中的原因&#xff0c;以及如何避免这类问题。” 01 — 最近继续在研究以大模型人工智能LLM为大脑的专属知识库的开发技术。偶然看到这么一个智力游戏题目&#xff0c;让大…

HummerRisk V1.3.0 发布

HummerRisk V1.3.0发布&#xff1a; 大家好&#xff0c;HummerRisk 1.3.0和大家见面了&#xff0c;在这个版本中我们继续在多云接入管理、多云检测方式、云资源态势方面提供新的能力&#xff0c;并增加了新的镜像仓库支持类型&#xff0c;并优化了云的区域选择、优化规则组内容…

如何提高单测覆盖率

相关工具推荐&#xff1a; TestMe:用于快速生成测试类 一、抽象一个公共类&#xff0c;将TestMe的配置内容该类MockTest import lombok.extern.slf4j.Slf4j; import org.junit.Before; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner;impor…

基于SpringBoot+Vue的4S店车辆管理系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

浅浅了解线程池

线程池 1.线程池基本概念(了解)1.1 什么是线程池1.2 为什么使用线程池1.3 线程池的优势 2.创建池的方式3.线程池的工作原理(重点)3.1 线程池的七大参数3.2 线程池的四种拒绝策略AbortPolicyCallerRunsPolicyDiscardPolicyDiscardOldestPolicy 3.3 任务队列 4. 自定义线程池(代码…

提供实习证明和奖学金!面向本科生、研究生的 AI 夏令营!第二期开放报名

无论你是新手还是有AI基础 只要你对AI方向感兴趣&#xff0c;有热情 欢迎你加入Datawhale AI 夏令营 联合科大讯飞、阿里云天池 面向在校本科生、研究生 提供暑期实践学习机会 第二期正式开放报名 线上活动&#xff0c;全程免费 报名时间&#xff1a;2023/7/26 - 2023/8/1 1 关…

​渔网格及多边形网格(蜂窝图)表现空间分布特征

重新排版新发。渔网格及多边形网格(蜂窝图)表现空间分布特征。 练习数据: 爬取的山东省胶东五市文保单位。 先上结果图 1.渔网图表现空间分布特征 整体步骤是先对数据做核密度分析,用渔网工具创建渔网格与点,然后将核密度的值赋至渔网格上,最后进行一系列可视化表达。 …

抖音seo短视频矩阵系统源代码开发技术分享

抖音SEO短视频矩阵系统是一种通过优化技术&#xff0c;提高在抖音平台上视频的排名和曝光率的系统。以下是开发该系统的技术分享&#xff1a; 熟悉抖音平台的算法 抖音平台的算法是通过分析用户的兴趣爱好和行为习惯&#xff0c;对视频进行排序和推荐。因此&#xff0c;开发人员…

HTML+CSS+JavaScript:实现京东秒杀倒计时效果

一、产品需求 下图是京东首页的京东秒杀倒计时 我们将模仿京东倒计时做一个下班倒计时效果&#xff08;如下图&#xff09; 二、代码素材 我先把缺失JS部分的代码放在这里&#xff0c;感兴趣的小伙伴可以先自己试试 <!DOCTYPE html> <html lang"en">&…