jvectormap的自定义地图和区域上色、图片标记

因为网上例子太少,上手实属不易,所以在这里跟大家分享一下我的使用!
这里就简单的介绍了
jquery是必不可少的
jvectormap的官方下载地址:http://jvectormap.com/download/

图片转svg格式工具,win10病毒库更新后显示有病毒,我感觉用的挺方便,自己选择,也可在网上自己找
链接:https://pan.baidu.com/s/1hyl2TBjvcACRbldvKXiKQQ
提取码:xw9e

提取svg数据并生成js

Maven依赖
主要是解析svg文件

<dependency>
  <groupId>org.apache.xmlgraphics</groupId>
  <artifactId>batik-svggen</artifactId>
  <version>1.8</version>
 </dependency>
 <dependency>
  <groupId>org.apache.xmlgraphics</groupId>
  <artifactId>batik-bridge</artifactId>
  <version>1.8</version>
  <exclusions>
   <exclusion>
    <groupId>xalan</groupId>
    <artifactId>xalan</artifactId>
   </exclusion>
  </exclusions>
 </dependency>
 <dependency>
  <groupId>org.apache.xmlgraphics</groupId>
  <artifactId>batik-dom</artifactId>
  <version>1.8</version>
  <exclusions>
   <exclusion>
    <groupId>xalan</groupId>
    <artifactId>xalan</artifactId>
   </exclusion>
  </exclusions>
 </dependency>
 <dependency>
  <groupId>org.apache.xmlgraphics</groupId>
  <artifactId>batik-parser</artifactId>
  <version>1.8</version>
 </dependency>
 <dependency>
  <groupId>org.apache.xmlgraphics</groupId>
  <artifactId>batik-svg-dom</artifactId>
  <version>1.8</version>
 </dependency>
 <dependency>
  <groupId>org.apache.xmlgraphics</groupId>
  <artifactId>batik-transcoder</artifactId>
  <version>1.8</version>
 </dependency>
 <dependency>
  <groupId>org.apache.xmlgraphics</groupId>
  <artifactId>batik-util</artifactId>
  <version>1.8</version>
 </dependency>
 <dependency>
  <groupId>org.apache.xmlgraphics</groupId>
  <artifactId>batik-xml</artifactId>
  <version>1.8</version>
 </dependency>
 
 <!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/xmlgraphics-commons -->
 <dependency>
  <groupId>org.apache.xmlgraphics</groupId>
  <artifactId>xmlgraphics-commons</artifactId>
  <version>2.1</version>
 </dependency>
 
 <!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/batik-codec -->
 <dependency>
  <groupId>org.apache.xmlgraphics</groupId>
  <artifactId>batik-codec</artifactId>
  <version>1.8</version>
 </dependency> <!-- 此处不能使用2.9.1版本,使用2.9.1生成png会失败 -->
 
 <dependency>
  <groupId>xerces</groupId>
  <artifactId>xercesImpl</artifactId>
  <version>2.5.0</version>
 </dependency>
 <dependency>
  <groupId>xml-apis</groupId>
  <artifactId>xmlParserAPIs</artifactId>
  <version>2.0.2</version>
 </dependency>
 <dependency>
  <groupId>org.axsl.org.w3c.dom.svg</groupId>
  <artifactId>svg-dom-java</artifactId>
  <version>1.1</version>
 </dependency>
 <dependency>
  <groupId>xml-apis</groupId>
  <artifactId>xml-apis</artifactId>
  <version>2.0.0</version>
 </dependency>
 <dependency>
  <groupId>org.w3c.css</groupId>
  <artifactId>sac</artifactId>
  <version>1.3</version>
 </dependency>

提取Java代码
需要将svg文件的中的svg标签上添加一个id属性

import org.apache.batik.anim.dom.SAXSVGDocumentFactory;
import org.apache.batik.util.XMLResourceDescriptor;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class SvgScript {
 
 /**
  * 获取当前地图区域所对应的颜色信息
  * @param svgURI svg文件的所在路径
  * @param svgId  svg文件中svg标签的id,自己手动设置,没有id将拿不到svg对象
  * @throws Exception
  */
 public static void svgColor(String svgURI,String svgId) throws Exception {
     Element element=getList(svgURI,svgId);
     NodeList list=element.getChildNodes();
     NodeList gList=null;
     Node node=null; 
     Node gNode=null;
     NamedNodeMap map=null;
     int j=-1;
     int count=0;
     for(int i=0;i<list.getLength()/2;i++) {
         node=list.item(j+=2);
   	 gList=node.getChildNodes();
   	 int l=-1;
   	 for (int k=0; k<gList.getLength()/2; k++) {
    	     gNode=gList.item(l+=2);
    	     map=gNode.getAttributes();
             String fill=map.getNamedItem("fill").getNodeValue();
             System.out.print((count++)+":'"+fill+"',");
             if(count%10==0&&count!=0) {
                 System.out.println();
             }
        }
    }
 }
 
 /**
  * 提取svg文件中的地图数据并生成jvectormap需要的js文件
  * @param svgURI svg文件的所在路径
  * @param svgId  svg文件中svg标签的id,自己手动设置,没有id将拿不到svg对象
  * @param outPath js文件的输出路径
  * @param mapId  生成js中地图的名称
  * @param width 	 展示图片的宽
  * @param height 展示图片的高
  * @throws Exception
  */
 public static void parseSVG(String svgURI,String svgId,String outPath,String mapId) throws Exception {
     Element element=getList(svgURI,svgId);
     String width=element.getAttribute("width");
     String height=element.getAttribute("height");
     NodeList list=element.getChildNodes();
     NodeList gList=null;
     FileWriter fw=new FileWriter(new File(outPath)); 
     Node gnode=null;
     Node node=null; 
     NamedNodeMap map=null;
     StringBuilder str=new StringBuilder();
     str.append("jQuery.fn.vectorMap('addMap', '"+mapId+"',{\"width\":"+width+",\"height\":"+height+",\"paths\":{\n"); 
     int j=-1;
     int count=0;
     for(int i=0;i<list.getLength()/2;i++) { 
         gnode=list.item(j+=2);
	 gList=gnode.getChildNodes();
	 int l=-1;
	 for (int k=0; k<gList.getLength()/2; k++) {
	     node=gList.item(l+=2); 
	     map=node.getAttributes();
	     str.append("\t\t\""+(count++)+"\":{\"path\":\""+map.getNamedItem("d").getNodeValue()+"\"}"); 
	     if(k!=gList.getLength()-1) { 
	         str.append(",\n"); 
	     }
	 }
     }
		 
 }
		 
 /**
  * 获取svg文件中svg标签中的子元素集合
  * @param svgURI svg文件所在路径
  * @param svgId  svg文件中svg标签的id,自己手动设置,没有id将拿不到svg对象
  * @return
  * @throws Exception
  */
 public static NodeList getList(String svgURI,String svgId) throws Exception {
     File file = new File(svgURI);
     String parser = XMLResourceDescriptor.getXMLParserClassName();
     SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
     Document doc = f.createDocument(file.toURI().toString());
     Element element = doc.getElementById(svgId);
     return element.getChildNodes();
 }
}

jvectormap使用

jvectormap api文档:http://www.u396.com/tag/jvectormap
我就写的简洁一点当个例子使用了

<html>
<head>
  <link href="jquery-jvectormap-2.0.3.css" rel="stylesheet" />
  <script src="jquery/jquery-1.8.3.min.js" type="text/javascript"></script>
  <script src="jquery-jvectormap-2.0.3.min.js"></script>
  <script src="map.js"></script>  <!-- 用svg文件生成的js -->
</head>
<body onload="show()">
<div id="mapSvg"></div>
</body>
<script type="text/javascript">
var mapColor={
	0:'#ffffff',...    //java方法中获取区域颜色的那个打印的数据放这里
};
function show(){	
	$('#mapSvg').vectorMap({
	    map:'mySvg', //生成js文件中的mapid
	    series: {
    		   markers: [{
   		      attribute: 'image',		//代表使用图片代替标记
                      scale: {
    			   'criminal':'1.png',		//图片的名称,图片的路径
                	   'police': '2.png'
            	      },
    		   }],
         	   regions: [{				//区域上色,如不需要把regions属性删掉jiuok
            	      normalizeFunction: 'polynomial',
   		      attribute: 'fill',
                      values: mapColor
                   }]
   	   },
	});
}

function addMarkerImage(){
									
	//添加单个图片标记
	var map=$('#mapSvg').vectorMap('get','mapObject');
	var nd={};
	nd.name="lucy";	//鼠标移动到标记上显示的信息
	nd.coords=[x,y]; //x轴y轴坐标
	map.addMarker("001",nd,['criminal']);	//001:标记的编号,不可重复,重复时覆盖,
						//nd:标记的信息,可自己添加需要的属性,但是coords是必须的 ,
						//['criminal']:标记引用的图片,和定义地图信息中定义的
	//这样就可以在地图的指定x,y坐标添加一个标记了

	//添加多个图片标记
	var nd1={}
	nd1.coords=[x,y];
	var nd2={}
	nd2.coords=[x,y];
	var BQ=[];
	BQ.push(nd1);
	BQ.push(nd2);
	map.addMarkers(BQ);
	//添加图片代替标记
	a.series.markers[0].setValues(['police','criminal']);	//图片标记对应的标记的顺序,标记数组[0],对应的就是图片数组[0]
}
function addMarker(){  
	 //不使用图片标记,要先将地图定义中的markers属性删掉
	 //添加单个
	 var nd0={};
	 nd0.coords=[x,y];
	 nd0.style= {stroke: 'yellow', fill: 'red', r: 6}; //标记的样式
	        //fill是标记的颜色
	        //stroke是园外圈的颜色
	        //r 标记的大小
	  map.addMarker("002",nd0);
	 
	 //添加多个
	 //添加多个图片标记
	  var nd1={}
	  nd1.coords=[x,y];
	  var nd2={}
	  nd2.coords=[x,y];
	  var BQ=[];
	  BQ.push(nd1);
	  BQ.push(nd2);
	  map.addMarkers(BQ);
	}
</script>

ok,这样一个地图就做出来了,还有一些方法属性,请在上方的 jvectormap中的api文档中查看。

上一篇