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;

     	});

     	 //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>

参考网站:http://www.ourd3js.com/wordpress/?p=1201#comment-30319  谢谢馒头华华!

时间: 2024-11-09 00:49:29

D3js-地图中标注地点的相关文章

百度地图中的标注

使用多个定义好的城市标注,需要用for来循环一下,不然出现的是一个,或者不显示任何的标注 <script type="text/javascript"> // 百度地图API功能 var map = new BMap.Map("container"); map.centerAndZoom(new BMap.Point(106.234, 38.54), 5); map.addControl(new BMap.NavigationControl()); //

百度地图标注地点

效果图如下: 代码如下复制粘贴即可运行: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>百度地图测试 8-10</title> </head> <body> <!--引用百度地图API--> <style type="text/css">

百度地图拖动标注后获取坐标

本来想用图吧的API来做的,结果弄了下,在手机上弄不了.换用百度地图了..本功能个人觉得在很多地方用到,先记下来,省得每次都得翻地图API文档一点一点弄. 功能表现为: 地图一开始打开就定位到你的附近(以百度地图的浏览器定位为准),地图中心有一标注,鼠标拖去标注结果后弹框显示经纬度,自己测试过在手机上也是可以拖动的 代码如下: <!DOCTYPE html><html><head>    <meta http-equiv="Content-Type&qu

Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物 - OPEN 开发经验库 - 360安全浏览器 8.1

首页   代码   文档   问答   资讯   经验   GitHub日报 登录   注册 www.open-open.com/libOPEN经验 投稿 全部经验分类  Android IOS JavaScript HTML5 CSS jQuery Python PHP NodeJS Java Spring MySQL MongoDB Redis NOSQL Vim C++ C# JSON Ruby Linux Nginx Docker 所有分类  >  开发语言与工具  >  移动开发  

【 D3.js 高级系列 — 7.0 】 标注地点

有时需要告诉用户地图上的一些目标,如果该目标是只需要一个坐标就能表示的,称其为"标注". 1. 标注是什么 标注,是指地图上只需要一个坐标即可表示的元素.例如,在经纬度(116, 39)处画一个圆,在(108, 30)处画一个符号,这些都属于标注,也可以将标注理解为"点元素". 我们知道,只知道经纬度是不能直接在地图上作图的,需要先用投影函数将其转换成像素坐标.例如,如果要在中国地图上标出"北京"的位置,但是不知道北京的像素坐标.北京的经纬度可通

谈谈地图中的道路绘制

GIS属于可视化领域.一所谓可视化技术是利用计算机图形学和图形处理技术,将数据转化成图形或者图像在屏幕上显示出来,并进行交互处理的理论.方法和技术.个人理解地图中也有几个关键点: 原始数据可以是图像也可以是矢量数据,如我们底图是点.线.面等矢量数据,卫片.街景是图像数据. 渲染即显示到屏幕上,现在各家手机端都是基于opengl,不论图形还是图像最终显示到屏幕都必须像素化(光栅化). 交互性 地图APP中分量最重的就是交互,背后隐藏的巨大的需求. 目前地图中各种Feature数据,楼块是真正三维的

百度地图API标注+时间轴组合

百度地图API标注+时间轴组合 到新公司实习第八天,Boos让我结合百度地图api做一个动态展示标注变化的组件,要求地图展示某一天的标注,时间轴要求可以动态播放每一天的标注变化...然后我就开始coding... 准备工作: 申请百度api密钥(具体方法我也不多写了,大家应该都会) 了解一下百度地图API的开发指南和类参考文档(如果嫌麻烦的话 可以直接看Demo示例) 一.首先,先加载地图,你可以用实际的经纬度定位.浏览器定位.根据ip定位.根据城市名定位,这个你可以自己选择 // 创建Map实

ArcGIS中标注(label)的使用技巧

标注是显示在地图上的文字信息,它是出图中不可或缺的重要元素.标注的样式丰富,并且放置位置灵活,因此带来了对标注控制的难度.例如地质图里的上下标,或是一些分式的标注,就必须使用代码编程来实现.这篇文章就主要结合几个实例来讨论一下标注的使用技巧,以及在ArcGIS软件中的实现. 一.上下标 在地质图中经常会使用到上下标的文字,在ArcGIS帮助中可以查看到上下标的写法如下所示: 上标:"" & [上标字段] & "" 下标:"" &a

echarts地图中城市与省份之间的切换

在使用echarts地图中,可能会用到显示各省份的数据和显示各城市的数据.综合了这两种的配置项,只需传四个参数即可完成对这两种模式的切换. 下面就是配置项代码: //地图配置 //mapData:图表所需数据:mapType:地图模式或散点图模式(即按省份显示数据或按城市显示数据) //minValue:视觉映射组件最小值:maxValue:视觉映射最大值 function _setMap(mapData, mapType, minValue, maxValue) { var option =