BMapGL -- 使用Class在 Vue3 ts 中封装创建标记和多边形标签

这篇具有很好参考价值的文章主要介绍了BMapGL -- 使用Class在 Vue3 ts 中封装创建标记和多边形标签。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代码:

useSymbol.ts 文件

import { featureCollection, point, center } from '@turf/turf'

const labSty = {
  color: '#fff',
  backgroundColor: 'rgba(0, 0, 0, 0.5)',
  borderRadius: '10px',
  padding: '0 10px',
  fontSize: '14px',
  lineHeight: '20px',
  border: '0',
  textAlign: 'center',
  whiteSpace: 'normal',
  textOverflow: 'ellipsis',
  transform: 'translateX(-50%)'
}

export interface MarkConfig {
  point: any
  labelStyle?: any
  name?: string
  identifier?: string
  url?: string
  size?: number
  options?: any
}

export interface PolConfig {
  points: [number, number][]
  poyStyle: any
  labelStyle?: any
  name: string
}

export class MarkerLabel {
  private _marker: any
  private _label: any
  private _map: any
  constructor(
    { point, labelStyle = {}, name = '', identifier = '', url = '/resource/img/logo.png', size = 32, options = {} } = {} as MarkConfig
  ) {
    const labelStyles = { ...labSty, ...labelStyle, width: name?.length * 16 + 20 + 'px' }
    this._label = new BMapGL.Label(name, {
      position: point,
      styles: labelStyles
    })
    this._marker = new BMapGL.Marker(point, {
      ...options,
      label: this._label,

      identifier,
      icon: new BMapGL.Icon(url, new BMapGL.Size(size, size), {
        anchor: new BMapGL.Size(size / 2, size)
      })
    })
    this._marker.identifier = identifier
  }

  addTo(map) {
    this._map = map
    this._map.addOverlay(this._marker)
  }
  remove() {
    this._map && this._map.removeOverlay(this._marker)
  }
  addEventListener(event: string, handler: Fn) {
    this._marker.addEventListener(event, handler)
  }
  removeEventListener(event: string, handler: Fn) {
    this._marker.removeEventListener(event, handler)
  }
  get marker() {
    return this._marker
  }
}

// 多边形标签
export class PolygonLabel {
  private _polygon: any
  private _label: any
  private _map: any
  constructor({ points, poyStyle, labelStyle = {}, name } = {} as PolConfig) {
    const _features = <any>[]
    const _points = points.map((item) => {
      _features.push(point([item[0], item[1]]))
      return new BMapGL.Point(item[0], item[1])
    })
    const features = featureCollection(_features)
    const { geometry } = center(features)
    this._label = new BMapGL.Label(name, {
      position: new BMapGL.Point(geometry?.coordinates[0], geometry?.coordinates[1]),
      styles: { ...labSty, ...labelStyle }
    })
    this._polygon = new BMapGL.Polygon(_points, poyStyle)
  }

  addTo(map) {
    this._map = map
    map.addOverlay(this._label)
    map.addOverlay(this._polygon)
  }

  remove() {
    this._map && this._map.removeOverlay(this._label)
    this._map && this._map.removeOverlay(this._polygon)
  }

  addEventListener(event: string, handler: Fn) {
    this._polygon.addEventListener(event, handler)
  }
  removeEventListener(event: string, handler: Fn) {
    this._polygon.removeEventListener(event, handler)
  }
  get polygon() {
    return this._polygon
  }
}

使用

MarkerLabel 使用

import { MarkerLabel } from '@/hooks/map/useSymbol'

// 创建Marker并监听点击事件
// 创建Marker并监听点击事件
function createMarker({ location, url, policeNumber, size, policeName } = {} as any) {
  const map = mapInstance()
  let point = new BMapGL.Point(location?.longitude, location?.latitude)
  let mar = new MarkerLabel({ point, url, size, name: policeName, identifier: 'policeNumber=' + policeNumber })
  markers[policeNumber] = mar.marker
  mar.addTo(map)
  // 创建信息弹窗
  map.setViewport(point)
  mar.marker.addEventListener('click', async () => {
    const res = await getStaff({ policeNumber: policeNumber })
    Object.assign(staffdetails, res)
    visible.value = true
    await nextTick()
    const infoWindow = new BMapGL.InfoWindow(detailsRef.value, opts)
    map.openInfoWindow(infoWindow, point)
  })
}

PolygonLabel使用

import { PolygonLabel, MarkerLabel } from '@/hooks/map/useSymbol'

 let _polygonLabel = new PolygonLabel({
   points: polygonArr,
   poyStyle: {
     polygonId: item.id,
     strokeColor: 'rgba(36,104,242,1)',
     strokeWeight: 2,
     fillColor: item.areaColor || 'rgba(36,104,242,0.70)'
   },
   labelStyle: { backgroundColor: '', width: item.areaName.length * 16 + 10 + 'px' },
   name: item.areaName
 })

_polygonLabel.addTo(map.value)
 _polygonLabel.addEventListener('click', async function (event) {
   resetVisibleDrawing(OverlayTypeEnum.POLYGON)
   const { target, domEvent } = event
   domEvent?.stopPropagation() // 阻止事件冒泡
 })

思路:

这段代码定义了两个类:MarkerLabel 和 PolygonLabel,分别用于创建标记和多边形标签,并将它们添加到地图上。
MarkerLabel 类接收一个 markConfig 对象作为参数,该对象包含创建标记所需的各种配置信息,例如标记的位置、标记的样式、标记的名称、标记的标识符等。该类的主要功能是创建一个标记,并将其添加到地图上。
PolygonLabel 类接收一个 polConfig 对象作为参数,该对象包含创建多边形标签所需的各种配置信息,例如多边形的顶点坐标、多边形的样式、多边形的名称等。该类的主要功能是创建一个多边形标签,并将其添加到地图上。
在 MarkerLabel 类中,它使用了 BMapGL 对象来创建标记和标记标签,其中 BMapGL.Marker 和 BMapGL.Label 分别用于创建标记和标记标签。MarkerLabel 类的 addTo 方法和 remove 方法分别用于将标记添加到地图上和从地图上移除标记。
在 PolygonLabel 类中,它使用了 turf 库来计算多边形的中心点坐标,然后使用 BMapGL.Polygon 和 BMapGL.Label 分别创建多边形和多边形标签。PolygonLabel 类的 addTo 方法和 remove 方法分别用于将多边形和多边形标签添加到地图上和从地图上移除。
这段代码的主要功能是封装了地图 API 的使用,使得在 Vue 3 中创建标记和多边形标签更加方便和简洁。文章来源地址https://www.toymoban.com/news/detail-614855.html

到了这里,关于BMapGL -- 使用Class在 Vue3 ts 中封装创建标记和多边形标签的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用VS Code创建编写uniapp项目(vue3+ts 微信小程序)

    uni-create-view :用于快速创建 uni-app 页面 uni-helper uni-app :代码提示 uniapp 小程序扩展 :鼠标悬停查文档 1.在types属性中添加属性名 @types/wechat-miniprogram 和  @uni-helper/uni-app-types. 2.添加vueCompilerOptions选项 ①在VS Code中找到设置 ②在设置中搜索文件关联 ③添加这两个文件名,值为

    2024年04月27日
    浏览(71)
  • 四、axios在vite+ts使用class类二次封装

    引入需要的文件创建class类 index.ts 配置解决import.meta.env报错问题 status.ts types.ts api接口 创建element-puls.d.ts文件 完成后在script里用的弹框在ts不会报错

    2024年02月09日
    浏览(50)
  • 前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第十一章 基础界面开发 (组件封装和使用)

    Vue 是前端开发中非常常见的一种框架,它的易用性和灵活性使得它成为了很多开发者的首选。而在 Vue2 版本中,组件的开发也变得非常简单,但随着 Vue3 版本的发布,组件开发有了更多的特性和优化,为我们的业务开发带来了更多便利。本文将介绍如何使用 Vue3 开发业务组件

    2024年02月19日
    浏览(89)
  • vue3+ts+vite项目引入echarts,vue3项目echarts组件封装

    技术栈 :Vue3 + Ts + Vite + Echarts 简介 : 图文详解,教你如何在 Vue3 项目中 引入Echarts , 封装Echarts组件 ,并实现常用Echarts图例 1.1 静态效果 1.2 动态效果 2.1 安装 Echarts npm: pnpm: 2.2 main.ts 中引入 2.3 Echarts 组件封装 /src/components/ReEcharts/index.vue 文件中写入如下代码 3.1 柱状图 实现

    2024年02月09日
    浏览(64)
  • 使用模板创建【vite+vue3+ts】项目出现 “找不到模块‘vue‘或其相应的类型声明” 的解决方案

    项目前台需要使用Vue3+Ts来写一个H5应用,然后我用模板创建 创建完后进入 HelloWorld.vue ,两眼一黑 然后在 tsconfig.json 的 \\\"compilerOptions\\\" 中添加 修改 \\\"moduleResolution\\\" 值为 \\\"node\\\"

    2024年02月17日
    浏览(65)
  • Vue3+TS版本Uniapp:封装uni.request请求配置

    作者: 前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 uniapp 的封装逻辑不同于 Vue3 项目中直接使用 axios.create() 方法创建实例(在 create 方法中写入请求的地址、请求头、超时等内容),代码如下: PS:上述代码来自博主在B站的

    2024年04月22日
    浏览(38)
  • vue3+ts+elementui-plus二次封装树形表格

    复制粘贴即可: 一、定义table组件

    2024年02月15日
    浏览(42)
  • vue3+ts+elementui-plus二次封装弹框

    一、弹框组件BaseDialog

    2024年02月15日
    浏览(50)
  • vue3+ts - element-plus封装上传文件图片组件

      近期做到的项目中有涉及到上传图片上传文件的需求,因为是pc管理后台,用到了element-plus框架,所以我也一起使用element-plus中的上传图片上传图片功能,并对它进行封装成一个组件,方便在多个地方使用。 1、上传文件、视频 2、上传图片   在这里上传图片和文件是分

    2024年02月12日
    浏览(54)
  • Vue3+element-ui + TS封装全局分页组件

    本文介绍了如何使用Vue3、element-ui和TypeScript封装一个全局分页组件。 在开始之前,你需要安装以下环境: Vue3 element-ui TypeScript 这个分页组件提供以下功能: 支持自定义每页显示条数 支持自定义跳转到指定页码 支持显示总页数和总条数 支持自定义样式 分页组件结构 分页组

    2024年02月12日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包