mirror of https://gitee.com/antv-l7/antv-l7
171 lines
4.2 KiB
TypeScript
171 lines
4.2 KiB
TypeScript
import {
|
|
LineLayer,
|
|
MapboxScene,
|
|
Marker,
|
|
PolygonLayer,
|
|
Popup,
|
|
} from '@antv/l7-react';
|
|
import * as React from 'react';
|
|
|
|
function joinData(geodata: any, ncovData: any) {
|
|
const ncovDataObj: any = {};
|
|
ncovData.forEach((item: any) => {
|
|
const {
|
|
countryName,
|
|
countryEnglishName,
|
|
currentConfirmedCount,
|
|
confirmedCount,
|
|
suspectedCount,
|
|
curedCount,
|
|
deadCount,
|
|
} = item;
|
|
if (countryName === '中国') {
|
|
if (!ncovDataObj[countryName]) {
|
|
ncovDataObj[countryName] = {
|
|
countryName: 0,
|
|
countryEnglishName,
|
|
currentConfirmedCount: 0,
|
|
confirmedCount: 0,
|
|
suspectedCount: 0,
|
|
curedCount: 0,
|
|
deadCount: 0,
|
|
};
|
|
} else {
|
|
ncovDataObj[countryName].currentConfirmedCount += currentConfirmedCount;
|
|
ncovDataObj[countryName].confirmedCount += confirmedCount;
|
|
ncovDataObj[countryName].suspectedCount += suspectedCount;
|
|
ncovDataObj[countryName].curedCount += curedCount;
|
|
ncovDataObj[countryName].deadCount += deadCount;
|
|
}
|
|
} else {
|
|
ncovDataObj[countryName] = {
|
|
countryName,
|
|
countryEnglishName,
|
|
currentConfirmedCount,
|
|
confirmedCount,
|
|
suspectedCount,
|
|
curedCount,
|
|
deadCount,
|
|
};
|
|
}
|
|
});
|
|
const geoObj: any = {};
|
|
geodata.features.forEach((feature: any) => {
|
|
const { name } = feature.properties;
|
|
geoObj[name] = feature.properties;
|
|
const ncov = ncovDataObj[name] || {};
|
|
feature.properties = {
|
|
...feature.properties,
|
|
...ncov,
|
|
};
|
|
});
|
|
return geodata;
|
|
}
|
|
|
|
export default React.memo(function Map() {
|
|
const [data, setData] = React.useState();
|
|
React.useEffect(() => {
|
|
const fetchData = async () => {
|
|
const [geoData, ncovData] = await Promise.all([
|
|
fetch(
|
|
'https://gw.alipayobjects.com/os/bmw-prod/e62a2f3b-ea99-4c98-9314-01d7c886263d.json',
|
|
).then((d) => d.json()),
|
|
fetch(
|
|
'https://gw.alipayobjects.com/os/bmw-prod/55a7dd2e-3fb4-4442-8899-900bb03ee67a.json',
|
|
).then((d) => d.json()),
|
|
]);
|
|
setData(joinData(geoData, ncovData.results));
|
|
};
|
|
fetchData();
|
|
}, []);
|
|
return (
|
|
<>
|
|
<MapboxScene
|
|
map={{
|
|
center: [110.19382669582967, 50.258134],
|
|
pitch: 50,
|
|
style: 'blank',
|
|
zoom: 1,
|
|
}}
|
|
style={{
|
|
position: 'absolute',
|
|
top: 0,
|
|
left: 0,
|
|
right: 0,
|
|
bottom: 0,
|
|
}}
|
|
>
|
|
{data && [
|
|
<PolygonLayer
|
|
key={'1'}
|
|
options={{
|
|
autoFit: true,
|
|
}}
|
|
source={{
|
|
data,
|
|
}}
|
|
scale={{
|
|
values: {
|
|
confirmedCount: {
|
|
type: 'quantile',
|
|
},
|
|
},
|
|
}}
|
|
active={{
|
|
option: {
|
|
color: '#0c2c84',
|
|
},
|
|
}}
|
|
color={{
|
|
field: 'confirmedCount',
|
|
values: (count) => {
|
|
return count > 10000
|
|
? '#b10026'
|
|
: count > 1000
|
|
? '#e31a1c'
|
|
: count > 500
|
|
? '#fc4e2a'
|
|
: count > 100
|
|
? '#fd8d3c'
|
|
: count > 10
|
|
? '#feb24c'
|
|
: count > 1
|
|
? '#fed976'
|
|
: 'rgb(255,255,255)';
|
|
},
|
|
}}
|
|
shape={{
|
|
values: 'extrude',
|
|
}}
|
|
size={{
|
|
field: 'confirmedCount',
|
|
values: [0, 200000, 600000, 800000, 1000000],
|
|
}}
|
|
style={{
|
|
opacity: 1,
|
|
}}
|
|
/>,
|
|
<LineLayer
|
|
key={'2'}
|
|
source={{
|
|
data,
|
|
}}
|
|
size={{
|
|
values: 0.6,
|
|
}}
|
|
color={{
|
|
values: '#aaa',
|
|
}}
|
|
shape={{
|
|
values: 'line',
|
|
}}
|
|
style={{
|
|
opacity: 1,
|
|
}}
|
|
/>,
|
|
]}
|
|
</MapboxScene>
|
|
</>
|
|
);
|
|
});
|