antv-l7/dev-demos/features/tile/rasterData/loadImage.tsx

92 lines
2.4 KiB
TypeScript

//@ts-ignore
import { Scene, RasterLayer } from '@antv/l7';
//@ts-ignore
import { Map } from '@antv/l7-maps';
import React, { useEffect } from 'react';
export default () => {
useEffect(() => {
const scene = new Scene({
id: 'map2',
map: new Map({
center: [105.732421875, 32.24997445586331],
pitch: 0,
style: 'dark',
zoom: 2,
}),
});
const canvas = document.createElement('canvas');
canvas.width = 256;
canvas.height = 256;
const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;
scene.on('loaded', () => {
const layer = new RasterLayer();
layer
.source(
'http://webst0{1-4}.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}',
{
parser: {
type: 'rasterTile',
dataType: 'arraybuffer',
tileSize: 256,
zoomOffset: 0,
extent: [-180, -85.051129, 179, 85.051129],
minZoom: 0,
format: async (data: any) => {
const blob: Blob = new Blob([new Uint8Array(data)], {
type: 'image/png',
});
const img = await createImageBitmap(blob);
ctx.clearRect(0, 0, 256, 256);
ctx.drawImage(img, 0, 0, 256, 256);
const imgData = ctx.getImageData(0, 0, 256, 256).data;
const arr: number[] = [];
for (let i = 0; i < imgData.length; i += 4) {
const R = imgData[i];
arr.push(R);
}
return {
rasterData: arr,
width: 256,
height: 256,
};
},
},
},
)
.style({
domain: [0, 255],
clampLow: true,
rampColors: {
colors: [
'#f7fcf5',
'#e5f5e0',
'#c7e9c0',
'#a1d99b',
'#74c476',
'#41ab5d',
'#238b45',
'#006d2c',
'#00441b',
],
positions: [0, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 1.0],
},
});
scene.addLayer(layer)
});
}, []);
return (
<div
id="map2"
style={{
height: '500px',
position: 'relative',
}}
/>
);
};