You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dashboard/src/components/MapCountry.jsx

137 lines
3.7 KiB
JavaScript

import { useContext, useState, useEffect, useMemo } from 'react';
import { observer } from 'mobx-react';
import { ChoroplethMap } from '@ant-design/maps';
import { dataFieldAlias } from '../libs/ht';
import { cloneDeep } from '../utils/commons';
export default observer((props) => {
const { dataSource, sourceField, valueField, containerNode, ...extConfig } = props;
const [mdataSource, setMdataSource] = useState([]);
useEffect(() => {
const dataMapped = (cloneDeep(dataSource) || []).reduce((r, v) => ({...r,
[(v[sourceField] || '_').replace('(待删除)', '')]: v
}), {});
if (dataMapped?.['中国']) {
dataMapped['中国'][sourceField] = '中华人民共和国';
}
setMdataSource(Object.values(dataMapped));
return () => {};
}, [dataSource, valueField]);
const config = {
container: containerNode || '#topC',
map: {
// type: 'amap',
type: 'mapbox',
// style: 'blank',
center: [120.19382669582967, 30.258134],
zoom: 2,
pitch: 0,
// scrollZoom: false,
// dragPan: false,
// zoomEnable: false,
// token: 'd78b5ba25a4699a1cb567b7a933e630b', // amap
},
// geoArea: {
// url: 'https://gw.alipayobjects.com/os/alisis/geo-data-v0.1.2/choropleth-data',
// type: 'topojson',
// },
source: {
data: mdataSource.filter((ele) => ele[sourceField] && ele[valueField] !== 0 ),
joinBy: {
geoField: 'name',
sourceField: sourceField || 'name',
},
},
autoFit: true,
color: {
field: valueField || 'value',
value: [
'#820C1B',
'#a31022',
'#ac2738',
'#b53f4e',
'#be5764',
'#c76f7a',
'#d18790',
'#da9fa6',
'#e3b7bc',
'#eccfd2',
'#f5e7e8',
'#fde7ea',
// '#8a1313',
// '#ad1818',
// '#b52f2f',
// '#bd4646',
// '#c55d5d',
// '#cd7474',
// '#d68b8b',
// '#dea2a2',
// '#e6b9b9',
// '#eed0d0',
// '#f6e7e7',
// '#fde7ea',
// '#001D70',
// '#0047A5',
// '#1A4397',
// '#2555B7',
// '#3165D1',
// '#3D76DD',
// '#467BE8',
// '#6296FE',
// '#7EA6F9',
// '#98B7F7',
// '#BDD0F8',
// '#DDE6F7',
// '#F2F5FC'
].reverse(),
scale: { type: 'quantile' },
},
viewLevel: {
// level: 'country',
// adcode: '100000',
// granularity: 'province',
level: 'world',
adcode: 'all',
granularity: 'country',
},
chinaBorder: false,
style: {
opacity: 1,
stroke: '#fff',
lineWidth: 0.6,
lineOpacity: 1,
},
state: {
active: {
stroke: 'yellow',
lineWidth: 0.6,
// lineOpacity: 0.8,
},
},
label: {
visible: true,
field: 'name',
style: {
fill: '#000',
opacity: 0.8,
fontSize: 10,
stroke: '#fff',
strokeWidth: 1.5,
textAllowOverlap: false,
padding: [8, 8],
},
},
tooltip: {
items: ['name', { field: valueField, alias: dataFieldAlias[valueField].alias, customValue: (v) => dataFieldAlias[valueField].formatter(v) }],
},
zoom: false,
legend: false,
};
return <ChoroplethMap {...config} />;
});