1. 程式人生 > >D3js-地圖中標註地點

D3js-地圖中標註地點

效果圖:


所要用到的資原始檔:

1.topojson.js 下載地址:http://www.oschina.net/p/topojson 

2.china.topojson 、southchinasea.svg 以及 places.json 下載地址:http://download.csdn.net/detail/u013147600/8815899

其中places.json 是虛假資料

3. d3.min.js 下載地址:http://d3js.org/      ----(d3.zip)

原始碼:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>d3-中國地圖標註</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	
	<style>
	/* .province {
		stroke: black;
		stroke-width: 1px;
	} */
  
/* 	.southsea {
		stroke: black;
		stroke-width: 1px;
		fill: yellow;
	} */

	/* .location circle{
		fill: blue;
	} */
  </style>
	
	 <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>
  <script type="text/javascript" src="js/d3/d3.js"></script> 
  <script type="text/javascript" src="js/d3/d3.min.js"></script>

  <script type="text/javascript" src="js/d3/topojson.js"></script>
  </head>
  
  <body>
    <script type="text/javascript">
    
    	
    	var width =800;
    	var height = 800;
   
   		//新增一個svg 	
    	var svg = d3.select("body").append("svg")
    				.attr("width",width)
    				.attr("height",height);
    				
    	//定義一個投影函式
    	var projection = d3.geo.mercator()
    						.center([110,40]) //設定繪製地圖的中心 --根據實定情況定
    						.scale(600) //可以調整所繪地圖的大小 --根據實定情況定
    						.translate([width/2,height/3]); //偏移量
    	
    	//通過投影函式定義地理路徑生成器
    	var path = d3.geo.path()
    					.projection(projection);
    	
    	//標題
    	svg.append("text")
    		.text("XX公司部門分佈")
    		.attr("x",(width/3))
    		.attr("y",50)
    		.attr("font-size","18px")
    		.attr("font-weight","bold")
    		.attr("text-anchor","middle")
    		.attr("fill","black")
    		;
    	//例如以北京經緯度作為投影
    	//var peking=[116.3,39.9];
    	//var proPeking =projection(peking);
    	
    	//讀取中國地圖的topojson檔案
    	d3.json("data/china.topojson",function(error,topodata)
    	{
    		//判斷是否出錯,在控制檯輸出錯誤資訊
    		if(error)
    			return console.error(error);
    		
    		//將topojson轉換為geojson
    		var geodata = topojson.feature(topodata,topodata.objects.china);

    		
    		/* //實現圖表的縮放
    		var zoom = d3.behavior.zoom()
    					.scaleExtent([1,5])
    					.on("zoom",zoomed);					
    		
    		function zoomed()
    		{
    			d3.select(this)
    				.attr("transform","translate("+d3.event.translate+")scale("+d3.event.scale+")");
    		} */
    		
    		//包含中國各省路徑的分組元素
    		var china =svg.append("g")
    		//.call(zoom) //呼叫圖表縮放函式
    		;
    		
    		//顏色
    		var color = d3.scale.category20c();
    		
    		//新增中國各省的路徑元素
    		var provinces =china.selectAll("path")
    							.data(geodata.features)
    							.enter()
    							.append("path")
    							.attr("class","province")
    							 .style("fill",function(d,i)
    							{
    								return color(i);
    							}) 
    							.attr("stroke","black")
    							.attr("stroke-width","1px") 					
    							.attr("d",path);
    								
    		//讀取要標註的省份資訊
    		d3.json("data/places.json",function(error,placedata)
    		{
    			//插入分組元素
				var location = svg.selectAll("location")
						.data(placedata.location)
						.enter()
						.append("g")
						//.attr("class","location")
						.attr("transform",function(d){
							//計算標註點的位置
							var coor = projection([d.log, d.lat]); //經緯度的投影
							return "translate("+ coor[0] + "," + coor[1] +")";

						});
					
					//畫圓作為標註
    				location.append("circle")
    						.attr("r",5) //半徑
    						.style("fill",function(d,i) 
    						{
    							if(d.name=="福州總部")
    								return "red";
    								
    							return"yellow";
    								
    						})
    						;
    				
    				//新增文字
    				location.append("text")
    					.text(function(d)
						{
							return d.name;
						}
						)
						//.attr("fill","red")
						.attr("fill",function(d,i)
						{
							
    							if(d.name=="福州總部")
    								return "red";
    								
    							return"black";
						})
						
						.attr("text-anchor","middle")  
						.attr("font-family","sans-setif")  
						.attr("font-size","14px")  
						.attr("font-weight","bold")  
						;	
    		});				
    							
    					
    		
    	});
    		
    //插入南海諸島的svg圖片
     d3.xml("data/southchinasea.svg",function(error,xmlDoc)
     {
     	svg.html(function(d)
     	{
     		return d3.select(this).html()+xmlDoc.getElementsByTagName("g")[0].outerHTML;
     	//在當前元素的html裡新增 svg檔案裡面的 第一個g標籤及其內容	
     	});
     	 
     	 //return	document.body.appendChild(xmlDoc.documentElement);
     	     	
     	var gSouthSea = d3.select("#southsea");
	
		gSouthSea.attr("transform","translate(550,450)scale(0.5)")
			.attr("class","southsea")
	     	.attr("stroke","black")
	     	.attr("stroke-width"," 1px")
	     	.attr("fill","yellow");
     	
     	
     	//------------------------新增提示框的div
    		var tooltip = d3.select("body").append("div")
    					.attr("class","tooltip") //用於css設定類樣式
    					.attr("opacity",0.0);
    	//響應事件
    		//-滑鼠移入事件
    	gSouthSea.on("mouseover",function(d)
    		{	
    			//設定tooltip文字
    			tooltip.html("中國南海諸島")
    			//設定tooltip的位置(left,top 相對於頁面的距離) 
    					.style("left",(d3.event.pageX)+"px")
    					.style("top",(d3.event.pageY+20)+"px")
    					.style("opacity",1.0);
    		})
    		//--滑鼠移出事件
    		.on("mouseout",function(d)
    		{
    			tooltip.style("opacity",0.0);
    		}); 
   
     });
    		
    </script>
    
  </body>
</html>
outerHTML、innerHTML以及innerText三者的區別: outerHTML可以用來更改或獲取元素內所有的html和文字內容,包含引用該方法元素自身的標籤. innerHTML是用來獲取元素內的html內容和文字. innerText只獲取元素內的文字內容,html標籤將被忽略.
參考網站:http://www.ourd3js.com/wordpress/?p=1201#comment-30319  謝謝饅頭華華!