我的个人博客是:www.ourd3js.com

csdn博客为:blog.csdn.net/lzhlzz

转载请注明出处。谢谢。


本节是结合9.2节 和10节 的内容制作的一个可力学导向的中国地图,用户能够拖动中国的各个省份。

数据用的是 10.1节 中简化的中国地图文件: china_simplify.json

1. 定义各函数

  var projection = d3.geo.mercator().center([107, 31]).scale(850).translate([width/2, height/2]);var path = d3.geo.path().projection(projection);var force = d3.layout.force().size([width, height]);var color = d3.scale.category20();

projection 函数是用于将三维地图的坐标投影到二维所用的投影函数。详细可见: 10节

path 函数用于绘制地图路径,里面要传入投影函数 projection 。详细可见: 10节

force 是定义力学图的 layout 。详细可见: 9.2节

color 是颜色函数。

2. 读取数据

d3.json("china_simplify.json", function(error, root) {if (error) return console.error(error);console.log(root.features);
}

和前几节一样,用 d3.json() 读取文件,后面两句是用于检測错误,以及输出错误信息。

3. 转换数据

      var nodes = [];var links = [];root.features.forEach(function(d, i) {var centroid = path.centroid(d);centroid.x = centroid[0];centroid.y = centroid[1];centroid.feature = d;nodes.push(centroid);});var triangles = d3.geom.voronoi().triangles(nodes);triangles.forEach(function(d,i){links.push( edge( d[0] , d[1] ) );links.push( edge( d[1] , d[2] ) );links.push( edge( d[2] , d[0] ) );});

读取后的文件信息都存在变量 root 中,上面的代码是将 root 中的数据分别转换为力学图所须要的点和线。存在变量 nodes 和 links 中。
    第1-2行: 定义变量 nodes 和 links

第4-10行: 对于 root.features 中存有每个省的数据, root.features.forEach() 即对每个省的数据。运行后面的无名函数。函数里面是计算出各省的中点,保存在 centroid.x 和 centroid.y 中,再把其它信息赋值给 centroid.feature。最后插入到 nodes 中。

第12行: 对 nodes 中的顶点进行三角剖分。即用三角形来连接各顶点。结果保存在 triangles 中。

第14-18行: 将三角形的各边存到 links 变量中。当中的 edge 函数的实现为:

   function edge(a, b) {var dx = a[0] - b[0], dy = a[1] - b[1];return {source: a,target: b,distance: Math.sqrt(dx * dx + dy * dy)};}

4. 绘制地图

       force.gravity(0).charge(0).nodes(nodes).links(links).linkDistance(function(d){ return d.distance; }).start();var node = svg.selectAll("g").data(nodes).enter().append("g").attr("transform", function(d) { return "translate(" + -d.x + "," + -d.y + ")"; }).call(force.drag).append("path").attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }).attr("stroke","#000").attr("stroke-width",1).attr("fill", function(d,i){return color(i);}).attr("d", function(d){return path(d.feature);} );var link = svg.selectAll("line").data(links).enter().append("line").attr("class","link").attr("x1",function(d) { return d.source.x; } ).attr("y1",function(d) { return d.source.y; } ).attr("x2",function(d) { return d.target.x; } ).attr("y2",function(d) { return d.target.y; } );

第1-6行: 设定 force 的各參数进行设定。
    第8-22行: 绘制各顶点。即中国各省。当中要注意。第11行和第14行,是全然相反的两个平移函数,不错,这么做就是为了移过去,再移回来,即初始时显示的是各省拼成的完整的地图且显示在最初设定的位置,由于拖拽的过程中变化的量是 d.x 和 d.y 。所以要这么做。

这里有点难理解,请好好体会一下,如有疑问,请在以下留言。另外。第12行是调用 force.drag 函数。

第24-32行: 绘制连接各省的线条。

5. 力学图的结合

        force.on("tick", function() {link.attr("x1", function(d) { return d.source.x; }).attr("y1", function(d) { return d.source.y; }).attr("x2", function(d) { return d.target.x; }).attr("y2", function(d) { return d.target.y; });node.attr("transform", function(d) {return "translate(" + d.x + "," + d.y + ")";});});

这里和 9.2节 一样,tick 指的是时间间隔,也就是每个时间间隔之后就刷新一遍画面。刷新的内容写在后面的无名函数 function 中, function 函数中写上作图的内容。

这里看到了吧。第7-9行里是用于平移的,平移的參数为 d.x 和 d.y 。

结果图:


拖动试试吧。哈哈:

自己用鼠标试试吧,点击以下的链接,完整代码请右键点击浏览器后选择查看:

http://www.ourd3js.com/demo/mapforce.html

感谢您的阅读。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4667383.html,如需转载请自行联系原作者

【 D3.js 入门系列 --- 10.2 】 你可以拖动地图相关推荐

  1. 【 D3.js 入门系列 --- 10 】 地图的绘制

    地图的制作在 D3 中可以说是最重要的一环.因为在进行数据可视化时,很多情况都会和地图联系在一起,如中国各省的人口多少,GDP多少等,都可以和地图联系在一起. D3 中制作地图所需要的文件问 JSON ...

  2. 【 D3.js 入门系列 --- 2 】 怎样使用数据和选择元素

    本人的个人博客首页为: http://www.ourd3js.com/  ,csdn博客首页为:http://blog.csdn.net/lzhlzz/. 转载请注明出处,谢谢. 接着上一讲的内容,这 ...

  3. 【 D3.js 入门系列 --- 7 】 理解 update, enter, exit 的使用

    本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 在前面几节中重复出现了例如以下代码: svg.selectAll ...

  4. 【 D3.js 入门系列 --- 9 】 常见可视化图形

    本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. Layout ,直译为"布局,安排".但在 ...

  5. 【 D3.js 入门系列 --- 4 】 怎样使用scale(比例)

    本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 在上一节中使用了一个非常重要的概念 - scale (这个不知道 ...

  6. 【 D3.js 进阶系列 】 进阶总结

    进阶系列的文章从去年10月开始写的,晃眼又是4个多月了,想在年前总结一下. 首先恭祝大家新年快乐.今年是羊年吧.前段时间和朋友聊天,聊到十二生肖里为什么没猫,我张口就道:不是因为十二生肖开会的时候猫迟 ...

  7. d3.js 入门指南 - 仪表盘

    D3的全称是Data-Driven Documents(数据驱动的文档),是一个用来做数据可视化的JavaScript函数库,而JavaScript文件的后缀通常为.js,所以D3被称为D3.js. ...

  8. 数据可视化js框架 d3.js入门

    数据可视化js框架 d3.js入门 [一] 选择元素绑定数据 1.下载.引入d3.js 2.d3.select():选择所有指定元素的第一个 3.d3.selectAll() :选择指定元素的全部 e ...

  9. 视频教程-零基础JS入门系列课程(2)之JS语法基础精讲-JavaScript

    零基础JS入门系列课程(2)之JS语法基础精讲 螺钉课堂讲师,擅长Vue.React.ReactNative.NodeJS等前端框架及技术 邓老师 ¥59.00 立即订阅 扫码下载「CSDN程序员学院 ...

最新文章

  1. 事务管理最佳实践多余的话之一“每次请求,一次数据库连接,一次事务”是不是金科玉律?...
  2. 华月互网获得2012全国十大IDC服务商
  3. c语言影碟出租程序设计总结,vc++影碟出租系统的设计与开发
  4. C++ Primer 5th笔记(chap 16 模板和泛型编程)类型无关和模板编译
  5. mysql中group by 的用法解析
  6. 第三篇 12306自动刷票下单-下单
  7. Docker最全教程之使用 Visual Studio Code玩转Docker(二十一)
  8. Android之获取证书文件(pfx格式)的公钥和私钥
  9. Arduino Uno + Lora shield rf95_server 提示错误“Init failed!”
  10. 30 友盟项目---体会篇
  11. 文件同步工具GoodSync
  12. 从零基础入门Tensorflow2.0 ----一、1.1 实战分类模型(fashion_mnsit数据集,数据读取与展示)
  13. 修改Oracle密码
  14. 制图折断线_CAD制图规范及技巧总结大全
  15. 中标麒麟V7安装Qt5.13.0
  16. SVN客户端——SmartSVN功能详解
  17. OPPO以数字普惠金融助力小微企业
  18. 各种Android实现边框
  19. TexturePacker的用法
  20. 计算机答辩提问(小程序/网站)

热门文章

  1. 通过机器学习得到样本的特征权重
  2. 美的集团上半年营收1827亿:净利160亿 狠心批量裁员
  3. tampermonkey油猴插件-tampermonkey油猴插件下载
  4. 外贸出口迷你车载冰箱亚马逊UL2089测试标准
  5. 图像处理(Image Processing) ---------- 灰阶位图分割 (bit-plane slicing)(浮水印)(C#实现)
  6. 江苏师范大学计算机学硕调剂,考研最容易调剂的大学_2016江苏师范大学考研调剂信息已公布...
  7. ctfshow XSS web316~web333
  8. Federated Meta-Learning for Fraudulent Credit Card Detection
  9. Linux命令之创建空文件touch
  10. 007 封包式游戏功能的原理与实现