vue-antv 地图(PointLayer)

捣鼓地图简直生无可恋,不mark下真对不起浪费的脑细胞~~~

牵涉到地图加载,打点,弹窗,PointLayer那里有点繁琐,应该可以优化,交给后续吧~先上图

<div id="userMap" style="height: 100%;"></div>
import {Scene, PointLayer, Popup, Marker, Zoom} from '@antv/l7'
onMounted(() => {
      initUserMap()
    })

//危险企业
    let dangerLayer = null
    let dangerData = ref([])
    //绿色企业
    let greenLayer = null
    let greenData = ref([])
    //普通企业
    let normalLayer = null
    let normalData = ref([])
    let pop = null

    const drawMarker = (scene) => {
      scene.addImage('00', require('../../assets/screen/icon_danger.png'));
      scene.addImage('01', require('../../assets/screen/icon_star.png'));

      ScreenService.getInstance().companyInfo().subscribe(res => {
        let markerEl = null

        dangerData.value = res.data.filter(dot => dot.latitude && dot.isDangerousGoodsPort);
        greenData.value = res.data.filter(dot => dot.latitude && dot.isGreenPort);
        normalData.value = res.data.filter(dot => dot.latitude && !dot.isGreenPort && !dot.isDangerousGoodsPort);
        console.log('normalData.value',normalData.value)
        console.log('greenData.value',greenData.value)

        normalLayer = new PointLayer({
          visible:true,
          zIndex:2,
          cursor:'pointer',
        })
            .source(normalData.value, {
              parser: {
                type: 'json',
                x: 'longitude',
                y: 'latitude'
              }
            })
            .shape('circle')
            .size(6)
            .color('#0f0')
            .active(true)
        normalLayer.on('click', (ev) => {
          sessionStorage.setItem('portId', ev.feature.id)
          window.open('#/case')
        })
        normalLayer.on('mousemove', (ev) => {
          pop = new Popup({
            offsets: [ 0, 0 ],
            closeButton: false,
          })
              .setLnglat({lng: ev.feature.longitude, lat: ev.feature.latitude})
              .setHTML(`<span>${ev.feature.companyName}</span>`);
          scene.addPopup(pop);
        })
        scene.addLayer(normalLayer);

        dangerLayer = new PointLayer({
          visible:true,
          zIndex:10,
          cursor:'pointer',
        })
            .source(dangerData.value, {
              parser: {
                type: 'json',
                x: 'longitude',
                y: 'latitude'
              }
            })
            .shape('companyName', [ '00' ])
            .size(15),

        dangerLayer.on('click', (ev) => {
          sessionStorage.setItem('portId', ev.feature.id)
          window.open('#/case')
        })
        dangerLayer.on('mousemove', (ev) => {
          pop = new Popup({
            offsets: [ 0, 0 ],
            closeButton: false,
          })
              .setLnglat({lng: ev.feature.longitude, lat: ev.feature.latitude})
              .setHTML(`<span>${ev.feature.companyName}</span>`);
          scene.addPopup(pop);
        })
        scene.addLayer(dangerLayer);

        greenLayer = new PointLayer({
          visible:true,
          zIndex:10,
          cursor:'pointer',
        })
            .source(greenData.value, {
              parser: {
                type: 'json',
                x: 'longitude',
                y: 'latitude'
              }
            })
            .shape('companyName', [ '01' ])
            .size(15)
        greenLayer.on('click', (ev) => {
          sessionStorage.setItem('portId', ev.feature.id)
          window.open('#/case')
        })
        greenLayer.on('mousemove', (ev) => {
          pop = new Popup({
            offsets: [ 0, 0 ],
            closeButton: false,
          })
              .setLnglat({lng: ev.feature.longitude, lat: ev.feature.latitude})
              .setHTML(`<span>${ev.feature.companyName}</span>`);
          scene.addPopup(pop);
        })
        scene.addLayer(greenLayer);
      })
    }


    let map = null;
    // 地图
    const initUserMap = () => {
      map = new GaodeMap({
        pitch: 0,
        style: 'dark',
        mapStyle: 'amap://styles/darkblue',
        center: [120.423730, 31.629810],
        zoom: 10,
        token: 'ced0d726cd96553ba8b5b3521671aaf4'
      })

      const scene = new Scene({
        id: 'userMap',
        map: map,
        logoVisible: false,
      });


      scene.on('loaded', () => {
        drawMarker(scene)
      });

    }
<style lang="scss" scoped>
:deep(.l7-popup) {
  border-radius: 5px;

  .l7-popup-tip {
    border-top-color: rgba(23, 103, 159,.6);
  }

  .l7-popup-content {
    padding:8px;
    color: #fff;
    background: rgba(23, 103, 159,.6) !important;
    border: 1px solid #0e2740 !important;

    .l7-popup-close-button {
      fill: #fff;
    }

    .l7-layer-popup__value {
      font-size: 16px;
      color: aqua;
    }
  }
}
</style>

### 安装与配置 为了使用 `@antv/x6-vue-shape`,需要先通过包管理工具安装必要的依赖: ```bash pnpm install @antv/x6 @antv/x6-vue-shape ``` 此命令会下载并安装 AntV X6 及其 Vue 组件支持库[^1]。 ### 创建自定义形状组件 在项目中创建一个新的 Vue 单文件组件来表示图形中的节点。这个组件可以利用 Element Plus 或其他任何 UI 库构建复杂的界面逻辑。 例如,在 `src/components/CustomNode.vue` 中定义如下结构: ```vue <template> <div class="custom-node"> <!-- 节点内部的内容 --> {{ nodeData.label }} </div> </template> <script setup lang="ts"> import { defineProps } from 'vue'; defineProps<{ nodeData: any; }>(); </script> <style scoped> .custom-node { width: 100%; height: 100%; } </style> ``` ### 注册自定义形状到AntV X6 为了让 AntV X6 认识新创建的 Vue 组件作为合法的绘图元素之一,需调用 `registerVueComponent()` 方法完成注册过程。 ```javascript import { registerVueComponent } from '@antv/x6-vue-shape'; import CustomNode from '@/components/CustomNode.vue'; // 将 Vue 组件注册为 AntV X6 形状 registerVueComponent('custom-node', CustomNode); ``` ### 构建画布实例 初始化一个 Graph 实例,并设置容器和其他选项如网格线显示等特性。 ```typescript import { Graph } from '@antv/x6'; const graph = new Graph({ container: document.getElementById('container'), grid: true, }); ``` ### 添加带有上下文菜单功能的节点 最后一步是在图表上添加具有交互特性的节点,比如这里展示的是如何集成右键点击弹出菜单的功能。 ```typescript graph.addNode({ shape: 'custom-node', x: 100, y: 150, id: 'node-id', tools:[ { name: 'contextmenu', args: { menu: [ { key: 'input', label: '输入内容', click(view) { console.log(view); }}, { key: 'flow', label: '查看流水'} ] } }, ], data: { label: "这是一个测试标签" } }); ``` 上述代码片段展示了如何结合 AntV X6 和 Vue 来制作可定制化的流程图编辑器的一部分——即带有一个简单上下文菜单的自定义节点[^2]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值