讲师中心 微信公众号

工具推荐

视频效率加速
Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

剧云
剧云

中文短剧剧本制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

如何在 D3 + Leaflet 地图中按经纬度出现频次缩放圆形标记

浅辰酱_2506

浅辰酱_2506

发布时间:2026-01-11 16:14:24

|

925人浏览过

|

来源于php中文网

原创

如何在 D3 + Leaflet 地图中按经纬度出现频次缩放圆形标记

本文介绍如何将原始经纬度数据按坐标组合频次进行聚合,并动态缩放 svg 圆形标记半径,实现地理热点可视化。核心是使用 d3 的 `d3.group()` 统计重复坐标,再将频次映射为圆半径。

在 D3 与 Leaflet 混合开发中,直接对原始 CSV 数据逐行渲染圆形(如 d3.csv(...).enter().append("circle"))会导致同一位置多次绘制重叠小圆,无法体现“密度”或“热度”。真正有效的解决方案是:先聚合数据,再渲染唯一坐标点,并以频次驱动视觉编码(如半径大小)。

Teams Delegate
Teams Delegate

将Microsoft Teams收件箱管理委托给AI代理,实现自动回复、消息摘要、优先级筛选及情境感知响应。

下载

✅ 正确步骤概览

  1. 加载并预处理数据:使用 d3.csv() 读取数据;
  2. 按经纬度组合分组统计:利用 d3.group() 将相同 [lat, lng] 的记录归为一组;
  3. 生成聚合后的新数据集:每个元素包含 cnt(出现次数)、sub_district_lat、sub_district_long;
  4. 绑定聚合数据并设置半径:将 r 属性设为 d => baseRadius * d.cnt(可进一步用 d3.scaleSqrt() 实现更合理的视觉比例);
  5. 保持地图交互响应性:保留 map.on("moveend", update) 逻辑,确保缩放/拖拽时坐标实时重投影。

? 示例代码(D3 v7 + Leaflet)

// 1. 聚合数据:按 [lat, lng] 字符串键分组
const grouped = d3.group(data, d => 
  `${+d.sub_district_lat.toFixed(6)},${+d.sub_district_long.toFixed(6)}`
);

// 2. 转换为带频次的对象数组
const aggregatedData = Array.from(grouped, ([_, records]) => ({
  cnt: records.length,
  sub_district_lat: +records[0].sub_district_lat,
  sub_district_long: +records[0].sub_district_long
}));

// 3. 创建比例尺(推荐!避免半径随频次线性爆炸)
const radiusScale = d3.scaleSqrt()
  .domain(d3.extent(aggregatedData, d => d.cnt))
  .range([4, 24]); // 最小半径4px,最大24px

// 4. 渲染圆形(注意:绑定 aggregatedData,非原始 data)
d3.select("#mapid")
  .select("svg")
  .selectAll("circle")
  .data(aggregatedData)
  .enter()
  .append("circle")
    .attr("cx", d => map.latLngToLayerPoint([d.sub_district_lat, d.sub_district_long]).x)
    .attr("cy", d => map.latLngToLayerPoint([d.sub_district_lat, d.sub_district_long]).y)
    .attr("r", d => radiusScale(d.cnt)) // ✅ 使用比例尺,更科学
    .style("fill", "#e34a33")
    .attr("stroke", "#b30000")
    .attr("stroke-width", 0.8)
    .attr("fill-opacity", 0.7);

⚠️ 关键注意事项

  • 精度处理:原始经纬度可能存在浮点误差(如 52.52000000000001 vs 52.52),建议先统一保留 5–6 位小数再拼接键,否则相同位置会被视为不同分组;
  • 性能优化:若数据量极大(>10k 条),d3.group() 仍高效,但应避免在 update() 中重复聚合——聚合只需执行一次;
  • 视觉合理性:*切勿直接使用 `r = k cnt线性缩放**。频次差异大时,高频点会过度遮盖邻近区域。d3.scaleSqrt()或d3.scalePow().exponent(0.3)` 更符合人眼对面积的感知;
  • D3 版本兼容性:d3.group() 是 D3 v6+ 新增 API;若必须用 v4/v5,可用 d3.nest() 替代(语法稍冗长);
  • Leaflet SVG 层:确保 L.svg().addTo(map) 在 d3.csv() 前执行,否则 d3.select("svg") 可能为空。

? 总结

将地理点频次映射为视觉尺寸,本质是「数据聚合 → 比例映射 → 坐标投影 → SVG 渲染」四步闭环。抛弃“一个坐标画一个圆”的直觉做法,转向“一个聚合点画一个缩放圆”的分析思维,才能构建真正可读、可扩展、专业的地理热力图。后续还可叠加 d3.tip() 实现悬停显示频次,或用 d3.contourDensity() 生成平滑热力面——但一切始于扎实的频次聚合。

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

更多
append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

618

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1496

2023.11.14

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

3084

2025.09.12

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

730

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

343

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

553

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

323

2025.11.27

PHP 高并发与性能优化
PHP 高并发与性能优化

本专题聚焦 PHP 在高并发场景下的性能优化与系统调优,内容涵盖 Nginx 与 PHP-FPM 优化、Opcode 缓存、Redis/Memcached 应用、异步任务队列、数据库优化、代码性能分析与瓶颈排查。通过实战案例(如高并发接口优化、缓存系统设计、秒杀活动实现),帮助学习者掌握 构建高性能PHP后端系统的核心能力。

20433

2025.10.16

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
svg中文手册
svg中文手册

共0课时 | 0.3万人学习

SVG 教程
SVG 教程

共20课时 | 20.6万人学习

LLVM Programmer’s Manual
LLVM Programmer’s Manual

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn