Skip to content

Conversation

@deyihu
Copy link
Collaborator

@deyihu deyihu commented Jan 15, 2026

No description provided.

@deyihu deyihu changed the title feat:VT tile data support gzip decode by 'loadTileNeedDecodeGZip' feat:VT tile data support gzip decode by 'loadTileDecodeGZip' Jan 15, 2026
@deyihu deyihu requested a review from fuzhenn January 16, 2026 07:32
@fuzhenn
Copy link
Member

fuzhenn commented Jan 16, 2026

如果能自动识别mvt被gzip压缩过,就可以省略掉 loadTileDecodeGZip 设置了。

我记得zip压缩后的数据头部都有固定的标识符。

@fuzhenn
Copy link
Member

fuzhenn commented Jan 16, 2026

deepseek老师提供的答案:

function isGzipBuffer(arrayBuffer) {
    if (!arrayBuffer || arrayBuffer.byteLength < 3) {
        return false;
    }
    
    const view = new Uint8Array(arrayBuffer);
    const header = new DataView(arrayBuffer);
    
    // 检查magic number
    if (view[0] !== 0x1F || view[1] !== 0x8B) {
        return false;
    }
    
    // 检查压缩方法(应该是DEFLATE,即0x08)
    const compressionMethod = view[2];
    if (compressionMethod !== 0x08) {
        console.warn('Gzip found but with non-DEFLATE compression method:', compressionMethod);
        return false;
    }
    
    return true;
}

@deyihu deyihu changed the title feat:VT tile data support gzip decode by 'loadTileDecodeGZip' feat:VT tile data support gzip decode Jan 16, 2026
@fuzhenn
Copy link
Member

fuzhenn commented Jan 16, 2026

是否可以用 DecompressionStream (chrome 80版开始支持)来解压gzip数据?
这样可以省掉gunzip.min.js,性能应该也会更好一些。

@deyihu
Copy link
Collaborator Author

deyihu commented Jan 16, 2026

是否可以用 DecompressionStream (chrome 80版开始支持)来解压gzip数据? 这样可以省掉gunzip.min.js,性能应该也会更好一些。

不好搞:

  • 要动ajax的请求过程
  • DecompressionStream 是按流的方式来解压的,提前是知道文件已经是gzip压缩的,而目前我们并不知道pbf文件是否压缩过了,而是请求完了才判断的

@fuzhenn
Copy link
Member

fuzhenn commented Jan 16, 2026

问了一下deepseek,可通过blob来实现:

javascript
async function decompressGzipWithBlob(compressedArrayBuffer) {
  try {
    // 创建解压缩流
    const decompressionStream = new DecompressionStream('gzip');
    
    // 创建 Blob 并获取可读流
    const blob = new Blob([compressedArrayBuffer]);
    const readableStream = blob.stream();
    
    // 管道传输
    const decompressedStream = readableStream.pipeThrough(decompressionStream);
    
    // 转换为响应并获取数据
    const response = new Response(decompressedStream);
    const result = await response.arrayBuffer();
    
    return result;
  } catch (error) {
    console.error('解压失败:', error);
    throw error;
  }
}

@fuzhenn fuzhenn merged commit 6bed9a4 into maptalks:master Jan 16, 2026
2 of 3 checks passed
@deyihu deyihu deleted the vt-support-decodegzip branch January 17, 2026 03:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants