文字展示、坐标点给咱们返回

简介: 该React组件实现了基于高德地图API的地图功能,通过循环遍历后台数据动态创建并添加带有标签的标记(markers)至地图上。左侧的图例盒子采用绝对定位实现,包含缩放按钮与图例说明。点击+/-按钮可分别实现地图的放大与缩小,同时限制了地图的最大最小缩放级别为18和3。

左边有一个图例,我们可以方法缩小地图,右边是动态的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%' }}>





{
this.state.zoom}




xxxx



xxxx



xxxx





);
}
}
//导出地图组建类
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设置为浮点数。/

//代码效果参考:https://www.uagu.cn/sitemap/post.xml
//代码效果参考:https://www.szworkshop.com.cn/sitemap/post.xml
//代码效果参考:http://www.603393.com/sitemap/post.xml
//代码效果参考:https://www.weibow.com/sitemap/post.xml
//代码效果参考:https://www.xx-ph.com/sitemap/post.xml
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()
    })
}

}

相关文章
|
11月前
|
SQL Java 数据库连接
MyBatis-Plus 超详细教程:从入门到实战,一站式掌握
MyBatis-Plus 是 MyBatis 的增强工具,简化单表 CRUD 操作,无需编写 XML,支持条件构造器、分页插件、逻辑删除、枚举与 JSON 处理,提升开发效率,兼顾灵活性与便捷性,助力从入门到实战一站式掌握。
MyBatis-Plus 超详细教程:从入门到实战,一站式掌握
|
机器学习/深度学习 计算机视觉 网络架构
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
1297 63
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
|
传感器 人工智能 安全
法思诺创新洞察:TRIZ方法如何助力企业卡脖子实现关键技术自主可控?实战案例解析!
法思诺创新学院运用TRIZ系统化创新方法,助力企业破解“卡脖子”技术难题,如高精度传感器温漂与工业泵振动等,实现关键技术自主可控,提升产品竞争力与市场突破能力。
611 0
|
人工智能 运维 监控
HarmonyOS NEXT~鸿蒙系统运维:全面解析与最佳实践
本书《HarmonyOS NEXT~鸿蒙系统运维:全面解析与最佳实践》深入探讨了鸿蒙系统的运维管理。从架构特点到实际操作,涵盖分布式能力、性能优化、安全维护及故障排查。内容包括设备管理、系统监控、安全管理等核心任务,提供常见问题解决方案与工具推荐。面对未来超级终端和AI赋能的挑战,运维人员需不断学习,以充分发挥鸿蒙的分布式优势,为用户带来流畅体验。
1083 8
|
并行计算 异构计算
建立Hugging Face模型调用环境
本文介绍了如何在环境中导入transformers库,并从Hugging Face网站下载模型。如果使用镜像网站,需获取access token。部分模型需申请仓库权限,建议使用国外信息填写。有GPU的用户需先配置CUDA和pytorch-gpu。
|
存储 人工智能 缓存
OSS与NAS混合云存储架构:非结构化数据统一管理实战
AI训练集管理面临数据规模爆炸与访问模式多样的挑战。传统单一存储方案存在成本高、访问慢等问题。创新混合架构融合OSS与NAS,实现热冷数据自动分层,降低存储成本62%,提升训练速度3.8倍。通过统一接口、智能调度与自动迁移,兼顾高性能与低成本,助力AI训练高效稳定运行。
知乎自动回答脚本,自动发布专栏自动评论插件,全自动点赞收藏别人问答
这是一款全自动知乎引流工具,通过模拟点击、评论和点赞操作,在知乎平台实现自动营销引流。用户只需设定参数(如评论次数),软件将自动完成搜索相关内容、发表评论等任务
|
监控 测试技术
【问题实战】Jmeter中jtl格式转换图片后如何分开展示各个性能指标?
在使用JMeter进行性能测试时,若希望将不同性能指标(如CPU、DiskIO、Mem)分别显示在不同图片中,需在测试计划中为每个指标添加独立的`jp@gc - PerfMon Metrics Collector`监控器,并设置各自的数据保存路径。通过命令行模式执行压测并使用`JMeterPluginsCMD`工具针对每个生成的`.jtl`文件转换为单独的图片,从而实现分指标展示的效果。这解决了默认情况下所有监控指标显示在同一张图片上的问题。
483 0
【问题实战】Jmeter中jtl格式转换图片后如何分开展示各个性能指标?
|
Python
课时19:Python的基本语法
今天给大家带来分享的是 Python 的基本语法,分为以下六个部分。 1.在 Python 中严格区分大小写 2.Python 中的每一行就是一条语句,每条语句以换行结束 3.Python 中每一行语句不要过长 4.条语句可以分多行编写,语句后边以\结尾 5.Python 是缩进严格的语言,不要随便写缩进 6.在 Python 中使用#来表示注释
566 2
|
SQL 运维 分布式计算
Dataphin离线数据开发规范
目前,用户在Dataphin上进行数据开发时,风格各异,缺乏一致性。为此,我们整理了一份开发规范文档,旨在帮助所有用户实现更高效和一致的开发流程。
946 4

热门文章

最新文章