百度地图 MapvThree 掩膜功能:让你的地图只显示想要的区域

77 阅读3分钟

MapV Three 掩膜功能

一句话解释

TileMask 是 MapV Three 提供的区域掩膜功能,可以让地图瓦片只在指定的地理区域内显示,实现精准的区域限制效果。

为什么需要掩膜功能?

你有没有遇到过这样的需求:做一个湖南省的数据可视化项目,但地图总是会显示周边省份的内容?或者想做一个"显示除了某个区域以外的所有地图"这样的反向效果?

这就是掩膜功能要解决的问题!通过 TileMask,我们可以:

  • ✅ 只显示特定省份或城市的地图内容
  • ✅ 反向显示某个区域以外的地图
  • ✅ 动态切换显示区域
  • ✅ 让自定义的 3D 对象也遵循相同的掩膜规则

这个功能在做区域聚焦展示、行政区域对比、专题地图制作时特别实用! image

📖 快速上手 TileMask

第一步:准备区域数据

首先,我们需要准备一个 GeoJSON 格式的区域数据。比如湖南省的边界数据:

const regionData = {
    type: 'FeatureCollection',
    features: [
        {
            type: 'Feature',
            geometry: {
                type: 'Polygon',
                coordinates: [
                    [
                        [111.5, 28.0],
                        [112.0, 28.0],
                        [112.0, 29.0],
                        [111.5, 29.0],
                        [111.5, 28.0]
                    ]
                ]
            }
        }
    ]
};

第二步:创建 TileMask

接下来就是创建掩膜对象了,这里有个特别重要的点!

// 1. 创建地图引擎
const engine = new mapvthree.Engine(document.getElementById('container'), {
    map: { is3DControl: true },
    rendering: { enableAnimationLoop: true }
});

// 2. 添加矢量地图
const vectorMap = new mapvthree.BaiduVectorMap();
engine.add(vectorMap);

// 3. 获取 TileProvider(重点来了!)
const vectorProvider = vectorMap.vectorSurface.tileProvider;

// 4. 创建 TileMask
const tileMask = engine.add(new mapvthree.TileMask({
    targets: [vectorProvider],  // 注意:这里是 TileProvider,不是 vectorMap!
    region: regionData
}));

⚠️ :TileMask 的 targets 参数需要传入 TileProvider 对象,而不是 MapView 或者其他对象!

掩膜的核心功能

创建好 TileMask 之后,我们就可以玩转各种掩膜效果了!

1. 启用和禁用掩膜

这个最简单,一行代码搞定:

// 启用掩膜
tileMask.enabled = true;

// 禁用掩膜
tileMask.enabled = false;

启用后,地图就只会显示湖南省边界内的内容了,其他区域都会被遮挡掉。

2. 动态更新掩膜区域

掩膜区域不是一成不变的,你可以随时切换到新的区域:

// 创建一个新的矩形区域
const newRegion = {
    type: 'Feature',
    geometry: {
        type: 'Polygon',
        coordinates: [[
            [110.0, 27.0],
            [113.0, 27.0],
            [113.0, 30.0],
            [110.0, 30.0],
            [110.0, 27.0]
        ]]
    }
};

// 更新掩膜区域
tileMask.region = newRegion;

比如做一个省份切换的功能,用户点击按钮就能切换到不同省份的掩膜效果,就是这样实现的!

🎨 让自定义对象也遵循掩膜规则

有时候我们不光想让地图瓦片遵循掩膜规则,还想让场景中的自定义 3D 对象也应用同样的掩膜效果。MapV Three 提供了两种方式:

方式一:注册整个对象

// 创建一个 Three.js 的盒子
const boxGeometry = new THREE.BoxGeometry(20, 20, 20);
const boxMaterial = new THREE.MeshBasicMaterial({
    color: 0x00ff00,
    transparent: true,
    opacity: 0.5
});
const box = new THREE.Mesh(boxGeometry, boxMaterial);

// 将整个对象注册到掩膜系统
tileMask.addNeedsMaskedObject(box);

这种方式最简单,TileMask 会自动处理对象的材质。

方式二:直接注册材质

// 只注册材质
tileMask.addNeedsMaskedMaterial(boxMaterial);

这种方式更灵活,适合多个对象共用同一个材质的情况。

总结

总结一下 TileMask 的使用要点:

  1. 创建时机:在添加矢量地图后创建 TileMask
  2. targets 参数:必须传入 TileProvider
  3. region 参数:使用 GeoJSON 格式的 Polygon 数据,确保坐标闭合
  4. enabled 属性:控制掩膜的启用和禁用
  5. 动态更新:可以随时修改 region 属性来切换掩膜区域
  6. 自定义对象:使用 addNeedsMaskedObjectaddNeedsMaskedMaterial 让自定义对象也应用掩膜

思考

TileMask 还可以用在哪些有趣的场景吗?比如:

  • 动态的台风影响范围展示?
  • 根据用户权限显示不同的地图区域?
  • 结合时间轴做历史疆域变迁动画?

你在项目中有用过类似的区域限制功能吗?遇到过什么有趣的需求或者踩过什么坑?欢迎在评论区分享你的经验!

希望这篇文章能帮助你更好地理解和使用 MapV Three 的掩膜功能。如果你觉得有用,别忘了点赞收藏~下次见!👋