Preview Updated 2026-05-10

HeatMap 地理热力

Canvas KDE 渲染的地理密度热图,可叠加在 CfMapTile 上;不是日历热力(→ CalendarHeatmap)。

English translation pending This page hasn't been translated yet — falling back to Chinese. PRs welcome on GitHub.

基础用法

输入点位 { lng, lat, weight? },组件用径向渐变核 + 颜色 LUT 在 <canvas> 上画出密度热图。每个点的强度叠加,最终走梯度 stops 着色。

背景 视口
src/App.vue
<script setup lang="ts">
import { CfMapTile, CfHeatMap } from '@chufix-design/maps-vue';

// ~ 600 random weighted points clustered around 4 Chinese megacities.
const centers = [
  { lng: 116.4, lat: 39.9 }, // Beijing
  { lng: 121.5, lat: 31.2 }, // Shanghai
  { lng: 113.3, lat: 23.1 }, // Guangzhou
  { lng: 104.1, lat: 30.7 }, // Chengdu
];
const data: { lng: number; lat: number; weight?: number }[] = [];
for (const c of centers) {
  for (let i = 0; i < 150; i++) {
    data.push({
      lng: c.lng + (Math.random() - 0.5) * 6,
      lat: c.lat + (Math.random() - 0.5) * 4,
      weight: 0.3 + Math.random() * 0.7,
    });
  }
}
</script>
<template>
  <CfMapTile
    :center="{ lng: 112, lat: 32 }"
    :zoom="4"
    :width="720"
    :height="520"
  >
    <CfHeatMap :data="data" :radius="22" :opacity="0.75" />
  </CfMapTile>
</template>
<script setup>
import { CfMapTile, CfHeatMap } from '@chufix-design/maps-vue';

// ~ 600 random weighted points clustered around 4 Chinese megacities.
const centers = [
  { lng: 116.4, lat: 39.9 }, // Beijing
  { lng: 121.5, lat: 31.2 }, // Shanghai
  { lng: 113.3, lat: 23.1 }, // Guangzhou
  { lng: 104.1, lat: 30.7 }, // Chengdu
];
const data= [];
for (const c of centers) {
  for (let i = 0; i < 150; i++) {
    data.push({
      lng: c.lng + (Math.random() - 0.5) * 6,
      lat: c.lat + (Math.random() - 0.5) * 4,
      weight: 0.3 + Math.random() * 0.7,
    });
  }
}
</script>
<template>
  <CfMapTile
    :center="{ lng: 112, lat: 32 }"
    :zoom="4"
    :width="720"
    :height="520"
  >
    <CfHeatMap :data="data" :radius="22" :opacity="0.75" />
  </CfMapTile>
</template>
import { CfHeatMap, CfMapTile } from '@chufix-design/react';

export default function Demo() {
  import { CfMapTile, CfHeatMap } from '@chufix-design/maps-vue';

  // ~ 600 random weighted points clustered around 4 Chinese megacities.
  const centers = [
    { lng: 116.4, lat: 39.9 }, // Beijing
    { lng: 121.5, lat: 31.2 }, // Shanghai
    { lng: 113.3, lat: 23.1 }, // Guangzhou
    { lng: 104.1, lat: 30.7 }, // Chengdu
  ];
  const data: { lng: number; lat: number; weight?: number }[] = [];
  for (const c of centers) {
    for (let i = 0; i < 150; i++) {
      data.push({
        lng: c.lng + (Math.random() - 0.5) * 6,
        lat: c.lat + (Math.random() - 0.5) * 4,
        weight: 0.3 + Math.random() * 0.7,
      });
    }
  }
  return (
    <>
      <CfMapTile center={{ lng: 112, lat: 32 }} zoom={4} width={720} height={520} >
          <CfHeatMap data={data} radius={22} opacity={0.75} />
        </CfMapTile>
    </>
  );
}
import { CfHeatMap, CfMapTile } from '@chufix-design/react';

export default function Demo() {
  import { CfMapTile, CfHeatMap } from '@chufix-design/maps-vue';

  // ~ 600 random weighted points clustered around 4 Chinese megacities.
  const centers = [
    { lng: 116.4, lat: 39.9 }, // Beijing
    { lng: 121.5, lat: 31.2 }, // Shanghai
    { lng: 113.3, lat: 23.1 }, // Guangzhou
    { lng: 104.1, lat: 30.7 }, // Chengdu
  ];
  const data= [];
  for (const c of centers) {
    for (let i = 0; i < 150; i++) {
      data.push({
        lng: c.lng + (Math.random() - 0.5) * 6,
        lat: c.lat + (Math.random() - 0.5) * 4,
        weight: 0.3 + Math.random() * 0.7,
      });
    }
  }
  return (
    <>
      <CfMapTile center={{ lng: 112, lat: 32 }} zoom={4} width={720} height={520} >
          <CfHeatMap data={data} radius={22} opacity={0.75} />
        </CfMapTile>
    </>
  );
}

与 CalendarHeatmap 的区别

HeatMapCalendarHeatmap
输入地理点位 { lng, lat }日历日期 { date, count }
渲染canvas 密度核SVG 格子方块
用途地图密度分析GitHub 风格活跃热力

两者无依赖关系,按场景选择即可。

API

属性类型默认说明
dataHeatPoint[]{ lng, lat, weight? }
geojsonFeatureCollection可选底图
extentMapBounds自动独立投影范围
projection(lng, lat) => {x, y}显式投影
width / heightnumber480 / 280独立使用尺寸
radiusnumber32每个点的核半径 (px)
maxIntensitynumber自动强度上限
gradientArray<{ stop, color }>cool→warm颜色 LUT
opacitynumber0.7整体透明度

反馈与讨论

HeatMap 地理热力 · Discussion

0
0 / 600
正在加载评论...