132.在 Vue3 中使用 OpenLayers 实现地图剪切与遮罩效果

🎬 效果预览

👇 点击按钮即可对地图进行遮罩、剪切、取消操作:


🧠 功能说明

本文将教你如何在 Vue 3 中使用 OpenLayers + ol-ext 插件,实现以下功能:

  • 加载地图并显示中国边界图层;

  • 点击“遮罩”按钮,对地图指定区域进行灰色遮罩处理;

  • 点击“剪切”按钮,只显示地图中指定区域,其他部分裁剪掉;

  • 点击“取消”按钮恢复地图原始显示效果。


🛠️ 技术栈

  • Vue 3 + Composition API

  • OpenLayers(地图渲染)

  • ol-ext(高级图层效果如 Mask、Crop)

  • Element Plus(按钮组件)

  • Tailwind CSS(页面布局)


🧩 整体结构

├── src/
│   ├── assets/
│   │   └── map/
│   │       └── china.json        // 中国边界 GeoJSON 数据
│   ├── views/
│   │   └── MapMaskCrop.vue       // 本文的核心组件

📦 安装依赖

npm install ol ol-ext

确保你已经安装并使用 element-plustailwindcss


📄 核心代码实现(Vue3 + Composition)

<!--
 * @Author: 彭麒
 * @Date: 2025/5/28
 * @Email: 1062470959@qq.com
 * @Description: 此源码版权归吉檀迦俐所有,可供学习和借鉴或商用。
 -->
<template>
  <div class="container">
    <div class="w-full flex justify-center flex-wrap">
      <div class="font-bold text-[24px]">在Vue3中使用OpenLayers加载 Feature 做剪切、遮罩处理</div>
    </div>
    <h4>
      <el-button type="primary" size="small" @click="mapmask">遮罩</el-button>
      <el-button type="danger" size="small" @click="mapcrop">剪切</el-button>
      <el-button type="danger" size="small" @click="cancel">取消</el-button>
    </h4>
    <div id="vue-openlayers"></div>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
import 'ol/ol.css'
import 'ol-ext/dist/ol-ext.min.css'

import { Map, View } from 'ol'
import OSM from 'ol/source/OSM'
import TileLayer from 'ol/layer/Tile'
import GeoJSON from 'ol/format/GeoJSON'
import Fill from 'ol/style/Fill'
import Mask from 'ol-ext/filter/Mask'
import Crop from 'ol-ext/filter/Crop'

// 引入地理数据
import jsonData from '@/assets/map/china.json'

let map = null
let osmLayer = null
const mask = ref(null)
const crop = ref(null)

const cancel = () => {
  if (mask.value) {
    mask.value.set('active', false)
  }
  if (crop.value) {
    crop.value.set('active', false)
  }
}

const mapcrop = () => {
  cancel()
  const feature = new GeoJSON().readFeature(jsonData.features[0])
  crop.value = new Crop({
    feature,
    wrapX: true,
    inner: false,
  })
  osmLayer.addFilter(crop.value)
}

const mapmask = () => {
  cancel()
  try {
    const feature = new GeoJSON().readFeature(jsonData.features[0])
    console.log('加载的要素:', feature)
    mask.value = new Mask({
      feature,
      wrapX: true,
      inner: false,
      fill: new Fill({
        color: [0, 0, 0, 0.5],
      }),
    })
    osmLayer.addFilter(mask.value)
  } catch (error) {
    console.error('遮罩创建错误:', error)
  }
}

const initMap = () => {
  osmLayer = new TileLayer({
    source: new OSM(),
  })

  map = new Map({
    layers: [osmLayer],
    target: 'vue-openlayers',
    view: new View({
      // 调整为中国的合适坐标范围
      center: [105, 35],  // 中国中心大致位置
      zoom: 4,  // 缩小以显示整个中国
      projection: 'EPSG:4326',
    }),
  })
}

onMounted(() => {
  initMap()
})
</script>

<style scoped>
.container {
  width: 840px;
  height: 570px;
  margin: 50px auto;
  border: 1px solid #42B983;
}
#vue-openlayers {
  width: 800px;
  height: 400px;
  margin: 0 auto;
  border: 1px solid #42B983;
  position: relative;
  background-color: #f5f5f5; /* 添加背景色以便于调试 */
}
</style>

📁 附:china.json 示例结构

确保你使用的是标准 GeoJSON 格式的中国边界数据:

{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [ ... ] }, "properties": { ... } } ] }

你可以从 阿里地图GeoJSON数据 下载所需边界数据。


✅ 总结

本文通过 Vue3 + OpenLayers + ol-ext 演示了地图遮罩与裁剪的效果,适用于政务可视化、地理信息系统、可交互地图开发等场景。

✨ 如果你觉得有帮助,欢迎留言交流、点赞收藏!
📌 更多 OpenLayers 高级玩法,后续会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉檀迦俐

你的鼓励奖是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值