mapboxgl添加雪碧图 addImage loadImage png/jpg svg

10 篇文章 0 订阅
本文介绍了如何使用MapboxGL在地图上添加PNG和JPG图片,以及处理SVG格式图片时需要先转换为Base64并通过Canvas绘制的技巧,以解决MapboxGL不支持SVG原生加载的问题。
摘要由CSDN通过智能技术生成

一、mapboxgl可以添加png或者jpg类型的图片到雪碧图中

async function addPng(id, url) {
            const img = await new Promise((resolve) => {
                map.loadImage(url, (error, image) => {
                    if (error) throw error;
                    resolve(image);
                });
            });
            if (!map.hasImage(id)) {
                map.addImage(id, img);
            }
        }

二、mapboxgl不支持直接添加svg到雪碧图,可以先把svg转成base64,再绘制到canvas上生成一张图片

直接添加报错:mapbox-gl.js:31 Uncaught (in promise) Error: Could not load image because of The source image could not be decoded.. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.
    at mapbox-gl.js:31:14115

async function addSvg(id, url) {
            const img = await new Promise(async (resolve) => {
                let res = await axios.get(url);
                let objE = document.createElement("div");
                objE.innerHTML = res.data;

                // 设置svg的颜色,非必须
                let d = objE.children[0];
                let color = '#f00';
                d.style.fill = color;
                d.querySelectorAll("path").forEach((item) =>
                    item.setAttributeNS(null, "fill", color)
                );

                let image = new Image();
                image.src =
                    "data:image/svg+xml;base64," +
                    window.btoa(unescape(encodeURIComponent(objE.innerHTML)));
                let canvas = document.createElement("canvas"); //准备空画布
                canvas.width = 20;
                canvas.height = 20;
                let context = canvas.getContext("2d"); //取得画布的2d绘图上下文
                image.onload = function () {
                    context.drawImage(image, 0, 0, 20, 20);
                    let outImg = new Image();
                    outImg.src = canvas.toDataURL("image/webp");
                    resolve(outImg);
                };
            });

            if (!map.hasImage(id)) {
                map.addImage(id, img);
            }
        }

 

 

是的,你可以将 `fill` 类型的图层转换为图片,并加载到 Mapbox GL 地图上。这样可以解决在小比例尺下消失或网格小于1像素的问题。下面是一个实现的示例: 1. 使用 Mapbox GL 的 `map.getCanvas().toDataURL()` 方法将 `fill` 图层转换为图片。这个方法将当前地图视图中的画布转为一个数据 URL。 ```javascript const fillLayerId = 'your-fill-layer-id'; // 替换为你的 fill 图层的 ID const canvas = map.getCanvas(); // 将 fill 图层的画布转为数据 URL const dataURL = canvas.toDataURL('image/png'); ``` 2. 创建一个新的 Mapbox GL `Image` 对象,并将之前生成的数据 URL 作为源设置给它。 ```javascript const image = new mapboxgl.Image(); image.id = 'your-image-id'; // 替换为你的图片的 ID image.width = canvas.width; image.height = canvas.height; image.data = dataURL; ``` 3. 将这个新的图片对象添加到地图样式中作为一个图像源。 ```javascript map.addImage(image.id, image); ``` 4. 创建一个新的 `fill-extrusion` 图层,使用刚刚添加的图片源替代原来的 `fill` 图层。 ```javascript const fillExtrusionLayerId = 'your-fill-extrusion-layer-id'; // 替换为你的 fill-extrusion 图层的 ID // 创建一个新的 fill-extrusion 图层,使用刚刚添加的图片作为填充 map.addLayer({ id: fillExtrusionLayerId, type: 'fill-extrusion', source: { type: 'image', url: image.id, coordinates: [[-180, 90], [180, 90], [180, -90], [-180, -90]] // 覆盖整个地球范围 }, paint: { 'fill-extrusion-color': 'white', // 设置 fill-extrusion 的颜色 'fill-extrusion-height': 0 // 设置 fill-extrusion 的高度 } }); // 移除原来的 fill 图层 map.removeLayer(fillLayerId); ``` 通过以上步骤,你可以将 `fill` 类型的图层转换为图片,并加载到 Mapbox GL 地图上。这样可以避免在小比例尺下消失或网格小于1像素的问题。请确保在代码中使用相应的图层 ID,并根据需要调整图片的样式和参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值