【归档】[D3] 地图可视化——美国地图

基于地图信息,设计可视化方案,能够将不同州的生产力高低,以及一些城市的人口多少表示在地图上。该可视化方案,能为用户提供一个分析在那些生产力比较高(或比较低)的州和州里一些大城市的人口之间关系的工具。

 

<!DOCTYPE html>
<html>

<head>
    <title>D3js可视化——美国地图</title>
    <meta charset="utf-8">
    <script type="text/javascript" src="./js/d3.v3.min.js"></script>
    <script type="text/javascript" src="./js/d3-queue.min.js"></script>
</head>

<body>
    <script type="text/javascript">
    // 定义地图的长宽
    var width = 960;
    var height = 500;
    // 定义地图的容器和样式
    var svg = d3.select("body").append("svg")
        .attr("width", width)
        .attr("height", height)
        .attr("style", "margin: 20px auto;display: block;")
        .append("g");
    // 投影函数
    // 这个投影函数将美国本土和阿拉斯加以及夏威夷融合在了一个地图上
    // 它把阿拉斯加的面积缩小0.35倍,将夏威夷岛放在了美国本土的下面
    var projection = d3.geo.albersUsa();
    // 设置地理路径生成器
    // projection() 是设定生成器的投影函数,把上面定义的投影传入即可。
    // 以后,当使用此生成器计算路径时,会自己加入投影的影响。
    var path = d3.geo.path()
        .projection(projection);
    // 读取数据,生成地图
    d3.queue()
        .defer(d3.json, "./dist/us_states.json")
        .defer(d3.csv, "./dist/us_ag_productivity_2004.csv")
        .defer(d3.csv, "./dist/us_cities.csv")
        .await(ready);

    function ready(error, states, productivity, cities) {
        if (error) throw error;
        console.log(states);
        console.log(productivity);
        console.log(cities);
        // 根据生产力的不同,返回不同深度的颜色填充地图块
        var colors = ["#F1E3D6", "#E7C6B0", "#DCAC89", "#C99067", "#BE7542"],
            proMin = d3.min(productivity, function(d) { return d.value; }),
            proMax = d3.max(productivity, function(d) { return d.value; });
        var colorScale = d3.scale.quantile()
            .domain([proMin, colors.length - 1, proMax])
            .range(colors);
        var targetColor = function(target) {
            for (var i = productivity.length - 1; i >= 0; i--) {
                if (target == productivity[i].state) {
                    return colorScale(productivity[i].value);
                }
            }
            return "#F1E3D6";
        }
        // 添加地图块
        svg.selectAll("path")
            .data(states.features)
            .enter().append("path")
            // 添加地图边界
            .attr("stroke", "#000")
            .attr("stroke-width", 1)
            .attr("fill", function(d, i) {
                return targetColor(d.properties.name);
            })
            .attr("d", path)
            // 鼠标悬浮样式
            .on("mouseover", function(d, i) {
                d3.select(this).attr("fill", "yellow");
            })
            .on("mouseout", function(d, i) {
                d3.select(this).attr("fill", targetColor(d.properties.name));
            })
            // 添加地图名称
            .append("title").text(function(d, i) {
                return d.properties.name;
            });
        // 添加人口信息
        var popMin = d3.min(cities, function(d) { return parseInt(d.population); }),
            popMax = d3.max(cities, function(d) { return parseInt(d.population); });
        // 设置比例
        var getR = d3.scale.linear()
            .domain([popMin, popMax])
            .range([4, 24]);
        var city = svg.selectAll("g")
            .data(cities).enter()
            .append("g")
            // 定位
            .attr("transform", function(d, i) {
                var po = projection([d.lon, d.lat]);
                return "translate(" + po[0] + ", " + po[1] + ")";
            });
        city.append("circle")
            .attr("r", function(d, i) {
                return getR(cities[i].population);
            })
            .attr("fill", "#00a1e9")
            // 添加透明度,使一些被覆盖的点可以显示出来
            .attr("opacity", "0.8")
            // 鼠标悬浮样式
            .on("mouseover", function(d, i) {
                d3.select(this).attr("r", getR(d.population) * 2);
                d3.select(this).attr("fill", "red");
            })
            .on("mouseout", function(d, i) {
                d3.select(this).attr("r", getR(d.population));
                d3.select(this).attr("fill", "#00a1e9");
            })
            // 添加人口信息
            .append("title").text(function(d, i) {
                return d.place + "\nPopulations: " + d.population + "\nRank: " + d.rank;
            });

    }
    </script>
</body>

</html>

 

效果图如下:

 

 

 

 

 

数据文件:地图可视化数据(美国地图)

  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值