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

本篇简单介绍一下使用D3.js绘制地图,并更具经纬度在地图打点。最后根据点生成voronoi图及其三角网。

下载地图geoJson文件

去网上下载要绘制地图的geoJson文件。

使用d3.json()加载地图文件,这里为了方便加载我把geoJson文件放在了js文件里。

绘制地图


<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>

    <body>
        <div id="test-svg">
        </div>
    </body>
    <script src="https://d3js.org/d3.v5.js"></script>
    <script type="text/javascript" src="js/china.js"></script>
    <script>
        window.onload = function() {

            var width = 1900,
                height = 800;

            var svg = d3.select("#test-svg")
                .append('svg')
                .attr('width', width + 'px')
                .attr('height', height + 'px');

            /*
             * 创建一个地理投影
             * .center 设置投影中心位置
             * .scale 设置缩放系数
             *
             */
            var projection = d3.geoMercator()
                .center([463, 36])
                .scale(850)
                .translate([width / 2, height / 2]);

            //  创建路径生成器path
            var path = d3.geoPath().projection(projection);

            //  获取GeoJSON数据:这里我放在了js中方便加载
            var features = china.features;

            // 设置颜色值
            var ss2 = d3.schemeSet2;
            var sp2 = d3.schemePastel2;

            /*
             * 渲染地图
             *
             * mouseover 鼠标移入变色
             *
             */
            svg.append('g')
                .attr('class', 'map')
                .selectAll('.china')
                .data(features)
                .enter()
                .append('path')
                .attr('class', 'china')
                .attr("fill", function(d, i) {
                    return ss2[i % 3]
                })
                .attr('d', path)
                .on("mouseover", function(d, i) {
                    d3.select(this)
                      .attr("fill", sp2[i % 3]);
                })
                .on("mouseout", function(d, i) {
                    d3.select(this)
                      .attr("fill", ss2[i % 3]);
                });

        }
    </script>

</html>
  • 绘制效果

地图打点

a) 首先去取一些点

http://geojson.io 在网站上找到我国疆土,标注几个城市,在右边获取到经纬度。

b) 把点坐标放到我们的json中


var points = china.points.features;

            var _points = [];

            for(var i = 0; i < points.length; i++) {

                // 获取经纬度
                var lngLat = points[i].geometry.coordinates;

               // 转为映射在地图上的坐标
                var coo = projection(lngLat);

                _points.push(coo);

                svg.append("circle")
                    .attr("class", "point")
                    .attr("cx", coo[0])
                    .attr("cy", coo[1])
                    .attr("fill", "#ff9")
                    .attr("r", 4);

            }

添加Voronoi图

Voronoi图 又称沃罗诺伊图、泰森多边形,绘制的过程是将点都连起来构成许多三角形,然后利用中垂线找到三角形外心,再将所有外心连接即可。在几何、晶体学、建筑学、地理学、气象学、信息系统等许多领域有广泛的应用。


// 创建voronoi图
            var voronoi = d3.voronoi().extent([
                [0, 0],
                [width, height]
            ]);

            var polygons = voronoi(_points);

            function polygon(d) {
                return "M" + d.join("L") + "Z";
            }

            svg.append('g')
                .attr('class', 'map')
                .selectAll('.country')
                .data(voronoi.polygons(_points))
                .enter()
                .append('path')
                .attr("fill", "none")
                .attr("stroke", "#ff9")
                .attr('class', 'voronoi')
                .attr('d', polygon);

绘制Voronoi图的三角网


// 获取三角网坐标
            var links = voronoi.links(_points);

            for(var i = 0; i < links.length; i++) {
                svg.append('g')
                    .append('line')
                    .attr("stroke", "#ff9")
                    .attr('stroke-dasharray', 10)
                    .attr('class', 'line')
                    .attr('x1', links[i].source[0])
                    .attr('y1', links[i].source[1])
                    .attr('x2', links[i].target[0])
                    .attr('y2', links[i].target[1]);
            }

原文地址:https://www.cnblogs.com/chenjy1225/p/10924293.html

时间: 2024-11-07 07:15:23

使用D3.js绘制地图并打点的相关文章

利用d3.js绘制中国地图

d3.js是一个比较强的数据可视化js工具.利用它画了一幅中国地图,如下图所示: 源码如下: <!DOCTYPE html> <html> <head> <script type="text/javascript" src="d3.js"></script> <script type="text/javascript" src="d3.csv.js">&l

利用d3.js绘制雷达图

利用d3,js将数据可视化,可以做到数据与代码的分离,方便以后修改数据. 这次利用d3.js绘制了一个五维的雷达图,即将多个对象的五种属性在一张图上对比. 数据写入data.csv.数据类型写入type.csv文件. 效果如下图所示 源码连接:http://download.csdn.net/detail/svap1/7358123 使用是只需调用 radar()函数即可,如下是测试页面代码. <!DOCTYPE html> <html> <head> <meta

使用d3.js 绘制交互树

d3.js 中包含了丰富的用于表达树和图的例子: http://d3js.org 以下代码示例中,用于表示交互的树: <!DOCTYPE html> <meta charset="utf-8"> <style> .node { cursor: pointer; } .node circle { fill: #fff; stroke: steelblue; stroke-width: 1.5px; } .node text { font: 10px s

d3.js 绘制北京市地铁线路状况图(部分)

地铁线路图的可视化一直都是路网公司的重点,今天来和大家一起绘制线路图.先上图. 点击线路按钮,显示相应的线路.点击线路图下面的站间按钮(图上未显示),上报站间故障. 首先就是制作json文件,这个文件包括两部分,一部分是站点信息,另一部分就是线路信息,由于时间问题,我只写了5条线路(10号线站点太tm多了): 然后就是构造类文件,不多说: 之后就是主要的操作线路图的逻辑,还画了一个天安门. 好了废话不多说,下面上代码 1.主要代码 <!DOCTYPE html> <html lang=&

基于D3.js 绘制一个折柱混合图

测试题目:使用 D3 绘制一个折柱混合图,示例数据如下: data = [ ["时间", "销售额", "增长率(%)"], ["一月", 27506, 20.8], ["二月", 24399, 5.4], ["三月", 23120, 22], ["四月", 22053, 0.4], ["五月", 21221, 3.1], ["六月&qu

D3.js绘制 颜色:RGB、HSL和插值 (V3版本)

颜色和插值 计算机中的颜色,常用的标准有RGB和HSL. RGB:色彩模式是通过对红(Red).绿(Green).蓝(Blue)三个颜色通道相互叠加来得到额各式各样的颜色.三个通道的值得范围都是0~255,因此总共能表示16777216(255*255*255)种,即一千六百多万种颜色.几乎包括了人类所能识别的所有颜色,是应用最广泛的色彩模式. HSL:色彩模式是通过色相(Hue).饱和度(Saturation).明度(Lightness)三个通道的相互叠加来得到各种颜色的.其中,色相的范围为0

D3.js 绘制散点图

对于散点图,使用的数组需要包含坐标元素,即 x, y.同时,散点图需要使用 circle 元素. var svg = d2.select("body") .append("svg") .attr({ width:w, height:h }) svg.selectAll("circle") .data(dataset) .enter() .append("circle") .attr("cx",functio

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

本人的个人博客为:www.ourd3js.com csdn博客为:blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 地图的制作在 D3 中可以说是最重要的一环.因为在进行数据可视化时,很多情况都会和地图联系在一起,如中国各省的人口多少,GDP多少等,都可以和地图联系在一起. D3 中制作地图所需要的文件问 JSON 文件.JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.关于 JSON 的语法格式,可以在: http://www.w3s

【d3.js实践教程02】基于中国地图的高考一本录取率排行

学习d3.js(以下都简称d3)也有一段时间了,运行d3做了几个项目.我发现中文的d3教程很少,国外资料多但要求有一定的英文阅读能力(推荐网址:http://bl.ocks.org/mbostock),于是就萌发了写一个d3实际运用系列文章的想法,现在开始付之行动.在系列中,我会用d3+html5 canvas实现一些实际效果(如统计结果展示,地图数据展示等),希望可以跟大家共同学习交流. 代码我公布在git.cschina.com上,大家可以clone到本地运行,地址是:http://git.