跳到主要内容

嘉兴市公交线路道路拥堵情况

一个简单的示例

结果
Loading...
实时编辑器
function render(props) {
  const container = useRef(null);

  const data = useBaseUrl('/json/traffic.json');

  const initChat = (map, option) => {
    const chart = new EChartsLayer(option, {
      stopEvent: false,
      hideOnMoving: false,
      hideOnZooming: false,
      forcedPrecomposeRerender: true,
    });

    chart.appendTo(map);
  }

  const init = () => {
    const map = new ol.Map({
      target: container.current,
      view: new ol.View({
        projection: 'EPSG:4326',
        zoom: 12,
        rotation: 0,
        center: [120.76264061813247, 30.74805248565917],
      }),
      layers: [
        new TileLayer({
          source: new XYZ({
            url: 'https://a.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png',
          }),
        }),
      ],
    });

    function convertData(sourceData) {
      return [].concat.apply(
        [],
        sourceData.map((busLine) => {
          let prevPoint = null;
          const points = [];
          const value = busLine.shift();
          for (let i = 0; i < busLine.length; i += 2) {
            let point = [busLine[i], busLine[i + 1]];
            if (i > 0) {
              point = [prevPoint[0] + point[0], prevPoint[1] + point[1]];
            }
            prevPoint = point;
            points.push([point[0] / 1e5, point[1] / 1e5]);
          }
          return {
            value,
            coords: points,
          };
        }),
      );
    }

    fetch(data).then(res => res.json()).then(res => {
      const option = {
        visualMap: {
          type: 'piecewise',
          left: 'right',
          top: 'top',
          min: 0,
          max: 15,
          splitNumber: 5,
          maxOpen: true,
          color: ['red', 'yellow', 'green'],
        },
        tooltip: {
          formatter(params) {
            return `拥堵指数:${params.value}`;
          },
          trigger: 'item',
        },
        series: [
          {
            type: 'lines',
            polyline: true,
            lineStyle: {
              normal: {
                opacity: 1,
                width: 4,
              },
              emphasis: {
                width: 6,
              },
            },
            effect: {
              show: true,
              symbolSize: 2,
              color: 'white',
            },
            data: convertData(res),
          },
        ],
      };

      initChat(map, option);
    })

    function resize(target) {}

    return {
      resize,
    }
  }

  useEffect(() => {
    const { resize } = init();

    return () => {
    };
  }, []);

  return (
    <div className="live-wrap">
      <div ref={container} className="map-content" />
    </div>
  );
}