demo

请注意,本文档中所有示例使用的 mapKey 仅作文档测试使用,不定期修改相关配置,请勿使用在任何项目中

<template>
  <tmap-map
    mapKey="TOZBZ-OU2CX-JJP4Z-7FCBV-CDDJ2-AHFQZ"
    :doubleClickZoom="false"
  >
    <tmap-multi-polygon
      :id="id"
      :styles="styles"
      :geometries="geometries"
      @click="print"
      @dblclick="print"
    />
    <div class="color">
      <div>改变颜色:</div>
      <div class="green" @click="setColor('#00FF00')"></div>
      <div class="blue" @click="setColor('#00FFFF')"></div>
      <div>添加多边形</div>
      <div><button @click="onAdd">add</button></div>
      <div><button @click="onRemove">remove</button></div>
    </div>
  </tmap-map>
</template>

<script lang="ts">
import { defineComponent, shallowRef, unref } from 'vue';

export default defineComponent({
  name: 'multi-polygon',
  setup() {
    const geometries = shallowRef([
      {
        id: 'polygonTen', // 多边形图形数据的标志信息
        styleId: 'polygon', // 样式id
        paths: [
          { lat: 40.041054, lng: 116.272303 },
          { lat: 40.039419, lng: 116.272721 },
          { lat: 40.039764, lng: 116.274824 },
          { lat: 40.041374, lng: 116.274491 },
        ], // 多边形的位置信息
        properties: {
          // 多边形的属性数据
          title: '腾讯北京总部',
        },
      },
    ]);
    const styles = shallowRef({
      polygon: {
        color: '#3777FF', // 面填充色
        showBorder: true, // 是否显示拔起面的边线
        borderColor: '#ff00ff', // 边线颜色
      },
      ssss: {
        color: '#fff00f',
        showBorder: true,
        borderColor: '#3F09F9',
        borderWidth: 2,
      },
    });
    // 使用setup函数需要手动包装reactive
    return {
      id: 'polygon-layer',
      styles,
      geometries,
      setColor(color: string) {
        styles.value = {
          ...styles.value,
          polygon: {
            ...styles.value.polygon,
            color,
          },
        };
      },
      onAdd: () => {
        if (geometries.value.length > 1) {
          return;
        }
        geometries.value = [
          ...unref(geometries),
          {
            id: 'polygonSina', // 多边形图形数据的标志信息
            styleId: 'ssss', // 样式id
            paths: [
              { lat: 40.041649, lng: 116.275059 },
              { lat: 40.040828, lng: 116.275237 },
              { lat: 40.040934, lng: 116.276079 },
              { lat: 40.041041, lng: 116.276229 },
              { lat: 40.041095, lng: 116.276481 },
              { lat: 40.041058, lng: 116.276787 },
              { lat: 40.041144, lng: 116.277613 },
              { lat: 40.041965, lng: 116.277404 },
              { lat: 40.041879, lng: 116.276653 },
              { lat: 40.041776, lng: 116.276293 },
              { lat: 40.041752, lng: 116.276073 },
              { lat: 40.041768, lng: 116.275864 },
            ],
            properties: {
              // 多边形的属性数据
              title: '其他建筑物',
            },
          },
        ];
      },
      onRemove: () => {
        if (geometries.value.length < 2) {
          return;
        }
        geometries.value = [unref(geometries)[0]];
      },
      print(e: unknown) {
        console.log(e);
      },
    };
  },
});
</script>
<style lang="scss" scoped>
.color {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 1001;
  display: flex;
  align-items: center;
}
.green {
  width: 40px;
  height: 40px;
  background: #00ff00;
  cursor: pointer;
}
.blue {
  width: 40px;
  height: 40px;
  background: #00ffff;
  cursor: pointer;
}
</style>