mapbox动态的箭头指示(视觉效果上是这样)

贴个群号

WebGIS学习交流群461555818,欢迎大家。

成果图请添加图片描述

原理

这个一般用于一些比如类似转移路线的指示,这个方案其实是一种视觉上的欺骗,实际上仔细观察箭头并没有动,在视觉上看起来好像是箭头在动,营造出一种动态的效果。
原理也很简单,就是叠加图层,一个用line-pattern写一个箭头图层,一个图层利用https://docs.mapbox.com/mapbox-gl-js/example/animate-ant-path官网上这个例子,搞成颜色一样的流动线在覆盖在上面,营造出一种箭头在流动的效果。

核心源码

//两个图层的配置
{
    "id": "zhuanyiluxian",
    "type": "line",
    "source": "zhuanyiluxian",
    "minzoom": 11,
    "maxzoom": 17,
    "layout": {
        "visibility": "visible"
    },
    "paint": {
        "line-pattern": "zhuanyiluxian",
        "line-opacity": 1,
        "line-width": 16
    }
}
{
    "id": "zhuanyiluxian-dash",
    "type": "line",
    "source": "zhuanyiluxian",
    "minzoom": 11,
    "maxzoom": 17,
    "layout": {
        "visibility": "visible"
    },
    "paint": {
        "line-color": "#06f315",
        "line-width": 2,
        "line-dasharray": [
            1.5,
            4,
            1.5
        ]
    }
}
	//添加以上两个图层之后 再添加这个函数,参数是动态线的图层配置
    async addDashLayer(sourceLayerConfig){
        const self = this
        const dashArraySequence = [
            [0, 4, 3],
            [0.5, 4, 2.5],
            [1, 4, 2],
            [1.5, 4, 1.5],
            [2, 4, 1],
            [2.5, 4, 0.5],
            [3, 4, 0],
            [0, 0.5, 3, 3.5],
            [0, 1, 3, 3],
            [0, 1.5, 3, 2.5],
            [0, 2, 3, 2],
            [0, 2.5, 3, 1.5],
            [0, 3, 3, 1],
            [0, 3.5, 3, 0.5]
        ];

        let step = 0;

        function animateDashArray(timestamp) {
            // Update line-dasharray using the next value in dashArraySequence. The
            // divisor in the expression `timestamp / 50` controls the animation speed.
            const newStep = parseInt(
                (timestamp / 100) % dashArraySequence.length
            );

            if (newStep !== step) {
                let layer = self.map.getLayer(sourceLayerConfig.id+'-dash'); //获取图层
                // debugger
                if (layer) {
                    self.map.setPaintProperty(
                        sourceLayerConfig.id+'-dash',
                        'line-dasharray',
                        dashArraySequence[step]
                    );
                    step = newStep;
                }
            }

            // Request the next frame of the animation.
            requestAnimationFrame(animateDashArray);
        }

        // start the animation
        animateDashArray(0);
    },
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在mapbox中实现动态线条方向,可以利用mapbox-gl图层Layer中的icon-rotate属性来旋转箭头图标的角度。首先需要注意的是,默认情况下,目标与正北方向之间有90°的夹角,所以需要将目标的方向角度(bearing)减去90°。具体的代码如下: let iconRotate = Number(bearing - 90); 然后,在配置layout中添加symbol-placement和symbol-spacing属性,并设置symbol-placement为'line',symbol-spacing为图标之间的间隔(默认为250)。同时,还需要设置icon-image为箭头图标的名称,icon-size为图标的大小。以下是添加箭头图层的核心代码: function addArrowlayer() { map.addLayer({ 'id': 'arrowLayer', 'type': 'symbol', 'source': { 'type': 'geojson', 'data': routeGeoJson //轨迹geojson格式数据 }, 'layout': { 'symbol-placement': 'line', 'symbol-spacing': 50, // 图标间隔,默认为250 'icon-image': 'arrowIcon', //箭头图标 'icon-size': 0.5 } }); } 通过以上代码,可以在mapbox中实现动态线条方向,箭头图标会根据目标的方向角度进行旋转。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [mapbox-gl 实现末尾带箭头的线](https://blog.csdn.net/qq_24343389/article/details/130868812)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [mapboxgl实现带箭头轨迹线](https://blog.csdn.net/gisarmory/article/details/112034622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值