百度地图API生成厦门区级行政区划图

先看效果:
在这里插入图片描述

1、引入百度地图API

引入百度地图API所需要的js

<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"></script>

2、创建地图

var map = new BMap.Map("allmap");

3、创建Boundary类以获取行政边界(点的集合),并创建多边形覆盖物

关于Boundary类不清楚可以查看官方类参考文档(点这里查看

var bdary = new BMap.Boundary();

Boundary类具有一个get方法:get(name: String, callback: function),返回行政区域的边界。 name: 查询省、直辖市、地级市、或县的名称。 callback:执行查询后,数据返回到客户端的回调函数,数据以回调函数的参数形式返回。返回结果是一个数组,数据格式如下: arr[0] = “x1, y1; x2, y2; x3, y3; …” arr[1] = “x1, y1; x2, y2; x3, y3; …” arr[2] = “x1, y1; x2, y2; …” … 否则回调函数的参数为null

具体用法(以获取厦门市行政边界为例)

bdary.get("厦门市", function(rs){       //获取行政区域
			map.clearOverlays();        //清除地图覆盖物       
			var count = rs.boundaries.length; //行政区域的点有多少个
			if (count === 0) {
				alert('未能获取当前输入行政区域');
				return ;
			}
          	var pointArray = [];
			for (var i = 0; i < count; i++) {
				var ply = new BMap.Polygon(rs.boundaries[i], {strokeWeight: 2, strokeColor: "#ff0000"}); //建立多边形覆盖物
				map.addOverlay(ply);  //将上一步建立的多边形覆盖物添加到地图中
				pointArray = pointArray.concat(ply.getPath());
			}    
			map.setViewport(pointArray);    //调整视野 ,将整个厦门市调整到地图展示区域
		});   

如此,厦门市的整体界限就展示出来了。
接下来为各个区建立多边形覆盖物并添加到地图。

4、为各个区添加名称

多边形覆盖物上没有显示各区名称,现在需要添加各区的名称。
首先找到各区的中心点(通过百度地图坐标拾取工具(点击这里打开))
p.s. 也可以通过多边形各个点坐标计算中点并进行偏移,为什么不这样做是因为在我的项目中,这些点是固定的(其实边界坐标也是固定的,但是为了记录边界坐标的获取方法,我就另外将获取边界点坐标的方法写出来,实际项目使用时运行一次后通过浏览器F12找到返回的json数据,将边界点坐标另外复制下来。网上另文章有说明如何获取以及坐标转换,大家自行搜一下就有了)。

先写一个添加标签覆盖物的函数

该函数需要传入三个参数,分别是经度、纬度和显示文本

function addlabel(lon,lat,text) {
	     var opts1 = {
	  position : new BMap.Point(lon,lat),    // 指定文本标注所在的地理位置
           
	}
	var label1 = new BMap.Label(text, opts1);  // 创建文本标注对象
		label1.setStyle({
			 color : "red",
			 fontSize : "20px",
			 height : "20px",
			 lineHeight : "20px",
			 fontFamily:"微软雅黑",
          border:"none"
		 });
         map.addOverlay(label1);  //添加覆盖物
	}

然后调用该函数添加label就行了

至于覆盖物的点击事件,采用addEventListener方法为覆盖物添加点击事件的兼听就行了。

5、全部代码

<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
	<style type="text/css">
		body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
	</style>
	<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"></script>
	<title>添加行政区划</title>
</head>
<body>
	<div id="allmap"></div>
</body>
</html>
<script type="text/javascript">
	// 百度地图API功能
	var map = new BMap.Map("allmap");
	

	function getBoundary(){       
		var bdary = new BMap.Boundary();
		bdary.get("厦门市", function(rs){       //获取行政区域
			map.clearOverlays();        //清除地图覆盖物       
			var count = rs.boundaries.length; //行政区域的点有多少个
			if (count === 0) {
				alert('未能获取当前输入行政区域');
				return ;
			}
          	var pointArray = [];
			for (var i = 0; i < count; i++) {
				var ply = new BMap.Polygon(rs.boundaries[i], {strokeWeight: 2, strokeColor: "#ff0000"}); //建立多边形覆盖物
				map.addOverlay(ply);  //添加覆盖物
				pointArray = pointArray.concat(ply.getPath());
			}    
			map.setViewport(pointArray);    //调整视野  
			//addlabel();               
		});   
      bdary.get("思明区", function(rs){       //获取行政区域
			//map.clearOverlays();        //清除地图覆盖物       
			var count = rs.boundaries.length; //行政区域的点有多少个
			if (count === 0) {
				alert('未能获取当前输入行政区域');
				return ;
			}
          	var pointArray = [];
			for (var i = 0; i < count; i++) {
				var ply = new BMap.Polygon(rs.boundaries[i], {strokeWeight: 2, strokeColor: "#0000ff"}); //建立多边形覆盖物
				map.addOverlay(ply);  //添加覆盖物
				pointArray = pointArray.concat(ply.getPath());
			}    
        addlabel(118.116572,24.470883,"思明区");   
		});   
      bdary.get("集美区", function(rs){       //获取行政区域
			//map.clearOverlays();        //清除地图覆盖物       
			var count = rs.boundaries.length; //行政区域的点有多少个
			if (count === 0) {
				alert('未能获取当前输入行政区域');
				return ;
			}
          	var pointArray = [];
			for (var i = 0; i < count; i++) {
				var ply = new BMap.Polygon(rs.boundaries[i], {strokeWeight: 2, strokeColor: "#0000ff"}); //建立多边形覆盖物
				map.addOverlay(ply);  //添加覆盖物
				pointArray = pointArray.concat(ply.getPath());
			}    
         addlabel(118.003972,24.642993,"集美区");  
			//map.setViewport(pointArray);    //调整视野  
			//addlabel();               
		});   
       bdary.get("湖里区", function(rs){       //获取行政区域
			//map.clearOverlays();        //清除地图覆盖物       
			var count = rs.boundaries.length; //行政区域的点有多少个
			if (count === 0) {
				alert('未能获取当前输入行政区域');
				return ;
			}
          	var pointArray = [];
			for (var i = 0; i < count; i++) {
				var ply = new BMap.Polygon(rs.boundaries[i], {strokeWeight: 2, strokeColor: "#0000ff"}); //建立多边形覆盖物
				map.addOverlay(ply);  //添加覆盖物
				pointArray = pointArray.concat(ply.getPath());
			}    
         addlabel(118.129582,24.544266,"湖里区");  
		});   
      
     
      bdary.get("翔安区", function(rs){       //获取行政区域
			//map.clearOverlays();        //清除地图覆盖物       
			var count = rs.boundaries.length; //行政区域的点有多少个
			if (count === 0) {
				alert('未能获取当前输入行政区域');
				return ;
			}
          	var pointArray = [];
			for (var i = 0; i < count; i++) {
				var ply = new BMap.Polygon(rs.boundaries[i], {strokeWeight: 2, strokeColor: "#0000ff"}); //建立多边形覆盖物
				map.addOverlay(ply);  //添加覆盖物
				pointArray = pointArray.concat(ply.getPath());
			}    
        	addlabel(118.254939,24.624478,"翔安区");  
			//map.setViewport(pointArray);    //调整视野  
			//addlabel();               
		});   
      bdary.get("同安区", function(rs){       //获取行政区域
			//map.clearOverlays();        //清除地图覆盖物       
			var count = rs.boundaries.length; //行政区域的点有多少个
			if (count === 0) {
				alert('未能获取当前输入行政区域');
				return ;
			}
          	var pointArray = [];
			for (var i = 0; i < count; i++) {
				var ply = new BMap.Polygon(rs.boundaries[i], {strokeWeight: 2, strokeColor: "#0000ff"}); //建立多边形覆盖物
				map.addOverlay(ply);  //添加覆盖物
				pointArray = pointArray.concat(ply.getPath());
			}    
        addlabel(118.102394,24.760121,"同安区");  
			//map.setViewport(pointArray);    //调整视野  
			//addlabel();               
		});   
      bdary.get("海沧区", function(rs){       //获取行政区域
			//map.clearOverlays();        //清除地图覆盖物       
			var count = rs.boundaries.length; //行政区域的点有多少个
			if (count === 0) {
				alert('未能获取当前输入行政区域');
				return ;
			}
          	var pointArray = [];
			for (var i = 0; i < count; i++) {
				var ply = new BMap.Polygon(rs.boundaries[i], {strokeWeight: 2, strokeColor: "#0000ff"}); //建立多边形覆盖物
				map.addOverlay(ply);  //添加覆盖物
				pointArray = pointArray.concat(ply.getPath());
			}    
        addlabel(117.989833,24.511764,"海沧区");  
		});   
	}

	setTimeout(function(){
		getBoundary();
	}, 2000);

	function addlabel(lon,lat,text) {
	     var opts1 = {
	  position : new BMap.Point(lon,lat),    // 指定文本标注所在的地理位置
           
	}
	var label1 = new BMap.Label(text, opts1);  // 创建文本标注对象
		label1.setStyle({
			 color : "red",
			 fontSize : "20px",
			 height : "20px",
			 lineHeight : "20px",
			 fontFamily:"微软雅黑",
          border:"none"
		 });
         map.addOverlay(label1);  //添加覆盖物
	}
</script>

这种方法应该还存在许多不足之处,如有更好方法欢迎分享!

猜你喜欢

转载自blog.csdn.net/zinechina/article/details/89476972