D3js-值域渐变地图

根据各个省份的数值从小到大,显示的颜色由浅到深。

效果图:

源代码:

<html>
  <head>
    <title>D3 值域渐变地图</title>
    <style type="text/css">
		  		.tooltip{
		  			font-family:simsun;
		  			font-size:16px;
		  			width:120;
		  			height:auto;
		  			position:absolute; //绝对路径
		  			text-align:center;
		  			border-style:solid;
		  			border-width:1px;
		  			background-color:white;
		  			border-radius:5px;
		  		}
	 </style>
  </head>

  <body>
  	<!-- D3js系列文件 -->
  	<script type="text/javascript" src="js/d3/d3.js"></script>
	<script type="text/javascript" src="js/d3/d3.min.js"></script>
	<!-- 读取topJson文件 -->
	<script type="text/javascript" src="js/d3/topojson.js"></script>
   <script type="text/javascript">

   		var width =1000;
   		var height =1000;
   		var svg =d3.select("body")
   					.append("svg")
   					.attr("width",width)
   					.attr("height",height);

   		//投影
   		var projection =d3.geo.mercator()
   						.center([107,30]) //中心点
   						.scale(800) //地图大小
   						.translate([width/2,height/2-50]); //地图宽度和高度
   		//投影后获得的路径
   		var path =d3.geo.path()
   					.projection(projection);

   	//topojson文件读取比geojson文件更快
   	d3.json("data/china.topojson",function(error,topoRoot)
   	{
   		console.log(topoRoot);
   		//将toporoot装换成geojson
   		//topoRoot.objects.china 对象,具体可以查看china.topojson文件
   		var georoot = topojson.feature(topoRoot,topoRoot.objects.china);

   		console.log("geoson-------------------------------");
   		console.log(georoot);

   		//提示框 (注意设置提示框的绝对路径)
   		var tooltip =d3.select("body")
   						.append("div")
   						.attr("opacity",0.0)
   						.attr("class","tooltip")
   						;

   		//添加一个g标签
   		var china =svg.append("g");

   		//绘制个省份的path路径
   		var provinces =china.selectAll("path")
   						.data(georoot.features)
   						.enter()
   						.append("path")
   						.style("fill","#ccc")
   						.attr("stroke","black")
   						.attr("stroke-width","1px")
   						.attr("d",path);

   		//在地图上显示各个身份的名称
   		svg.selectAll("text")
      		.data(georoot.features)
      		.enter()
      		.append("text")
      		//设置各个文本(省份名称)显示的文字
      	  	 .attr("transform",function(d,i)
      		{
      			 if(d.properties.id =="20") //河北
      			{
      				return "translate("+(path.centroid(d)[0]-20)+","+ (path.centroid(d)[1]+20)+")";
      			}
      				return "translate("+(path.centroid(d)[0]-10)+","+ path.centroid(d)[1]+")";
      		})   

		       /* 	.attr("x", function(d) { 

			       		return (path.centroid(d)[0]-10);

		       	})
		         .attr("y", function(d) { 

		         	if(d.properties.id =="20") //河北
			       	{
			       		return (path.centroid(d)[1]+30);
			       	}
		       		  return (path.centroid(d)[1]);

		          })   */
		       //显示省名
     		 .text(function(d)
      			{
     		 	return d.properties.name;
      			})
      		.attr("font-size",12);

   		//读取数据文件
   		d3.json("data/tourism.json",function(error,dataset)
   		{
   		//将数据保存在数组中,(数组索引号为各省的名称)
   			var datas=[];
   			var datam=[];
   			for(var i=0;i<dataset.provinces.length;i++)
   			{
   				var name= dataset.provinces[i].name;
   				var value= dataset.provinces[i].value;
   				 datas[name]=value;		//例如 datas[北京]=14149
   				 datam.push(value); 	//datam 数组用于求中间值
   			}

   			console.log("datas--------------------------------");
   			console.log(datas);
   			console.log("datam--------------------------------");
   			console.log(datam);

   			//取出数据中的最大值和最小值
   			var maxdata =d3.max(dataset.provinces,function(d)
   			{
   				return d.value;
   			});
   			var mindata=0;

   			//定义一个线性比例尺
   			var linear = d3.scale.linear()
   							.domain([mindata,maxdata])
   							.range([0,1]);

   			//定义颜色
	   		var b=d3.rgb(130, 140, 20);
   			var a=d3.rgb(255, 255, 180);

   			//设置颜色插值
   			var color =d3.interpolate(a,b);

   		//给个省份填充颜色
   		provinces.style("fill",function(d,i)
		   		{
		   			var t= linear(datas[d.properties.name]);
		   			var col = color(t);
		   			return col.toString();
		   		}) 

		   		//提示框
   				.on("mouseover",function(d,i)
				{
					d3.select(this).attr("fill","#ccc");

					tooltip.html(d.properties.name+":"+datas[d.properties.name])
					.style("left",(d3.event.pageX)+"px")
					.style("top",(d3.event.pageY+20)+"px")
					.style("opacity",1.0);
				})
				.on("mouseout",function(d,i)
				{
					d3.select(this).attr("fill",color(i));

					tooltip.style("opacity",0.0);
				});

   		//显示渐变矩形条
   		var defs = svg.append("defs");

   		var linearGradient = defs.append("linearGradient")
   								.attr("id","linearColor")
   								//颜色渐变方向
   								.attr("x1","0%")
   								.attr("y1","0%")
   								.attr("x2","100%")
   								.attr("y2","0%");
   		//设置矩形条开始颜色
   		var stop1 = linearGradient.append("stop")
   								  .attr("offset","0%")
   								  .attr("stop-color",a.toString());
   		//设置结束颜色
   		var stop2 = linearGradient.append("stop")
   								.attr("offset","100%")
   								.attr("stop-color",b.toString());

   		var colorRect = svg.append("rect")
   						//x,y 矩形的左上角坐标
   						.attr("x",50)
   						.attr("y",50)
   						//矩形的宽高
   						.attr("width",200)
   						.attr("height",20)
   						//引用上面的id 设置颜色
   						.style("fill","url(#"+linearGradient.attr("id")+")");
    	//设置文字

    	//数据初值
    	var startText = svg.append("text")
    					.attr("x",50)
    					.attr("y",45)
    					.text(mindata);
    	//数据中间值
    	var middleText =svg.append("text")
    					   .attr("x",125)
    					   .attr("y",45)
    					   .text(
    					   	//d3.mean(datam)//平均值
    					   d3.median(datam) //中间值
    					   );
    	//数据末值
    	var endText =svg.append("text")
    				.attr("x",250)
    				.attr("y",45)
    				.text(maxdata);
   	});

   	});

   	//添加南海诸岛svg文件
   		d3.xml("data/southchinasea.svg",function(error,xml)
   		{
   			//document.body.appendChild(xml.documentElement);

   			svg.html(function(d)
   			{
   				//在当前元素的html里添加svg文件里面的第一个g标签及其内容
   				return d3.select(this).html()+xml.getElementsByTagName("g")[0].outerHTML;
   			});

   			//设置svg文件的属性
   			var southSea = d3.select("#southsea");
   			southSea.attr("transform","translate(800,500)scale(0.5)")
   					.attr("stroke","black")
   					.attr("stroke-width","1px")
   					.attr("fill","#ccc");
   		});

   </script>
  </body>
</html>

显示省份页面代码:

颜色渐变矩形条 和 提示框页面代码:

参考网站:http://www.ourd3js.com/wordpress/?p=1148

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 11:11:49

D3js-值域渐变地图的相关文章

基于D3JS绘制中国地图

仿照D3JS官网上的美国地图制作了一个中国版的地图. D3JS官网上的版本: http://bl.ocks.org/NPashaP/a74faf20b492ad377312 中国版的地图效果: 如要制作其他国家或其他具体省份-市区级的地图,只需替换掉javascript中的SVG地图数据即可.地图上每个省份的统计数据是随机生成的,可根据需求导入实际业务数据. 分享一个SVG地图数据的网站:https://commons.wikimedia.org/wiki/Category:SVG_maps_o

(UWP)通过编写算法实现在地图中的渐变路径

目前的一个App中需要实现这个需求,但是在UWP自带的Bing Map中,绘制的MapPolyline的StrokeColor的类型是Windows.UI.Color,也就是说一条MapPolyline只支持一种颜色,想要实现渐变是根本不可能的--但是我又不想说去拒绝视觉的需求,因为我觉得就算是系统提供的渐变画刷底层肯定也是通过相关的算法实现颜色渐变的,所以只要我们认真研究一下,最终一样可以达到我们想要的需求. 说个题外话,在这次的思路之前我还产生了其他的思路.当时是想在后台代码中实例化一个新的

android高德地图绘制线 渐变处理

这个是为了实现淘宝物流轨迹的那种样式,轨迹路线是渐变色. 先说下物流轨迹实现流程. 1.高德地图3d.导航.搜索三个sdk的支持 2.通过导航获取一条路径,这个路径包含的点相当多,可能有上万个. 3.利用路径中的点划线,划线的点和导航提供的点是用的格式不一样,需要简单转换一下. 4.使用android自带的api “ArgbEvaluator”来计算每个点的颜色值. 5.把所有的颜色值放进一个数组,然后使用.colorValues(colorList).useGradient(true)这两个设

【 D3.js 高级系列 — 6.0 】 值域和颜色

在[入门 - 第 10 章]作了一张中国地图,其中各省份的颜色值都是随意赋值的.如果要将一些值反映在地图上,可以利用颜色的变化来表示值的变化. 1. 思路 例如,有值域的范围为: [10, 500] 现希望10用浅绿表示,500用深绿表示,10到500之间的值用浅绿和深绿之间的颜色表示.显然,此处需要一个函数,传入的参数是10到500之间的值,返回值是浅绿到深绿之间的颜色值. [高级 - 第 5.1 章]介绍的颜色插值函数正好可以派上用场. var palegreen = d3.rgb(66,2

ECharts地图详解 【转】

$(function() { // 路径配置 require.config({ paths : { // echarts: 'http://echarts.baidu.com/build/dist' echarts : './plugins/echarts-2.2.7/doc/example/www/js' } }); // 使用 require( [ 'echarts', 'echarts/chart/map' // 使用柱状图就加载bar模块,按需加载 ], function(ec) { /

转 Echars地图详解

$(function() { // 路径配置 require.config({ paths : { // echarts: 'http://echarts.baidu.com/build/dist' echarts : './plugins/echarts-2.2.7/doc/example/www/js' } }); // 使用 require( [ 'echarts', 'echarts/chart/map' // 使用柱状图就加载bar模块,按需加载 ], function(ec) { /

【Map】Echarts之iphone销量地图的使用以及详细配置

1.引入echarts库文件 <script charset="utf-8" type="text/javascript" language="javascript" src="echarts-2.2.7/doc/example/www/js/echarts.js"></script> 2.在页面中新建div用于地图展示 <div id="main" style="h

ECharts系列 - 地图 实例一

ECharts主页:  http://echarts.baidu.com/index.html ECharts-2.1.8下载地址:  http://echarts.baidu.com/build/echarts-2.1.8.zip ECharts官方实例:  http://echarts.baidu.com/doc/example.html ECharts官方API文档:  http://echarts.baidu.com/doc/doc.html 1.项目结构 js文件夹: 下载了EChar

ECharts地图详解

1.引入echarts库文件 <script charset="utf-8" type="text/javascript" language="javascript" src="echarts-2.2.7/doc/example/www/js/echarts.js"></script> 2.在页面中新建div用于地图展示 <div id="main" style="h