好客租房172-地图找房createOverlays

简介: 好客租房172-地图找房createOverlays

//处理createOverlays 通过参数来决定调用什么方法

import React from 'react'
// 导入axios
import axios from 'axios'
// 导入封装好的 NavHeader 组件
import NavHeader from '../../components/NavHeader'
// 导入样式
// import './index.scss'
import styles from './index.module.css'
// 解决脚手架中全局变量访问的问题
const BMapGL = window.BMapGL
// 覆盖物样式
const labelStyle = {
  cursor: 'pointer',
  border: '0px solid rgb(255, 0, 0)',
  padding: '0px',
  whiteSpace: 'nowrap',
  fontSize: '12px',
  color: 'rgb(255, 255, 255)',
  textAlign: 'center'
}
export default class Map extends React.Component {
  componentDidMount() {
    this.initMap()
  }
  // 初始化地图
  initMap() {
    // 获取当前定位城市
    const { label, value } = JSON.parse(localStorage.getItem('hkzf_city'))
    // console.log(label, value)
    // 初始化地图实例
    const map = new BMapGL.Map('container')
    //能够在其他方法中获取到地图对象
    this.map=map
    // 创建地址解析器实例
    const myGeo = new BMapGL.Geocoder()
    // 将地址解析结果显示在地图上,并调整地图视野
    myGeo.getPoint(
      label,
      async point => {
        if (point) {
          //  初始化地图
          map.centerAndZoom(point, 11)
          // 添加常用控件
          map.addControl(new BMapGL.NavigationControl())
          map.addControl(new BMapGL.ScaleControl())
          /* 
            1 获取房源数据。
            2 遍历数据,创建覆盖物,给每个覆盖物添加唯一标识(后面要用)。
            3 给覆盖物添加单击事件。
            4 在单击事件中,获取到当前单击项的唯一标识。
            5 放大地图(级别为13),调用 clearOverlays() 方法清除当前覆盖物。
          */
          const res = await axios.get(
            `http://localhost:8080/area/map?id=${value}`
          )
          console.log('房源数据:', res)
          res.data.body.forEach(item => {
            // 为每一条数据创建覆盖物
            const {
              coord: { longitude, latitude },
              label: areaName,
              count,
              value
            } = item
            // 创建覆盖物
            const areaPoint = new BMapGL.Point(longitude, latitude)
            const label = new BMapGL.Label('', {
              position: areaPoint,
              offset: new BMapGL.Size(-35, -35)
            })
            // 给 label 对象添加一个唯一标识
            label.id = value
            // 设置房源覆盖物内容
            label.setContent(`
              <div class="${styles.bubble}">
                <p class="${styles.name}">${areaName}</p>
                <p>${count}套</p>
              </div>
            `)
            // 设置样式
            label.setStyle(labelStyle)
            // 添加单击事件
            label.addEventListener('click', () => {
              console.log('房源覆盖物被点击了', label.id)
              // 放大地图,以当前点击的覆盖物为中心放大地图
              // 第一个参数:坐标对象
              // 第二个参数:放大级别
              map.centerAndZoom(areaPoint, 13)
              // 解决清除覆盖物时,百度地图API的JS文件自身报错的问题
              setTimeout(() => {
                // 清除当前覆盖物信息
                map.clearOverlays()
              }, 0)
            })
            // 添加覆盖物到地图中
            map.addOverlay(label)
          })
        }
      },
      label
    )
  }
  async renderOverlay(id){
    const res = await axios.get(`http://localhost:8080/area/map?id=${id}`)
    // console.log('renderOverlays 获取到的数据:', res)
    const data = res.data.body
     // 调用 getTypeAndZoom 方法获取级别和类型
     const { nextZoom, type } = this.getTypeAndZoom()
     data.forEach(item => {
       // 创建覆盖物
       this.createOverlays(item, nextZoom, type)
     })
  }
  // 创建覆盖物
  createOverlays(data, zoom, type) {
    const {
      coord: { longitude, latitude },
      label: areaName,
      count,
      value
    } = data
    // 创建坐标对象
    const areaPoint = new BMapGL.Point(longitude, latitude)
    if (type === 'circle') {
      // 区或镇
      this.createCircle(areaPoint, areaName, count, value, zoom)
    } else {
      // 小区
      this.createRect(areaPoint, areaName, count, value)
    }
  }
  getTypeAndZoom(){
      //调用地图的getZoom方法 来获取缩放级别
      const zoom=this.map.getZoom()
      console.log(zoom,"获取级别和类型")
      let nextZoom,type
      if(zoom>=10&&zoom<12){
          nextZoom=13
          type='circle'
      }else if(zoom>=12&&zoom<14){
        nextZoom=15
        type='circle'
      }else if(zoom>=14&&zoom<16){
        type='rect'
      }
      return{
          nextZoom,
          type
      }
  }
  render() {
    return (
      <div className={styles.map}>
        {/* 顶部导航栏组件 */}
        <NavHeader>地图找房</NavHeader>
        {/* 地图容器元素 */}
        <div id="container" className={styles.container} />
      </div>
    )
  }
}


相关文章
|
17天前
|
数据安全/隐私保护 SEO
蚂蚁分类信息系统二开仿么么街货源客模板微商货源网源码(带手机版)
网站采用蚂蚁分类信息系统二次开发,模板仿么么街货源客模板,微商货源网定制版。 模板设计风格简洁,分类信息采用列表形式发布,这种设计方式非常符合度娘 SEO 规则。收录效果是杠杠的。 这个网站风格目前是用来做货源推广使用的,但不仅限于货源网站。后台无加密,分类目录随意修改。 无论你是想做地方分类信息,二手市场,或者垂直行业信息分类平台都是不错的选择。
14 2
蚂蚁分类信息系统二开仿么么街货源客模板微商货源网源码(带手机版)
|
定位技术
好客租房171-地图找房renderOverlays
好客租房171-地图找房renderOverlays
117 0
好客租房171-地图找房renderOverlays
|
定位技术
好客租房173-地图找房createCircle方法
好客租房173-地图找房createCircle方法
182 0
好客租房173-地图找房createCircle方法
|
定位技术
好客租房170-地图找房的一个封装流程
好客租房170-地图找房的一个封装流程
56 0
好客租房170-地图找房的一个封装流程
好客租房165-根据定位获取当前城市
好客租房165-根据定位获取当前城市
113 0
好客租房165-根据定位获取当前城市
好客租房166-根据定位获取当前城市
好客租房166-根据定位获取当前城市
86 0
好客租房166-根据定位获取当前城市
好客租房107-两种布局调整
好客租房107-两种布局调整
41 0
好客租房107-两种布局调整
好客租房109-实现TabBer
好客租房109-实现TabBer
92 0
好客租房109-实现TabBer
好客租房123-租房数据渲染
好客租房123-租房数据渲染
117 0
好客租房123-租房数据渲染
好客租房175-获取当前小区被点击房源数据
好客租房175-获取当前小区被点击房源数据
96 0
好客租房175-获取当前小区被点击房源数据