可視化工具D3.js教程 入門 (第十四章)—— 中國地圖


首先我們需要的是 中國地圖的json數據:請戳這里

接下來咱們直接上代碼:

代碼:

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>中國地圖</title>
    <script src="./d3.min.js"></script>
</head>
<body>

<svg width="900" height="700"></svg>


</body>

<script>

    //獲取svg
    var svg = d3.select('svg');
    var width = svg.attr('width');
    var height = svg.attr('height');

    //創建區域分組
    var g = svg.append('g').attr('transform','translate(0,0)');

    //創建一個地圖投影
    var mercator = d3.geoMercator()
        .center([107,31])//設置投影的中心點 經緯度
        .scale(550)//設置縮放因子
        .translate([width/2,height/2]);//設置平移偏移量

    //創建一個地理路徑生成器
    var geoPath = d3.geoPath()
        .projection(mercator)//設置地理路徑生成器的投影方式

    //獲取中國地圖的json文件
    //利用node.js 在本地起一個http-server
    d3.json('map.json').then(function (data) {//D3 v5版本d3.json()現在將返回一個你可以在.then()方法中處理的Promise
        console.log(data);//features

        //新建一個顏色比例尺
        var scaleColor = d3.scaleOrdinal()
            .domain(d3.range(data.features.length))
            .range(d3.schemeCategory10);


        //繪制區域
        g.append('g')
            .selectAll('path')
            .data(data.features)
            .enter()
            .append('path')
            .attr('stroke','gray')
            .attr('strok-widht',1)
            .attr('d',function (d,i) {
                return geoPath(d);
            })
            .attr('fill',function (d,i) {
                return scaleColor(i);
            })
            .on('mouseover',function (d,i) {
                d3.select(this).attr('fill','yellow');
            })
            .on('mouseout',function (d,i) {
                d3.select(this).attr('fill',scaleColor(i));
            });

        //繪制文字
        g.append('g')
            .selectAll('text')
            .data(data.features)
            .enter()
            .append('text')
            .attr('font-size',12)
            .attr('text-anchor', 'middle')
            .attr('x',function (d,i) {
                var position = mercator(d.properties.centroid || [0,0]);
                return position[0];
            })
            .attr('y',function (d,i) {
                var position = mercator(d.properties.centroid || [0,0]);
                return position[1];
            })
            .attr('dy',function (d,i) {
                //這里為什么這么寫呢,因為澳門和香港重合了,擠到一起了。
                if (d.properties.name === '澳門特別行政區') {
                    return 10;
                }
            })
            .text(function (d,i) {
               return d.properties.name;
            });

    });

</script>
</html>

 

效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM