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

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

}

相关文章
|
机器学习/深度学习 Web App开发 算法
ML之RF:随机森林RF算法简介、应用、经典案例之详细攻略
随机森林指的是利用多棵决策树对样本进行训练并预测的一种分类器。它包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。随机森林是一种灵活且易于使用的机器学习算法,即便没有超参数调优,也可以在大多数情况下得到很好的结果。随机森林也是最常用的算法之一,因为它很简易,既可用于分类也能用于回归。
ML之RF:随机森林RF算法简介、应用、经典案例之详细攻略
Altium Designer如何设定/修改PCB板边框外形
Altium Designer如何设定/修改PCB板边框外形
2597 0
|
4月前
|
搜索推荐 数据安全/隐私保护 UED
装机必备:Everything 绿色免安装版,快速定位文件极速文件搜索,快速定位文件,文件管理搜索
Everything是一款高效实用的文件搜索工具,以其快速、精准的搜索能力著称。它支持实时搜索本地和远程文件,提供多种过滤器与排序功能,界面简洁友好,资源占用低。最新版本新增拼音搜索、全文检索、智能推荐等功能,同时优化了多语言支持、安全性和隐私保护,极大提升了用户体验,是管理海量文件的绝佳选择。
447 5
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
《攻克语言密码:教AI理解隐喻与象征》
在自然语言处理(NLP)领域,理解隐喻和象征是提升语言理解能力的关键。这些非字面表达承载丰富情感与文化内涵,如“时间就是金钱”或“寒梅”象征坚韧。然而,基于规则和数据驱动的NLP模型在处理这类表达时面临巨大挑战,因为它们依赖语境、文化和人类经验。未来,通过引入知识图谱、深度学习、多模态信息及上下文分析等方法,有望改善NLP对隐喻和象征的理解,推动人机交互更加自然深入。
355 15
|
9月前
|
人工智能 供应链 数据可视化
跨境电商供应链优化趋势:从智能库存到绿色物流
高效供应链管理是行业发展的关键,涉及原材料采购、生产制造、库存管理、跨境物流和终端交付等环节。通过数据驱动决策、多供应商合作、灵活物流策略、清关合规和技术赋能,可以优化供应链,提升运营效率。
883 7
跨境电商供应链优化趋势:从智能库存到绿色物流
|
11月前
|
机器学习/深度学习 人工智能 算法
视频生成模型变身智能体:斯坦福Percy Liang等提出VideoAgent,竟能自我优化
斯坦福大学Percy Liang团队推出VideoAgent,一种能生成高质量视频并自我优化的模型。它结合强化学习和监督学习,根据用户反馈和环境变化自动调整,提升视频生成质量和用户体验,但同时也面临模型不稳定性和高资源需求等挑战。
241 6
|
存储 算法 Android开发
AVB校验微观版本:android avb(Android Verified Boot)验证
AVB校验微观版本:android avb(Android Verified Boot)验证
1677 0
|
XML 传感器 移动开发
实现一个360全景的N种方案
手把手教你实现360全景浏览效果。
实现一个360全景的N种方案