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

简介: 该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()
    })
}

}

相关文章
|
6月前
|
人工智能 Linux API
OpenClaw 阿里云秒级部署保姆级教程:从0到1搭建7×24小时AI助手
2026年3月,OpenClaw(原Clawdbot)凭借其轻量化架构、丰富技能生态与大模型适配能力,成为个人与小型团队搭建AI助手的首选方案。阿里云提供专属应用镜像与一键部署能力,可实现“秒级上线”,搭配百炼Coding Plan免费大模型API,无需本地算力即可拥有7×24小时在线的AI智能体。本文提供从服务器选购、端口放行、一键部署、模型配置到本地MacOS/Linux/Windows11联动的全流程保姆级教程,所有命令可直接复制执行,无冗余步骤,零基础也能一次成功。
690 11
|
机器学习/深度学习 计算机视觉 网络架构
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
1243 63
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
|
9月前
|
SQL Java 数据库连接
MyBatis-Plus 超详细教程:从入门到实战,一站式掌握
MyBatis-Plus 是 MyBatis 的增强工具,简化单表 CRUD 操作,无需编写 XML,支持条件构造器、分页插件、逻辑删除、枚举与 JSON 处理,提升开发效率,兼顾灵活性与便捷性,助力从入门到实战一站式掌握。
MyBatis-Plus 超详细教程:从入门到实战,一站式掌握
|
并行计算 异构计算
建立Hugging Face模型调用环境
本文介绍了如何在环境中导入transformers库,并从Hugging Face网站下载模型。如果使用镜像网站,需获取access token。部分模型需申请仓库权限,建议使用国外信息填写。有GPU的用户需先配置CUDA和pytorch-gpu。
|
监控 测试技术
【问题实战】Jmeter中jtl格式转换图片后如何分开展示各个性能指标?
在使用JMeter进行性能测试时,若希望将不同性能指标(如CPU、DiskIO、Mem)分别显示在不同图片中,需在测试计划中为每个指标添加独立的`jp@gc - PerfMon Metrics Collector`监控器,并设置各自的数据保存路径。通过命令行模式执行压测并使用`JMeterPluginsCMD`工具针对每个生成的`.jtl`文件转换为单独的图片,从而实现分指标展示的效果。这解决了默认情况下所有监控指标显示在同一张图片上的问题。
446 0
【问题实战】Jmeter中jtl格式转换图片后如何分开展示各个性能指标?
|
监控 安全 Unix
操作系统的体系结构、内核、虚拟机
操作系统的体系结构、内核、虚拟机
781 2
|
关系型数据库 MySQL Linux
|
算法 数据可视化 Java
Gephi快速入门
Gephi快速入门
3772 0
|
存储 Prometheus 监控
Prometheus 四种指标类型
Prometheus 四种指标类型
1324 0

热门文章

最新文章