gallery/story/yidaiyilu2

Example page

import { Control, DOM, LayerPopup, LineLayer, PolygonLayer, Scene } from '@antv/l7';
import { GaodeMap } from '@antv/l7-maps';
const styleElement = document.createElement('style');

// 在<style>元素中添加样式规则
styleElement.textContent = `
            .info {
                padding: 6px 8px;
                font: 14px/16px Arial, Helvetica, sans-serif;
                background: white;
                background: rgba(255,255,255,0.8);
                box-shadow: 0 0 15px rgba(0,0,0,0.2);
                border-radius: 5px;
            }
            .info h4 {
                margin: 0 0 5px;
                color: #777;
            }
              .legend {
                line-height: 18px;
                color: #555;
            }
            .legend i {
                width: 40px;
                height: 20px;
                float: left;
                margin-top: 5px;
                margin-right: 0px;
                opacity: 1;
                color: #000;
                font-weight: bold;
            }
            `;

// 将<style>元素添加到<head>元素中,实现样式注入
document.head.appendChild(styleElement);

const scene = new Scene({
  id: 'map',
  map: new GaodeMap({
    style: 'light',
    center: [116.368652, 39.93866],
    zoom: 0,
    maxZoom: 5,
    token: '6f025e700cbacbb0bb866712d20bb35c',
  }),
});
function getColor(d, color) {
  return d > 100000
    ? color[4]
    : d > 10000
      ? color[3]
      : d > 5000
        ? color[2]
        : d > 1000
          ? color[1]
          : d > 0
            ? color[0]
            : 'rgba(0,0,0,0)';
}
scene.on('loaded', async () => {
  const data = await (
    await fetch(
      'https://mdn.alipayobjects.com/afts/file/A*6dU9SL6RD8IAAAAAAAAAAAAADrd2AQ/world_gdp.json',
    )
  ).json();
  const data_line = await (
    await fetch(
      'https://mdn.alipayobjects.com/afts/file/A*5NgLQrPivBgAAAAAAAAAAAAADrd2AQ/line_2.json',
    )
  ).json();

  const features_1 = data.features.filter((fe) => fe.properties.flag === true);
  const features_2 = data.features.filter((fe) => fe.properties.flag === false);
  const layer1 = new PolygonLayer({})
    .source({
      type: 'FeatureCollection',
      features: features_1,
    })
    .color('gdp', ['#fdd49e', '#fdbb84', '#fc8d59', '#e34a33', '#b30000'])
    .shape('fill')
    .scale('gdp', {
      type: 'threshold',
      domain: [0, 1000, 5000, 10000, 100000, 300000],
    })
    .active(false)
    .style({
      opacity: 0.6,
    });

  const layer2 = new PolygonLayer({})
    .source({
      type: 'FeatureCollection',
      features: features_2,
    })
    .color('gdp', ['#c7e9b4', '#7fcdbb', '#41b6c4', '#2c7fb8', '#253494'])
    .shape('fill')
    // .filter('flag',flag=>!falg)
    .scale('gdp', {
      type: 'threshold',
      domain: [0, 1000, 5000, 10000, 100000, 300000],
    })
    .style({
      opacity: 0.6,
    })

    .active(false);
  const lineLayer = new LineLayer()
    .source(data_line)
    .filter('type', (t) => {
      return t === '11' || t === '1';
    })
    .color('#09f')
    .size(0.6)
    .shape('line')
    .style({
      lineType: 'dash',
      dashArray: [3, 3],
    });

  const lineLayer2 = new LineLayer()
    .source(data_line)
    .filter('type', (t) => {
      return t === '10';
    })
    .color('#09f')
    .size(0.6)
    .shape('line')
    .style({
      lineType: 'dash',
      dashArray: [2, 2],
    });

  const lineLayer3 = new LineLayer()
    .source(data_line)
    .filter('type', (t) => {
      return t === '0' || t === '9' || t === '7' || t === '2';
    })
    .color('type', (t) => {
      return t === '0' ? 'red' : t === '9' || t === '2' ? '#09f ' : '#fff';
    })
    .size(0.8)
    .shape('line');

  // const lineLayer4 = new LineLayer().source(data_line).filter('type',(t)=>{
  //     return t === '0'
  // }).color('red').size(1).shape('line').style();
  const layerPopup1 = new LayerPopup({
    items: [
      {
        layer: layer1,
        fields: [
          {
            field: 'NAME_CHN',
            formatField: () => '国家',
          },
          {
            field: 'gdp',
            formatField: () => 'GDP',
            formatValue: (val) => {
              return val < 0.00001 ? `${val * 10000 * 10000}美元` : `${val.toFixed(2)}亿美元`;
            },
          },
          {
            field: 'industries',
            formatField: () => '行业',
            formatValue: (val) => {
              return val || '';
            },
          },
          {
            field: 'relations',
            formatField: () => '关系',
            formatValue: (val) => {
              return val || '';
            },
          },
        ],
      },
    ],
  });
  const layerPopup2 = new LayerPopup({
    items: [
      {
        layer: layer2,
        fields: [
          {
            field: 'NAME_CHN',
            formatField: () => '国家',
          },
          {
            field: 'gdp',
            formatField: () => 'GDP',
            formatValue: (val) => {
              return val < 0.00001 ? `${val * 10000 * 10000}美元` : `${val.toFixed(2)}亿美元`;
            },
          },
        ],
      },
    ],
  });

  scene.addPopup(layerPopup1);
  scene.addPopup(layerPopup2);

  scene.addLayer(layer1);
  scene.addLayer(layer2);
  scene.addLayer(lineLayer);
  scene.addLayer(lineLayer2);
  scene.addLayer(lineLayer3);

  const legend = new Control({ position: 'bottomright' });
  // 0, 1000, 5000, 10000, 100000, 300000
  legend.onAdd = () => {
    var div = DOM.create('div', 'info legend'),
      grades = [0, 1000, 5000, 10000, 100000, -999],
      grades2 = [0, '1千', '5千', '1万', '10万', '30万/亿美元'];

    // loop through our density intervals and generate a label with a colored square for each interval

    for (var i = 0; i < grades.length; i++) {
      if (i < grades.length - 1) {
        div.innerHTML +=
          '<i style="background:' +
          getColor(grades[i] + 1, ['#c7e9b4', '#7fcdbb', '#41b6c4', '#2c7fb8', '#253494']) +
          '"></i>';
      } else {
        div.innerHTML +=
          '<i style=" width: 100px; margin-left: 10px; background:' +
          getColor(grades[i] + 1, ['#c7e9b4', '#7fcdbb', '#41b6c4', '#2c7fb8', '#253494']) +
          '">非一带一路国家</i>';
      }
    }
    div.innerHTML += '<br>';
    for (let i = 0; i < grades.length; i++) {
      if (i < grades.length - 1) {
        div.innerHTML +=
          '<i style="background:' +
          getColor(grades[i] + 1, ['#fdd49e', '#fdbb84', '#fc8d59', '#e34a33', '#b30000']) +
          '"></i>';
      } else {
        div.innerHTML +=
          '<i style=" width: 100px; margin-left: 10px; background:' +
          getColor(grades[i] + 1, ['#c7e9b4', '#7fcdbb', '#41b6c4', '#2c7fb8', '#253494']) +
          '">一带一路国家</i>';
      }
    }
    div.innerHTML += '<br>';

    for (let i = 0; i < grades2.length; i++) {
      if (i < grades.length - 1) {
        div.innerHTML += `<i>${grades2[i]}</>`;
      } else {
        div.innerHTML += `<i style=" width: 100px;">${grades2[i]}</>`;
      }
    }
    return div;
  };

  scene.addControl(legend);
});