百度地图绘制多边形,展示多边形,计算多边形内障碍物个人,设置不同的状态

今天开始研究百度地图,主要是描绘各景点区域,然后根据区域的游客数量来判断当前景点的拥挤状态,不多说了,先看看效果图

这是展示效果,用了轮询的方法,每过几秒就访问一下接口,实时更新景区整体的人员流动情况。

代码如下(关键代码有注释,因为有接口,不能直接使用,可以参考):

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html dir="ltr" lang="en">

<head>
<%@ include file="common.jsp"%>
 	<script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak=${ak }"></script>
 	<!--加载计算工具-->
    <script type="text/javascript" src="http://api.map.baidu.com/library/GeoUtils/1.2/src/GeoUtils_min.js"></script>
</head>

<body>
	<!-- ============================================================== -->
	<!-- Preloader - style you can find in spinnero.css -->
	<!-- ============================================================== -->
	<div class="preloader">
		<div class="lds-ripple">
			<div class="lds-pos"></div>
			<div class="lds-pos"></div>
		</div>
	</div>
	<!-- ============================================================== -->
	<!-- Main wrapper - style you can find in pageo.scss -->
	<!-- ============================================================== -->
	<div id="main-wrapper" data-navbarbg="skin6" data-theme="light"
		data-layout="vertical" data-sidebartype="full"
		data-boxed-layout="full">
		<!-- ============================================================== -->
		<!-- Topbar header - style you can find in pageo.scss -->
		<!-- ============================================================== -->
		<%@ include file="leftmenu.jsp"%>
		<!-- ============================================================== -->
		<!-- ============================================================== -->
		<!-- Page wrapper  -->
		<!-- ============================================================== -->
		<div class="page-wrapper">
			<!-- ============================================================== -->
			<!-- Bread crumb and right sidebar toggle -->
			<!-- ============================================================== -->

			<!-- ============================================================== -->
			<!-- End Bread crumb and right sidebar toggle -->
			<!-- ============================================================== -->
			<!-- ============================================================== -->
			<!-- Container fluid  -->
			<!-- ============================================================== -->
			<div class="container-fluid">
				<!-- ============================================================== -->
				<!-- Start Page Content -->
				<!-- ============================================================== -->
				<!-- Row -->
				<div class="row">
					<div class="col-12">
						<div class="card">
							<div class="card-body">
								<h4 class="card-tname">景区实时概况
								 
								
							</h4>
								
								 
								  
								<div id="allmap" style="height:500px;width:100%;">	
								</div>
								 
								 
							 
            
							 
							</div>

						</div>

					</div>

				</div>
				<!-- Row -->
				<!-- ============================================================== -->
				<!-- End PAge Content -->
				<!-- ============================================================== -->
				<!-- ============================================================== -->
				<!-- Right sidebar -->
				<!-- ============================================================== -->
				<!-- .right-sidebar -->
				<!-- ============================================================== -->
				<!-- End Right sidebar -->
				<!-- ============================================================== -->
			</div>
			<!-- ============================================================== -->
			<!-- End Container fluid  -->
			<!-- ============================================================== -->
			<!-- ============================================================== -->
		</div>
		<!-- ============================================================== -->
		<!-- End Page wrapper  -->
		<!-- ============================================================== -->
	</div>



 

 
</body>
<script type="text/javascript">
//百度地图API功能
 
 
var map = new BMap.Map("allmap");
var f=1;
getallmap(); 
setInterval(function(){
	f=0;
	getallmap();  
}, 6000)



 

 
 
function getallmap(){
 $.ajax({
		type : "post",
		url : '${ctx}/scenic/getallmap',
		data : {},
		dataType : "json",
		success : function(data) {
			map.clearOverlays();
			
			if(data.status==1){
				var tli=data.obj.tli;
				for(var i=0;i<tli.length;i++){
					var o=tli[i];
					if($.trim(o.lon).length>0&&$.trim(o.lat).length>0){
						//添加自定义图片
						var myIcon = new BMap.Icon("${ctx}/xcx/img/tourist_marker.png", new BMap.Size(52, 26));
						var marker1 = new BMap.Marker(new BMap.Point(o.lon,o.lat), {
							icon: myIcon
						});  // 创建标注 
						map.addOverlay(marker1); 
					}
				}
				
				
				var li=data.obj.sli;
				for(var i=0;i<li.length;i++){
					var o=li[i];
					if($.trim(o.points).length>0){
						 var arr=o.points.split('@');
						 var ps=[];
						 for(var j=0;j<arr.length;j++){
							 if(i==0&&j==0&&f==1){
								 //第一个多边形的第一个坐标为图标显示位置
								 var point = new BMap.Point(arr[j].split(',')[0],arr[j].split(',')[1] );
								 map.centerAndZoom(point, 16);
								 map.enableScrollWheelZoom(); 
							 }
							 ps[j]=new BMap.Point(arr[j].split(',')[0],arr[j].split(',')[1]);
						 }
						//声明多边形对象
						 var polygon = new BMap.Polygon(ps, {strokeColor:"blue", strokeWeight:2, strokeOpacity:0.2, fillColor:"red"  });  //创建多边形
						
						//计算游客坐标是否在多边形区域内
						var tli=data.obj.tli;
						 //计算区域内人数
						var pnum=0;
						for(var k=0;k<tli.length;k++){
							var ot=tli[k];
							if($.trim(ot.lon).length>0&&$.trim(ot.lat).length>0){
								var t=BMapLib.GeoUtils.isPointInPolygon(new BMap.Point(ot.lon,ot.lat),polygon);
								if(t)pnum++;
							}
						}
						
						var co="blue";var st="<b style='color:"+co+"'>空旷</b>";
						if(pnum<=o.open_num){co="green";st="<b style='color:"+co+"'>空旷</b>";}
						if(pnum>o.open_num&&pnum<=o.normal_num){co="blue";st="<b style='color:"+co+"'>正常</b>";}
						if(pnum>o.normal_num&&pnum<=o.crowd_num){co="orange";st="<b style='color:"+co+"'>拥挤</b>";}
						if(pnum>o.crowd_num){co="red";st="<b style='color:"+co+"'>爆满</b>";}
						
						//申明障碍物标记点(多边形第一个坐标)
						var marker = new BMap.Marker(new BMap.Point(arr[0].split(',')[0],arr[0].split(',')[1])) ;
						map.addOverlay(marker);
						//申明障碍物标记点(多边形第一个坐标)上添加文字说明
						var label = new BMap.Label(o.tname+"<br>简介:"+o.tdesc+"<br>游客人数:"+pnum+"人<br>状态:"+st,{offset:new BMap.Size(20,-10)});
						marker.setLabel(label);
						
						//声明多边形对象
						 polygon = new BMap.Polygon(ps, {strokeColor:co, strokeWeight:2, strokeOpacity:0.2, fillColor:co });  //创建多边形
						//添加覆盖物
						 map.addOverlay(polygon);
						
					}
				}
				
				
				
				 
			} else{
				if(f==1)alert(data.msg);
			}
		}
	})	 
} 	

//单击获取点击的经纬度,测试使用
map.addEventListener("click",function(e){
	console.log(e.point.lng);
	console.log(e.point.lat);
});
</script>
</html>

接下来是多边形绘制的功能,根据关键词搜索,定位到目标地址,然后绘制,先看看效果图

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html dir="ltr" lang="en">

<head>
<%@ include file="common.jsp"%>
<script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak=${ak}"></script>
<!--加载鼠标绘制工具-->
	<script type="text/javascript" src="//api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"></script>
	<link rel="stylesheet" href="//api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css" />
	<!--加载检索信息窗口-->
	<script type="text/javascript" src="//api.map.baidu.com/library/SearchInfoWindow/1.4/src/SearchInfoWindow_min.js"></script>
	<link rel="stylesheet" href="//api.map.baidu.com/library/SearchInfoWindow/1.4/src/SearchInfoWindow_min.css" />

	<style type="text/css">
	 
	#allmap {width: 100%; height:500px; overflow: hidden;}
	#result {width:100%;font-size:12px;}
	dl,dt,dd,ul,li{
		margin:0;
		padding:0;
		list-style:none;
	}
	p{font-size:12px;}
	dt{
		font-size:14px;
		font-family:"微软雅黑";
		font-weight:bold;
		border-bottom:1px dotted #000;
		padding:5px 0 5px 5px;
		margin:5px 0;
	}
	dd{
		padding:5px 0 0 5px;
	}
	li{
		line-height:28px;
	}
	</style>

</head>

<body>
	<!-- ============================================================== -->
	<!-- Preloader - style you can find in spinnero.css -->
	<!-- ============================================================== -->
	<div class="preloader">
		<div class="lds-ripple">
			<div class="lds-pos"></div>
			<div class="lds-pos"></div>
		</div>
	</div>
	<!-- ============================================================== -->
	<!-- Main wrapper - style you can find in pageo.scss -->
	<!-- ============================================================== -->
	<div id="main-wrapper" data-navbarbg="skin6" data-theme="light"
		data-layout="vertical" data-sidebartype="full"
		data-boxed-layout="full">
		<!-- ============================================================== -->
		<!-- Topbar header - style you can find in pageo.scss -->
		<!-- ============================================================== -->
		<%@ include file="leftmenu.jsp"%>
		<!-- ============================================================== -->
		<!-- ============================================================== -->
		<!-- Page wrapper  -->
		<!-- ============================================================== -->
		<div class="page-wrapper">
			<!-- ============================================================== -->
			<!-- Bread crumb and right sidebar toggle -->
			<!-- ============================================================== -->

			<!-- ============================================================== -->
			<!-- End Bread crumb and right sidebar toggle -->
			<!-- ============================================================== -->
			<!-- ============================================================== -->
			<!-- Container fluid  -->
			<!-- ============================================================== -->
			<div class="container-fluid">
				<!-- ============================================================== -->
				<!-- Start Page Content -->
				<!-- ============================================================== -->
				<!-- Row -->
				<div class="row">
					<div class="col-12">
						<div class="card">
							<div class="card-body">
								<h4 class="card-tname">${o.tname }-标记景区地图<small style="margin-left: 20px;"><a data-toggle="modal" data-target="#myModal" href="javascript;" style="color:red;">使用说明</a></small>
								
								
									<a  href="${ctx }/scenic/page?pageNo=${pageNo}" style="font-size:10px;float:right;color:#888888;"><<返回列表</a>
								</h4>
								
								<div style="position: absolute;z-index:1;width:400px;margin-top: 10px;margin-left: 10px;">
									<input id="suggestId" type="text" class="form-control" id="firstname" style="width: 99%;" placeholder="请输入关键词快速定位目标地址">
									<span class="mdi mdi-magnify" style="position: absolute;z-index: 2;right: 30px;margin-top: -28px;"></span>
									<div id="searchResultPanel" style="border:1px solid #C0C0C0;width:150px;height:auto; display:none;"></div>
								</div>
								  
								<div id="allmap" style="overflow:hidden;zoom:1;position:relative;">	
									<div id="map" style="height:100%;-webkit-transition: all 0.5s ease-in-out;transition: all 0.5s ease-in-out;"></div>
								</div>
								<div id="result">
									<input type="button" value="清除标记" onclick="clearAll()" class="btn btn-danger btn-xs"/>
									<input type="button" value="标记完成" onclick="savepoints()" class="btn btn-success btn-xs"/>
								</div>
								 
								
							 
							</div>

						</div>

					</div>

				</div>
				<!-- Row -->
				<!-- ============================================================== -->
				<!-- End PAge Content -->
				<!-- ============================================================== -->
				<!-- ============================================================== -->
				<!-- Right sidebar -->
				<!-- ============================================================== -->
				<!-- .right-sidebar -->
				<!-- ============================================================== -->
				<!-- End Right sidebar -->
				<!-- ============================================================== -->
			</div>
			<!-- ============================================================== -->
			<!-- End Container fluid  -->
			<!-- ============================================================== -->
			<!-- ============================================================== -->
		</div>
		<!-- ============================================================== -->
		<!-- End Page wrapper  -->
		<!-- ============================================================== -->
	</div>



<!-- 模态框(Modal) -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                <h4 class="modal-title" id="myModalLabel">使用说明</h4>
            </div>
            <div class="modal-body">
            	<h5>地图使用说明:</h5>
            	<p style="text-indent: 2em;">使用之前,请务必好好阅读该说明,方便您更快更好的使用该软件哦。使用说明如下:</p>
            	 <p style="text-indent: 2em;"><-  滚动鼠标可缩放地图;</p>
            	 <p style="text-indent: 2em;"><-  可以先搜索目标地址;</p>
            	 <p style="text-indent: 2em;"><-  选择地图右上角的多边形图标来标记景点区域;</p>
            	 <p style="text-indent: 2em;"><-  请双击鼠标结束地图的标记;</p>
            	 <p style="text-indent: 2em;"><-  如果需要重新标记,请点击地图下面的‘清除标记’;</p>
            	 <p style="text-indent: 2em;"><-  标记完成,请点击地图下面的‘标记完成’按钮来提交数据。</p>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
            </div>
        </div><!-- /.modal-content -->
    </div><!-- /.modal -->
</div>


<form action="${ctx }/scenic/save_map?id=${o.id}&pageNo=${pageNo}" method="post" style="display: none;">
	<input type="hidden" value="" name="points"   id="s_points">
	<input type="submit"  id="s_sj">
</form>
</body>
<script type="text/javascript">
// 百度地图API功能,绘制多边形===============================
    var map = new BMap.Map('map');
	var poi=new BMap.Point(116.307852,40.057031);
	
	 
    	 
    map.centerAndZoom(poi, 16);
    map.enableScrollWheelZoom();  
    
    
    var overlays = [];
	 
    var styleOptions = {
        strokeColor:"red",    //边线颜色。
        fillColor:"red",      //填充颜色。当参数为空时,圆形将没有填充效果。
        strokeWeight: 3,       //边线的宽度,以像素为单位。
        strokeOpacity: 0.8,	   //边线透明度,取值范围0 - 1。
        fillOpacity: 0.6,      //填充的透明度,取值范围0 - 1。
        strokeStyle: 'solid' //边线的样式,solid或dashed。
    }
    //实例化鼠标绘制工具
    var drawingManager = new BMapLib.DrawingManager(map, {
        isOpen: false, //是否开启绘制模式
        enableDrawingTool: true, //是否显示工具栏
        drawingToolOptions: {
            anchor: BMAP_ANCHOR_TOP_RIGHT, //位置
            offset: new BMap.Size(5, 5), //偏离值
            drawingModes : [
                            //BMAP_DRAWING_MARKER,
                            //BMAP_DRAWING_CIRCLE,
                           // BMAP_DRAWING_POLYLINE,
                            BMAP_DRAWING_POLYGON,
                           // BMAP_DRAWING_RECTANGLE 
                         ]
        },
        circleOptions: styleOptions, //圆的样式
        polylineOptions: styleOptions, //线的样式
        polygonOptions: styleOptions, //多边形的样式
        rectangleOptions: styleOptions //矩形的样式
    });  
     
    var pp="";
	 //添加鼠标绘制工具监听事件,用于获取绘制结果
     drawingManager.addEventListener("overlaycomplete", function(e) {
    	 overlays.push(e.overlay);
         var path = e.overlay.getPath();//Array<Point> 返回多边型的点数组
         for(var i=0;i<path.length;i++){
             console.log("lng:"+path[i].lng+"\n lat:"+path[i].lat);
             pp+="["+path[i].lng+","+path[i].lat+"]";
         }  
         $('#s_points').val(pp);
     });
	 
    
    function clearAll() {
		for(var i = 0; i < overlays.length; i++){
            map.removeOverlay(overlays[i]);
        }
        overlays.length = 0   
    }
 
    function savepoints(){
    	var len=overlays.length;
    	if(len==0){
    		alert('请标记区域');return ;
    	}
    	if(len>1){
    		alert('请标记一个区域');return ;
    	}
    	$('#s_sj').click();
    }
 
    //关键词检索===========================================
    var ac = new BMap.Autocomplete(    //建立一个自动完成的对象
		{"input" : "suggestId"
		,"location" : map
	});

	ac.addEventListener("onhighlight", function(e) {  //鼠标放在下拉列表上的事件
	var str = "";
		var _value = e.fromitem.value;
		var value = "";
		if (e.fromitem.index > -1) {
			value = _value.province +  _value.city +  _value.district +  _value.street +  _value.business;
		}    
		str = "FromItem<br />index = " + e.fromitem.index + "<br />value = " + value;
		
		value = "";
		if (e.toitem.index > -1) {
			_value = e.toitem.value;
			value = _value.province +  _value.city +  _value.district +  _value.street +  _value.business;
		}    
		str += "<br />ToItem<br />index = " + e.toitem.index + "<br />value = " + value;
		G("searchResultPanel").innerHTML = str;
	});

	var myValue;
	ac.addEventListener("onconfirm", function(e) {    //鼠标点击下拉列表后的事件
	var _value = e.item.value;
		myValue = _value.province +  _value.city +  _value.district +  _value.street +  _value.business;
		G("searchResultPanel").innerHTML ="onconfirm<br />index = " + e.item.index + "<br />myValue = " + myValue;
		
		setPlace();
	});

	function setPlace(){
		map.clearOverlays();    //清除地图上所有覆盖物
		function myFun(){
			var pp = local.getResults().getPoi(0).point;    //获取第一个智能搜索的结果
			map.centerAndZoom(pp, 18);
			map.addOverlay(new BMap.Marker(pp));    //添加标注
		}
		var local = new BMap.LocalSearch(map, { //智能搜索
		  onSearchComplete: myFun
		});
		local.search(myValue);
	}
	function G(id) {
		return document.getElementById(id);
	}
	
	
	 
	
</script>
</html>

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值