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

要实现这个效果,我们先看一下目前的页面展示:
在这里插入图片描述
左边有一个图例,我们可以方法缩小地图,右边是动态的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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MTK联发科安卓核心板MT8385(Genio 500)规格参数资料_性能介绍

简介 MT8385安卓核心板 是一个高度集成且功能强大的物联网平台&#xff0c;具有以下主要特性&#xff1a; l 四核 Arm Cortex-A73 处理器 l 四核Arm Cortex-A53处理器 l Arm Mali™-G72 MP3 3D 图形加速器 (GPU)&#xff0c;带有 Vulkan 1.0、OpenGL ES 3.2 和 OpenCL™ 2.x …

【如何训练一个中英翻译模型】LSTM机器翻译模型部署(三)

系列文章 【如何训练一个中英翻译模型】LSTM机器翻译seq2seq字符编码&#xff08;一&#xff09; 【如何训练一个中英翻译模型】LSTM机器翻译模型训练与保存&#xff08;二&#xff09; 【如何训练一个中英翻译模型】LSTM机器翻译模型部署&#xff08;三&#xff09; 【如何训…

微信小程序开发,小程序类目符合,线上版本无权限申请wx.getLocation接口

我开发 的小程序类目符合wx.getLocation接口的申请标准 但是却还是显示无权限申请 后来研究好久才发现&#xff0c;小程序需要在发布线上版本时提交用户隐私保护指引 如未设置也可以在 设置-服务内容声明-用户隐私保护指引-声明处理用户信息项并补充填写后提交用户隐私协议审核…

Kotlin知识点

Kotlin 是 Google 推荐的用于创建新 Android 应用的语言。使用 Kotlin&#xff0c;可以花更短的时间编写出更好的 Android 应用。 基础 Kotlin 程序必须具有主函数&#xff0c;这是 Kotlin 编译器在代码中开始编译的特定位置。主函数是程序的入口点&#xff0c;或者说是起点。…

IDEA debug总结

调试一次编程题&#xff0c;发现没有掌握debug技巧&#xff0c;确实费事&#xff0c;做一次总结&#xff0c;方便以后回顾。 Run to Cursor 跳到光标处&#xff0c;适用于快速跳过循环&#xff0c;定位到光标处&#xff0c;而不用到处打断点&#xff0c;使用断点跳转。非常实…

华为OD机试真题 Java 实现【最长公共后缀】【2023 B卷 100分】,等于白送

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明4、再输入5、再输出 七、机考攻略 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff…

算法与数据结构-二分查找

文章目录 什么是二分查找二分查找的时间复杂度二分查找的代码实现简单实现&#xff1a;不重复有序数组查找目标值变体实现&#xff1a;查找第一个值等于给定值的元素变体实现&#xff1a;查找最后一个值等于给定值的元素变体实现&#xff1a;查找最后一个小于给定值的元素变体实…

[CrackMe]damn.exe的逆向及注册机编写

1. 脱壳过程 这个crackme有2个文件 发现加了壳 先来脱壳, 使用ESP守恒, pushad后立马下硬件访问断点 F9直接运行, 立马到popad处 接着走几步就到了OEP 下面使用LordPE来转储映像, 为了防止别人修改PE中的ImageSize, 先尝试修正下ImageSize, 然后dump full即可 接着用x6…

基于一致性引导的元学习bootstraping半监督医学图像分割

文章目录 Consistency-guided Meta-Learning for Bootstrapping Semi-Supervised Medical Image Segmentation摘要本文方法实验结果 Consistency-guided Meta-Learning for Bootstrapping Semi-Supervised Medical Image Segmentation 摘要 医学成像取得了显著的进步&#xf…

Visual C++中的虚函数和纯虚函数(以外观设计模式为例)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来说说Visual C中的虚函数和纯虚函数。该系列帖子全部使用我本人自创的对比学习法。也就是当C学不下去的时候&#xff0c;就用JAVA实现同样的代码&#xff0c;然后再用对比的方法把C学会。 直接说虚函数…

618,你会入手哪些书?【文末送书】

好书分享 前沿技术人工智能半导体新一代通信与信息技术网络空间安全参与规则 一年一度的618又到啦&#xff01;今年的618就不要乱买啦&#xff0c;衣服买多了会被淘汰&#xff0c;电子产品买多了会过时&#xff0c;零食买多了会增肥&#xff0c;最后怎么看都不划算。可是如果你…

Visual Studio 2022 程序员必须知道高效调试手段与技巧(下)终章

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; 一些调试的实例&#x1f4ad; 实例一&#x1f4fa; 调试演示 &#x1f4ad; 实…

使用Jetpack Compose和Motion Layout创建交互式UI

使用Jetpack Compose和Motion Layout创建交互式UI 通过阅读本博客&#xff0c;您将学会使用Motion Layout实现这种精致的动画效果&#xff1a; 让我们从简单的介绍开始。 介绍 作为Android开发者&#xff0c;您可能会遇到需要布局动画的情况&#xff0c;有时甚至需要变形样…

JDK17 中的新特性初步了解

1. Switch 语句的增强 jdk12 &#xff0c;switch语句不用写break了&#xff0c;直接写箭头和对应的值。 jdk 17中&#xff0c; 加了一个逗号&#xff0c;用于匹配多对一。 如果要在每个case里写逻辑&#xff0c;可以写在花括号里。 在返回值的前面加上yield的关键字。 也可以对…

【雕爷学编程】MicroPython动手做(11)——搭建掌控板IDE开发环境四种

为了能够打好基础&#xff0c;系统学习MicroPython&#xff0c;特地入手了二块掌控板 知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通…

技术复盘(5)--git

技术复盘--git 资料地址原理图安装配置基本命令分支命令对接gitee练习:远程仓库操作 资料地址 学习地址-B站黑马&#xff1a;https://www.bilibili.com/video/BV1MU4y1Y7h5 git官方&#xff1a;https://git-scm.com/ gitee官网&#xff1a;https://gitee.com/ 原理图 说明&am…

文件系统总结

《本文件系统默认linux文件系统》 一、文件系统基本概念 文件系统是操作系统中负责存取和管理信息的模块&#xff0c;它用统一的方式管理用户和系统信息的存储、检索、更新、共享和保护&#xff0c;并为用户提供一整套方便有效的文件使用和操作方法文件系统是操作系统中管理文…

C++笔记之vector的reserve()和capacity()用法

C笔记之vector的reserve()和capacity()用法 code review! 代码 #include <vector> #include <iostream>int main() {std::vector<int> myVector;std::cout << "Current size: " << myVector.size() << std::endl;std::cout …

SpringBoot使用jetty和tomcat还有undertow以及ssl配置支持https请求

一般使用SpringBoot开发应用程序都是使用的tomcat 稍微注意点性能就使用undertow&#xff0c;配置支持https请求常用nginx来做代理&#xff0c;直接用SpringBoot配置还是很少的&#xff0c;八成用不到&#xff0c;就怕需要用到的时候又不能及时弄出来&#xff0c;于是记录一下。…

Service Mesh之Istio部署bookinfo

给istio部署插件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 rootk8s-master01:/usr/local# cd istio rootk8s-master01:/usr/local/istio# ls samples/addons/ extras grafana.yaml jaeger.yaml kiali.yaml prometheus.yaml RE…