js(react)中使用百度地图

news/2024/5/9 12:57:18/文章来源:https://blog.csdn.net/weixin_46151381/article/details/127306435

0 需求

依次点击区-镇-小区,展示当前位置的数据列表 ;移动地图(movestart事件),隐藏详情。

1 准备工作 

1.1 引入百度地图并配置ak

jspopularGL | 百度地图API SDK

1.2  根据IP定位获取当前定位

import axios from 'axios';export const getCurrentCity = () => {const localCity=JSON.parse(localStorage.getItem('hkzf_city'))if (!localCity) {//localStorage 中是否有定位城市,没有,保存并返回return new Promise((resolve, reject) => {const curCity = new window.BMapGL.LocalCity();curCity.get(async res => {try {//成功const result = await axios.get(`http://localhost:8080/area/info?name=${res.name}`)localStorage.setItem('hkzf_city', JSON.stringify(result.body))resolve(res.body)//返回结果为promise:如果直接return,外层函数无法接收到} catch(e) {//失败reject(e)}})})}return Promise.resolve(localCity)//有,直接返回:此处的 Promise 不会失败
}

2 代码实现

import React from 'react'
import styles from './index.module.scss'
import NavHeader from '../../components/NavHeader'
import axios from 'axios'
import { Link } from 'react-router-dom'
import { Toast } from 'antd-mobile'export default class Map extends React.Component {// 覆盖物样式labelStyle = {cursor: 'pointer',border: '0px solid rgb(255, 0, 0)',padding: '0px',whiteSpace: 'nowrap',fontSize: '12px',color: 'rgb(255, 255, 255)',textAlign: 'center'}state = {housesList: [],isShowList: false}componentDidMount () {this.initMap();}initMap () {// 1初始化地图实例const { label, value } = JSON.parse(localStorage.getItem('hkzf_city'));//当前城市name,idvar map = new window.BMapGL.Map("container");//在 react 脚手架中全局对象需要使用 window 来访问,否则,会造成 ESLint 校验错误this.map = map;// 2将地址转换为坐标var myGeo = new window.BMapGL.Geocoder(); //创建地址解析器实例myGeo.getPoint(label, (point) => {// 将地址解析结果显示在地图上,并调整地图视野if (point) {// 2.1设置中心点map.centerAndZoom(point, 11);// 2.2添加地图控件map.enableScrollWheelZoom(true); // 开启鼠标滚轮缩放var scaleCtrl = new window.BMapGL.ScaleControl();// 添加比例尺控件map.addControl(scaleCtrl);var zoomCtrl = new window.BMapGL.ZoomControl();// 添加缩放控件map.addControl(zoomCtrl);// 2.3渲染覆盖物this.renderOverlays(value)} else {alert('您选择的地址没有解析到结果!');}}, label)// 给地图绑定移动事件map.addEventListener('movestart', () => {console.log('movestart')if (this.state.isShowList) {this.setState({isShowList: false})}})}// 渲染覆盖物async renderOverlays (id) {try {Toast.show({icon: 'loading',content: '加载中…',duration: 0,})// 获取数据const res = await axios.get(`http://localhost:8080/area/map?id=${id}`)Toast.clear()const data = res.data.body// 获取类型及缩放级别const { nextZoom, type } = this.getTypeAndZoom()// 渲染数据this.map.clearOverlays();data.forEach(item => {this.createOverlays(item, nextZoom, type)})} catch (e) {Toast.clear()}}// 计算要绘制的覆盖物类型和下一个缩放级别getTypeAndZoom () {const zoom = this.map.getZoom();let nextZoom, typeif (zoom >= 10 && zoom < 12) {// 区nextZoom = 13type = 'circle'} else if (zoom >= 12 && zoom < 14) {// 镇nextZoom = 15type = 'circle'} else if (zoom >= 14 && zoom < 16) {// 小区type = 'rect'}return { nextZoom, type }}// 创建覆盖物createOverlays (item, nextZoom, type) {const {coord: { longitude, latitude },label: areaName,count, value} = item;// 将经纬度转化为坐标var pointArea = new window.BMapGL.Point(longitude, latitude);if (type === 'circle') {this.createCircle(pointArea, areaName, count, value, nextZoom)} else {this.createRect(pointArea, areaName, count, value)}}// 创建区、镇覆盖物createCircle (pointArea, areaName, count, value, nextZoom) {// 1创建文本标注覆盖物实例var content = "文本覆盖物";var labelTXT = new window.BMapGL.Label(content, {position: pointArea,// 设置标注的地理位置offset: new window.BMapGL.Size(-35, -35)// 设置标注的偏移量})// 2设置结构labelTXT.setContent(`<div class="${styles.bubble}"><p class="${styles.name}">${areaName}</p><p>${count}</p></div>`)// 3设置样式labelTXT.setStyle(this.labelStyle)this.map.addOverlay(labelTXT);// 将标注添加到地图中// 4监听标注事件labelTXT.addEventListener('click', (e) => {this.renderOverlays(value)this.map.centerAndZoom(pointArea, nextZoom);});}// 创建小区覆盖物createRect (pointArea, areaName, count, value) {var content = "";var labelTXT = new window.BMapGL.Label(content, {position: pointArea,offset: new window.BMapGL.Size(-50, -28)})labelTXT.setContent(`<div class="${styles.rect}"><span class="${styles.housename}">${areaName}</span><span class="${styles.housenum}">${count}套</span><i class="${styles.arrow}"></i></div>`)labelTXT.setStyle(this.labelStyle)this.map.addOverlay(labelTXT);labelTXT.addEventListener('click', (e) => {// 获取小区房源数据this.getHouseList(value);const { x, y, width, height } = e.target.domElement.getBoundingClientRect()console.log(x, y, width, height)// 将被点击的房源移动到中心位置this.map.panBy(window.innerWidth / 2 - x,(window.innerHeight - 330) / 2 - y)});}// 获取小区房源数据async getHouseList (id) {try {Toast.show({icon: 'loading',content: '加载中…',duration: 0,})const res = await axios.get(`http://localhost:8080/houses?cityId=${id}`)Toast.clear()this.setState({housesList: res.data.body.list,isShowList: true})} catch (e) {Toast.clear()}}// 渲染小区房源数据renderHousesList () {return this.state.housesList.map(item => (<div className={styles.house} key={item.houseCode}><div className={styles.imgWrap}><imgclassName={styles.img}src={`http://localhost:8080${item.houseImg}`}alt=""/></div><div className={styles.content}><h3 className={styles.title}>{item.title}</h3><div className={styles.desc}>{item.desc}</div><div>{item.tags.map(tag => (<spanclassName={[styles.tag, styles.tag1].join(' ')}key={tag}>{tag}</span>))}</div><div className={styles.price}><span className={styles.priceNum}>{item.price}</span> 元/月</div></div></div>))}render () {return (<div className={styles.map}><NavHeader>地图找房</NavHeader><div id="container" className={styles.container}></div>{/* 房源列表 */}<divclassName={[styles.houseList,this.state.isShowList ? styles.show : ''].join(' ')}><div className={styles.titleWrap}><h1 className={styles.listTitle}>房屋列表</h1><Link className={styles.titleMore} to="/home/list">更多房源</Link></div><div className={styles.houseItems}>{/* 房屋结构 */}{this.renderHousesList()}</div></div></div>)}
}

3 代码分析

3.1 封装流程

3.2 代码逻辑 

初始化渲染:创建map实例,以当前定位为中心点渲染地图(使用IP定位),并添加控件;

渲染覆盖物

        获取数据:接口需返回的数据信息包括:位置id,位置name,当前位置的经纬度;

        渲染数据:创建文本标注实例,设置结构和样式后添加到地图上。

点击覆盖物

        圆形:放大地图;渲染下一级数据。

        矩形:移动地图;渲染列表数据。

        注意:事件对象中e的clientX=undefined,需要借助getBoundingClientRect()将数据移动到中心点位置。

3.3 中心点移动分析

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

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

相关文章

house of cat 学习

目录前言&#xff1a;利用条件例题&#xff1a;2022强网杯House of cat程序分析&#xff1a;攻击思路&#xff1a;利用链:利用步骤&#xff1a;1.泄露libc_base和heap_base2.在堆地址中伪造fake_IO_&#xff0c;第一次largebin attack改stderr为fake_IO3.第二次largebin attack…

9、乐趣国学—践行《弟子规》的“谨”懂得从容之道(上篇)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;乐趣国学的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 ✨当前专栏&#xff1a;国学周更-心性养成之路…

windows本地编译调试hbase-3.0.0-alpha-2-SNAPSHOT源码

windows本地编译调试hbase-3.0.0-alpha-2-SNAPSHOT源码前言代码下载&#xff0c;编译与调试问题解决前言 研究hbase的原因有两方面&#xff1a;一是自己是做大数据相关的开发工作&#xff0c;hbase这一类的存储是绕不过去的&#xff0c;二是因为研究图数据库janusGraph&#x…

容器安全技术容器管理与应用

容器管理与应用 容器技术之所以在微服务、云计算 等领域得到广泛应用&#xff0c;除了其轻量化的技术外&#xff0c;弹性、敏捷的容器管理和 编排系统支持也是重要因素之一。#### 容器管理 集群化、弹性化和敏捷化是容器应用的显著特点&#xff0c;如何有效地对容器集群进行管…

TOREX | 如何延长设备的电池寿命?——充电IC

适用于支持无线电力传输的锂离子电池 XC6810系列是用于锂离子电池的超小型充电IC&#xff0c;适用于小型的可穿戴设备、可听设备和物联网设备。具有充放电控制、无线供电支持等多种功能。 充电电流为1mA~25mA&#xff0c;适用于小型锂离子电池&#xff0c;可提供3.8V~4.4V的大范…

网课查题公众号题库接口系统-在线直接查题功能

网课查题公众号题库接口系统-在线直接查题功能 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#x…

《设计模式》原型模式

《设计模式》原型模式《设计模式》设计模式的基本原则 《设计模式》单例模式 《设计模式》工厂模式 《设计模式》原型模式 定义&#xff1a; 原型模式就是指用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型&#xff0c;创建新的对象。它是一种创建型设计模式&a…

SpringBoot+Vue+ElementUI实现头像上传

SpringBootVueElementUI实现头像上传1.基础知识&#xff08;补充&#xff09;2.后端依赖导入Maven3.后端Controller代码&#xff08;核心&#xff09;4.配置代码&#xff08;核心&#xff09;5.前端代码6.总结1.基础知识&#xff08;补充&#xff09; File协议&#xff1a; FI…

【Transform3D】转换详解(看完就会)

文章内包含个人理解&#xff0c;如有错误请指出。 往期文章 【css动画】移动的小车 【CSS3】 float浮动与position定位常见问题&#xff08;个人笔记&#xff09; 如何完成响应式布局&#xff0c;有几种方法&#xff1f;看这个就够了 详解 CSS3中最好用的布局方式——flex…

【python】准点跑路人必备小程序~ 不信你用不到

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 有时候下班~忙着跑路&#xff0c;忘记关电脑&#xff0c;逮到了会被老板扣工资&#xff01;&#xff01;怎么办&#xff1f; python带你制做一个小程序&#xff0c;到点自动关机~ 再也不怕忘关电…

APS计划排产软件在食品饮料行业的应用

近年来&#xff0c;我国饮料行业飞速发展&#xff0c;已经成长为一个庞大、成熟的市场&#xff0c;形成了原料供应—制造—流通完整的产业链条和工业体系。 据报道&#xff0c;2022年上半年&#xff0c;国内饮料行业销量同比下滑6.8%&#xff0c;销售额同比下滑5.5%。消费行业整…

CUDA程序调试的一些经验

目录 1. 存储分配检查 2. 变量名检查 3. 核函数输出检查 4. 核函数局部存储空间回收 最近在做一个点云配准的项目&#xff0c;重新把之前就开始玩的CUDA重新拾起来。本来想着稍微改改代码就能够愉快的跑起来&#xff0c;结果改Bug改的我相当上头。结合我之前的帖子和我最近的一…

使用油猴下载文库

简介 工作中经常需要下载资料&#xff0c;大多数情况下&#xff0c;我们搜索到的资料会在某度文库中&#xff0c;激动的准备存在本地方便以后观摩&#xff0c;又因为页面下方的VIP下载&#xff0c;露出尴尬的笑容。这里介绍两种方式&#xff0c;一种省钱省事&#xff0c;一种免…

matlab之Signal Labeled APP

APP工作流程 &#xff08;1&#xff09;导入数据进信号标注器 &#xff08;2&#xff09;创建或导入信号标注定义 &#xff08;3&#xff09;交互式或自动标记信号 &#xff08;4&#xff09;自定义标注视图 &#xff08;5&#xff09;仪表板 &#xff08;6&#xff09;导出标记…

“箭”指智能家居,卫浴龙头企业箭牌家居即将登陆A股

智哪儿获悉&#xff0c;2022年10月13日&#xff0c;国内卫浴龙头企业箭牌家居集团股份有限公司&#xff08;以下简称箭牌家居&#xff0c;001322.SZ&#xff09;刊登首次公开发行股份发行公告&#xff0c;计划近期在深市主板上市。据披露&#xff0c;箭牌家居本次共计发行新股9…

【Google三驾马车系列】GFS原理总结

这里写自定义目录标题GFS基本框架容错机制Master 的容错机制 &#xff1a;操作日志 Checkpoint ShadowMasterChunkServer的容错机制&#xff1a;复制多个副本 checksum一致性问题元数据的一致性Chunk的强一致性其它重要的技术点总结如何避免单一master的性能瓶颈垃圾延迟删除…

Keithley吉时利2182A/Keysight是德34420A纳伏表测量软件-纳伏表软件

1、软件概述 纳伏表程控软件用于需要更高精度的电压测量和温度测量的应用&#xff0c;操作简便、绘制测量波形图直观。 2、软件功能 ◆纳伏表程控软件可以满足GPIB、RS-232两种连接方式。 ◆纳伏表程控软件可以满足CH1、CH2两通道选择。 ◆纳伏表程控软件可以满足多量程及分辨率…

(附源码)计算机毕业设计ssm河南美丽乡村旅游信息网

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

支付模块-微信支付

目录 接口实现 第一步&#xff1a;当点击立即购买生成订单 第二步&#xff1a;根据订单id查询订单信息 第三步&#xff1a;生成微信支付的二维码 第四步&#xff1a;查询订单支付状态 前端实现 ​编辑 1.点击支付 2.订单详情页 接口实现 像这种微服务B2C模式的&#…

【牛客刷题】每日一练——最小K个数

✨hello&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f345;&#x1f345;系列专栏:【牛客刷题】 ✈️✈️本篇内容: 最小K个数&#xff01; ⛵⛵作者简介&#xff1a;一名双非本科大三在读的科班Java编程小白&#xff0c;道阻且长&#xff0c;你我同…