D3.js 使用geojson绘制地图

  • 前言
    • 初始化项目
    • 获取数据并绘图
      • http请求数据
      • 定义坐标并绘图
    • 总结

前言

利用geojson文件或者类似包含对象属性和坐标(只要坐标是在统一参考系下)的文件利用SVG绘图无非是以下思路:
1、准备源数据和DOM
2、根据源数据和节点尺寸计算比例尺
3、根据比例尺重新将源坐标数据格式化到DOM对应位置
4、利用SVG绘制点(Point)、线(Poluline)、面(Polygon)等元素
工具的使用熟悉即可。这里谈一下比例尺的计算,简单思路,获取原始坐标的范围(Extent),Extent包含Xmin,Ymin,Xmax,Ymax四个坐标,再将之于DOM的范围即[[0,0],[0,height],[width,height],[width,0]]做等比换算。
而上述内容,当我们认识到D3后便知道不再需要考虑这么多细节,甚至比例尺只需要d3.scale.linear()就基本足以解决了。
话不多说,开撸。

初始化项目

先确保你已经正确安装配置了nodejs,然后随便找到你准备新建项目的文件夹,开打命令行执行以下命令:

npm init -y
npm install d3@3.5.17 --save
npm install d3-geo --save
npm install lite-server -g

安装完毕后在该文件夹下新建index.html和app.js,并添加相应的引用:

 <!--  index.html-->
<!DOCTYPE html>
<html><head><meta charset="utf-8"><meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no"><title>d3 with geoJson</title></head><body><script src="node_modules/d3//d3.min.js"> </script><script src="node_modules/d3-geo/dist/d3-geo.min.js"></script><script src="node_modules/d3-array/dist/d3-array.min.js"></script><script src="app.js"></script><style>.main {height: 800px;width: 100%;}</style><!-- 动作提示 --><div id="tips" style="bottom:100px;left: 0;position:absolute;height: 100px;width:100px"></div><!--  绘图容器 --><svg id='map' class="main"></svg><hr><!-- 操作日志 --><div id='log'></div></body>
</html>

app.js就先空着,一会再说。
新建文件夹assets,在assets下再新建文件夹geoJson,然后去下载需要的geojson文件放在这里。你的项目结构现在看来至少是这样的:

项目准备就先这样,继续往下。

获取数据并绘图

http请求数据

这里直接用原生Http方式请求数据:

const Http = new XMLHttpRequest();
var url = './assets/geoJson/china.json';
//获取Geojson文件,避免回调嵌套换行太多,这里直接返回一个promise
function getGeoData() {return new Promise(function (resolve, reject) {Http.open("get", url);Http.send();Http.onreadystatechange = function () {if (Http.readyState == 4 && Http.status == 200) {resolve(JSON.parse(Http.responseText))}}})
}

关于Http和Promise的知识可以直接点击它们跳转,此处不再赘述。

定义坐标并绘图

定义一个绘图方法,接收传入的参数并将所有元素在目标DOM节点上绘制。

var containerWidth = 0;
var containerHeight = 0;
function draw(nodes) {//墨卡托坐标系let projection = d3.geoMercator()//坐标映射projection.fitExtent([[0, 0],[containerWidth, containerHeight]], nodes);let path = d3.geoPath(projection);//绘图let polygonNode = svg.selectAll("path").data(nodes.features).enter().append("path").attr("d", path)}

回到packge.json所在文件夹,输入

lite-serve

浏览器自动打开后,这个时候你应该看到下图所示的东西:

这个看起来确实是难看了点,我们再直接用链式语法给元素定义各类属性和样式:

//链式语法定义属性和样式var polygonNode = svg.selectAll("path").data(nodes.features).enter().append("path").attr("d", path).attr("fill", "grey").attr('opacity', 0.5).attr('stroke', 'yellow').attr('stroke-width', function (d) {return 1})

当然,除了上面这些,你还可以给各元素添加事件。
完整代码和其他内容请移步我的GITHUB。

总结

简单说一下上述内容用到的东西。
1、npm新建项目
2、http请求数据(JSON)
3、d3选择器
4、d3.geo
5、其他
以上内容不过前端冰山一角,甚至对于d3.js而言也不过万中其一,且行且学。
千里之行,始于足下。

D3.js 使用geojson绘制地图相关推荐

  1. Three.js之GeoJson 3D地图数据可视化飞行线实战

    Three.js之GeoJson 3D地图数据可视化飞行线实战 GeoJSON是一种对各种地理数据结构进行编码的格式,基于Javascript对象表示法的地理空间信息数据交换格式.GeoJSON对象可 ...

  2. d3.js 7×6 日历绘制 附加单格背景

    d3.js 7×6 日历绘制 附加单格背景 先来个效果图 减少错进者的时间 时间对于我们来说太宝贵了 先来个效果图 减少错进者的时间 时间对于我们来说太宝贵了 ** 第一次写文章 不喜欢请喷我 您的支 ...

  3. d3.js——箭头的绘制

    首先我们要明白如何在svg中进行箭头的绘制: 先写一对<defs>,里面再写一对<marker>,其中marker的属性意义为: viewBox 坐标系的区域 refX, re ...

  4. js 使用 canvas 绘制地图路线

    使用 canvas 绘制 跟随鼠标自定义路线 或 点使用贝塞尔曲线 自动绘制 示例使用 angular 可自行修改 核心代码不变 基础 html 参考 <div class="cont ...

  5. leaflet 结合 d3.js 实现 geojson 数据地形剖面分析(附源码下载)

    前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...

  6. three.js SVG 学习绘制三维地图

    three.js SVG 学习绘制地图 https://www.js-css.cn/jscode/other/other43/ 找到一个不错的资源,不过每个省份的svg数据太小了,不精确. 主要的是这 ...

  7. d3.js折线图_学习使用D3.js创建折线图

    d3.js折线图 by Sohaib Nehal 通过Sohaib Nehal 学习使用D3.js创建折线图 (Learn to create a line chart using D3.js) 使用 ...

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

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

  9. d3js mysql_使用D3.js绘制地图并打点

    本篇简单介绍一下使用D3.js绘制地图,并更具经纬度在地图打点.最后根据点生成voronoi图及其三角网. 下载地图geoJson文件 去网上下载要绘制地图的geoJson文件. 使用d3.json( ...

最新文章

  1. Static interface methods are only supported starting with Android N (--min-api 24): void okhttp3.log
  2. IT运维服务管理中知识
  3. 爱酷pro充电测试软件,iQOO 5 Pro续航、充电测试简报
  4. 2012年度IT博客大赛10强花落谁家暨圆满落幕
  5. 关于windows消息机制的猜想
  6. 二叉树、树和有序树的区别
  7. 音视频开发(Anychat如何改善音视频通话过程中的用户体验)
  8. Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile 解决办法
  9. 我的世界1.12.2java下载_我的世界1.12.2.2中文版下载 我的世界1.12.2.2中文版单机游戏下载...
  10. 基于微信驾校考试小程序系统设计与实现 开题报告
  11. 小马过河(计算几何)
  12. 【解决方案】国标GB28181视频监控平台国标流媒体服务器EasyGBS如何实现安保行业日常巡查视频监控系统解决方案?
  13. 淘宝开放平台技术历程----学习转载
  14. 20个最受欢迎商务旅游城市:纽约连续四年拿第一,上海第四
  15. 苹果蓝牙连接不上是什么原因_无线网连接不上 原因很多,总有一个办法解决你的问题...
  16. jquery $.each(data, function (index, value) { }
  17. OpenCV Error: Unspecified error (could not find a writer for the specified extension) in imwrite
  18. Oracle常用命令(一)
  19. Mac平台直播推流搭建
  20. 仿QQ弹出窗口 gggggggggggg

热门文章

  1. 程序员这条路很艰难,你会坚持走下去吗?
  2. GIT:解决 fatal: refusing to merge unrelated historie
  3. Java漫谈---Java中的初始化
  4. 小红伞误报病毒。误删了userinit.exe。使用USB启动技术修复。
  5. 2021计算机专业笔记本推荐,2021适合学生的笔记本电脑推荐
  6. Charles设置手机拦截
  7. Scrapy 小白自学笔记
  8. TabLayout中如何设置tab不选中
  9. PHPExcel快速入门
  10. 食品行业数字化解决方案