多边形编辑

基于腾讯地图几何图形编辑器封装,开发者不需要关心用户的操作行为,多边形数据会响应式的更新

基础示例

geometries:
[
    {
        "id": "polygonTen",
        "styleId": "polygon",
        "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": "腾讯北京总部"
        }
    },
    {
        "id": "polygonSina",
        "styleId": "polygon",
        "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": "其他建筑物"
        }
    }
]
<template>
  <div :style="{ height: 400 }">
    <tmap-map mapKey="TOZBZ-OU2CX-JJP4Z-7FCBV-CDDJ2-AHFQZ">
      <tmap-multi-polygon
        v-if="actionMode === 0"
        :id="id"
        :styles="styles"
        :geometries="geometries"
      />
      <tmap-polygon-editor
        v-else
        ref="editor"
        :id="id"
        :styles="styles"
        v-model="geometries"
        :action-mode="actionMode"
        @select="onSelect"
        @error="onError"
      />
      <div class="ctrl">
        <div>
          <input type="radio" :value="0" v-model="actionMode" />
          <label>预览模式</label>
          <input type="radio" :value="1" v-model="actionMode" />
          <label>编辑模式</label>
          <input type="radio" :value="2" v-model="actionMode" />
          <label>新增模式</label>
          <button @click.stop="split">分割</button>
          <button @click.stop="union">合并</button>
          <button @click.stop="del">删除</button>
          <button @click.stop="stop">结束绘制</button>
        </div>
      </div>
    </tmap-map>
  </div>
  <div>
    <div>geometries:</div>
    <pre><code>{{ JSON.stringify(geometries, null, '    ') }}</code></pre>
  </div>
</template>

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

export default defineComponent({
  name: 'polygon-editor',
  setup() {
    const editor = ref();
    const geometries = ref([
      {
        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: '腾讯北京总部',
        },
      },
      {
        id: 'polygonSina', // 多边形图形数据的标志信息
        styleId: 'polygon', // 样式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: '其他建筑物',
        },
      },
    ]);
    watch(
      () => geometries.value,
      () => {
        console.log('watch', geometries.value);
      },
    );
    const actionMode = ref(1);
    return {
      editor,
      id: 'polygon-layer',
      styles: {
        drawing: {
          color: '#3777FF', // 面填充色
          showBorder: true, // 是否显示拔起面的边线
          borderColor: '#00FFFF', // 边线颜色
        },
        selected: {
          color: '#ff0000', // 面填充色
          showBorder: false, // 是否显示拔起面的边线
          borderColor: '#00ff00', // 边线颜色
        },
      },
      styles1: {
        default: {
          color: '#ff0000', // 面填充色
          showBorder: true, // 是否显示拔起面的边线
          borderColor: '#00FFFF', // 边线颜色
        },
      },
      geometries,
      actionMode,
      select: () => {
        if (editor.value?.select) {
          editor.value.select();
        }
      },
      stop: () => {
        if (editor.value?.stop) {
          editor.value.stop();
        }
      },
      split: () => {
        if (editor.value?.split) {
          editor.value.split();
        }
      },
      union: () => {
        if (editor.value?.union) {
          editor.value.union();
        }
      },
      del: () => {
        if (editor.value?.delete) {
          editor.value.delete();
        }
      },
      onSelect: (e: TMap.PolygonGeometry) => {
        console.log('print', e);
      },
      onError: (e: Record<string, string>) => {
        console.log('print', e);
      },
    };
  },
});
</script>

<style lang="scss" scoped>
.ctrl {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 1001;
  display: flex;
  align-items: center;
}
</style>

props

名称类型说明
idString图层 id
zIndexNumber图层绘制顺序
snappableBoolean是否开启吸附功能,默认为 false
drawingStyleIdString编辑态的样式 id
selectedStyleIdString选中态态的样式 id
styles{ [key: string]: TMap.PolygonStyleOptions }样式
modelValueTMap.PolygonGeometry[]多边形数据
actionModeNumber编辑器的操作状态

ref 可用方法

  • select: 选中属于激活状态的图层内的几何图形,若传入空数组则清空;
  • stop: 停止绘制或编辑过程
  • split: 拆分已选中多边形,
  • union: 合并已选中多边形
  • delete: 删除已选中图形

详细文档见官网 https://lbs.qq.com/webApi/javascriptGL/glDoc/glDocEditor