mapbox地图动画一键飞行

61 篇文章 2 订阅
2 篇文章 0 订阅

最近,Mapbox GL JS 从 v2.9 开始支持将地图显示为 3D 地球。

话不多说,马上看看效果怎么样:

mapbox地图动画

我们通过设置投影属性projection:globe,即可将地图更改为地球

const map = new mapboxgl.Map({
    container: 'map',
    projection: 'globe'
});

地图基础数据配置

    var map = new mapboxgl.Map({
      style: "mapbox://styles/mapbox/satellite-streets-v11",
      // center: [121.42, 31.22], //上海市长宁区
      // zoom: 11.5, //缩放级别
      // minZoom: 9,
      // maxZoom: 19,
      container: "map",
      // pitch: 60, // 俯视
      projection: "globe",
      localIdeographFontFamily: "'Noto Sans', 'Noto Sans CJK SC', sans-serif",
      ...start,
      
    });

氛围造型:朦胧星星

在这里插入图片描述

map.on('style.load', () => {
    map.setFog({
        color: "rgb(186, 210, 235)",
        'high-color': 'rgb(36, 92, 223)', 
        'horizon-blend': 0.02, 
        'space-color': 'rgb(11, 11, 25)', 
        'star-intensity': 0.6 
      });
});

你可以自定义配置,支持缩放表达式

配置飞行动画

  //球体飞行
  const start = {
      center: [80, 36], //放置在屏幕中心的位置
      zoom: 1,  //所需的缩放级别
      pitch: 0,  //所需的音高(以度为单位
      bearing: 0, //所需的方位角(以度为单位)
  };
  const end = {
      center: [121.42, 31.22],
      zoom: 12.5,
      bearing: 130,
      pitch: 75,
  };
    
 let isAtStart = true;
      document.getElementById("fly").addEventListener("click", () => {
        const target = isAtStart ? end : start;
        isAtStart = !isAtStart;
        map.flyTo({
          ...target,
          duration: 12000,
          essential: true,
        });
 });
  • animate :false 不会出现动画。 (boolean)false
  • duration :动画的持续时间,以毫秒为单位。 (number)
  • easing :一个函数,时间在 0…1 范围内,并返回一个数字,其中 0 是初始状态,1 是最终状态。 (Function)
  • essential :true则动画被认为是必不可少的,不会受到影响 。 (boolean)trueprefers-reduced-motion
  • offset :动画结束时目标中心相对于真实地图容器中心的偏移量。 (PointLike)
  • preloadOnly :ture它会触发瓦片在动画路径上的加载,但不会发生动画。 (boolean)true
 <Button id="fly" type="dashed">
      <span>一键飞行✈️</span>
 </Button>

旋转动画

function rotateCamera(timestamp: any) {
  map.rotateTo((timestamp / 100) % 360, { duration: 0 });
  requestAnimationFrame(rotateCamera);
}
//动画
rotateCamera(0);
const layers = map.getStyle().layers;
for (const layer of layers) {
	if (layer.type === "symbol" && layer.layout["text-field"]) {
		map.removeLayer(layer.id);
	}
}

最后,很高兴附上github地址,以及demo体验地址希望能够帮助到你~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

椰卤工程师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值