第 7 节:多边形点击弹窗 + 清空绘制按钮

第 7 节:多边形点击弹窗 + 清空绘制按钮

功能:

  1. 保留上一节多点绘制多边形
  2. 点击绘制好的多边形区域弹出弹窗,展示多边形顶点信息
  3. 增加【清空绘制】按钮,一键清除所有图形、重置绘制状态
    严格使用天地图 V4 原生 API,规避 V3 废弃接口
复制代码
<template>
  <div class="map-page">
    <h2>第7节:多边形点击弹窗 + 清空绘制按钮</h2>
    <div style="margin-bottom:8px;">
      <span>操作:单击地图添加顶点,双击完成闭合多边形;点击多边形查看信息</span>
      <button style="margin-left:20px;" @click="clearDraw">清空绘制</button>
    </div>
    <div id="map" class="map-container"></div>
  </div>
</template>

<script setup>
import { onMounted, onUnmounted } from 'vue'

const TDT_KEY = '替换成你的tk'
let map = null
let pointList = []
let polyline = null
let polygon = null

function loadTdtScript() {
  return new Promise((resolve, reject) => {
    if (window.T) {
      return resolve(window.T)
    }
    const script = document.createElement('script')
    script.src = `https://api.tianditu.gov.cn/api?v=4.0&tk=${TDT_KEY}`
    script.onload = () => resolve(window.T)
    script.onerror = err => reject(err)
    document.body.appendChild(script)
  })
}

async function initMap() {
  const T = await loadTdtScript()
  const mapDom = document.getElementById('map')
  if (mapDom.children.length > 0) return

  map = new T.Map('map')
  const center = new T.LngLat(116.404, 39.915)
  map.centerAndZoom(center, 10)
  map.enableScrollWheelZoom(true)

  // 缩放控件
  const zoomCtrl = new T.Control.Zoom({
    position: 'topright'
  })
  map.addControl(zoomCtrl)
  // 比例尺控件
  const scaleCtrl = new T.Control.Scale({
    position: 'topleft'
  })
  map.addControl(scaleCtrl)

  // 单击添加顶点
  map.on('click', (e) => {
    if (!e || !e.lnglat) return
    const lnglat = e.lnglat
    pointList.push(lnglat)

    if (polyline) {
      map.removeOverLay(polyline)
    }
    polyline = new T.Polyline(pointList, {
      color: '#ff4444',
      weight: 3
    })
    map.addOverLay(polyline)
  })

  // 双击闭合生成多边形
  map.on('dblclick', () => {
    if (pointList.length < 3) {
      alert('至少3个点才能构成多边形,请继续点击地图添加顶点')
      return
    }
    if (polyline) {
      map.removeOverLay(polyline)
      polyline = null
    }
    polygon = new T.Polygon(pointList, {
      color: '#0066ff',
      weight: 2,
      fillColor: 'rgba(0,102,255,0.3)'
    })
    map.addOverLay(polygon)

    // 多边形点击事件,弹出信息窗
    polygon.on('click', () => {
      // 格式化顶点字符串
      const pointStr = pointList.map(p => `[${p.lng.toFixed(6)},${p.lat.toFixed(6)}]`).join('<br/>')
      const winContent = `
        <div style="padding:6px;">
          <div><b>多边形信息</b></div>
          <div>顶点数量:${pointList.length}</div>
          <div>顶点坐标:<br/>${pointStr}</div>
        </div>
      `
      const infoWin = new T.InfoWindow(winContent)
      // 弹窗在多边形第一个顶点位置打开
      map.openInfoWindow(infoWin, pointList[0])
    })

    console.log('多边形顶点:', pointList)
    pointList = []
  })
}

// 清空绘制
const clearDraw = () => {
  if(polyline) {
    map.removeOverLay(polyline)
    polyline = null
  }
  if(polygon) {
    map.removeOverLay(polygon)
    polygon = null
  }
  pointList = []
  // 关闭打开的弹窗
  map.closeInfoWindow()
}

onMounted(() => {
  initMap()
})

onUnmounted(() => {
  if(map){
    clearDraw()
    const dom = document.getElementById('map')
    dom.innerHTML = ''
    map = null
  }
})
</script>

<style scoped>
.map-page {
  padding: 20px;
}
.map-container {
  width: 100%;
  height: 600px;
  border:1px solid #ccc;
}
</style>

操作说明

  1. 单击地图添加顶点,红色折线实时预览
  2. 至少 3 个点,双击地图生成蓝色半透明多边形
  3. 点击多边形内部,弹出信息窗口,展示顶点数量与所有坐标
  4. 点击【清空绘制】:清除折线、多边形,关闭弹窗,重置绘制状态
相关推荐
溪语流沙1 小时前
【Web全栈进阶】Composition API与组件通信:props深入、emit、插槽
前端·css·vue.js
顽疲5 小时前
Java vue 养老系统源码详解:入住核算单 live-check 缴费入账与预交金收据实践
java·vue.js·python·java 养老·springboot 养老·vue养老
志尊宝6 小时前
Vue3 零基础每日笔记(088·完结):从零到一——一个完整 Vue3 项目的成长复盘
前端·javascript·vue.js·笔记·ecmascript·#vue.js
桔筐6 小时前
Vue中DOM的data-*自定义属性(dataset)与Vue data响应式变量区别详解
前端·javascript·vue.js
用户1733598075377 小时前
纯前端 PDF 按书签拆分避坑指南:拆分后章节对不上?
前端·javascript·vue.js
雪芽蓝域zzs8 小时前
Webstorm打开uniapp uvue文件报红处理方案
vue.js
撸串-研究生9 小时前
面向景区的综合服务管理平台设计——以稻城亚丁景区为例【附源码】
java·开发语言·vue.js·前后端分离·稻城亚丁景区
志尊宝21 小时前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js
m0_587383001 天前
无人自助拼豆系统落地开发实战指南 核心逻辑实现与部署经验分享
前端·javascript·vue.js·人工智能·经验分享·需求分析