百度地图画圆、矩形、多边形,并判断点是否在矩形或圆内部

本文是按照“定位——>画圆或画矩形——>判断点是否在圆内或矩形内部”这样的思路编排的。

一,首先是定位。

先定义6个百度坐标点,然后在坐标点上创建对应的marker,再通过map.addOverlay(marker)方法将6个marker定位在百度地图中,并利用marker.disableMassClear()方法设置marker为不可被清除,最后为marker添加鼠标滑过事件。具体如下:

// 初始化百度地图
var map = new BMap.Map('map');
map.centerAndZoom(new BMap.Point(116.3875773621, 39.9156402091), 6);	//初始化地图,设置中心点坐标和地图级别
map.enableScrollWheelZoom();	//开启鼠标滚轮缩放

//被定位在地图中的6个点
var locPoints = [
		new BMap.Point(108.574138248194, 34.197235684692),
		new BMap.Point(108.683296262141, 33.877960833917),
		new BMap.Point(108.518062680055, 38.057251109697),
		new BMap.Point(108.546627635172, 38.312875770488),
		new BMap.Point(109.151927017928, 34.686473580787),
		new BMap.Point(108.411427712714, 33.266286514603)
	];
				 
//将6个点定位在地图中
locPoints.forEach(function(value) {  
	var locMarkers;
	locMarkers = new BMap.Marker(value);

	map.addOverlay(locMarkers);		//将标注添加到地图中
	
	locMarkers.disableMassClear();	//设置marker不可被清除
	
	locMarkers.addEventListener("mouseover",function (e) {
		openDataInfo(value, e);
	});  
});

//鼠标滑过marker事件
function openDataInfo(result, e) {
	var carOpts = {
			width : 200,     // 信息窗口宽度
			height: 120,     // 信息窗口高度
			title : "<b>设备信息</b>" , // 信息窗口标题
			enableMessage:true	//设置允许信息窗发送短息
		};
	
	var p = e.target;
	
	var point = new BMap.Point(p.getPosition().lng, p.getPosition().lat);
	
	carContent = '<br/><table><thead>'+
		'<tr><th><label>快速操作:</label><a οnclick="showOrderTrackDiv()"><span style="color:#478FCA; margin-left:15px;">轨迹回放</span></a></th></tr></thead><tbody>'+
		'<tr><td>经度:'+p.getPosition().lng+'</td></tr><tr><td>纬度:'+p.getPosition().lat+'</td></tr>'+
		'</tbody></table></div>';
	
	var infoWindow = new BMap.InfoWindow(carContent, carOpts); // 创建信息窗口对象   
	map.openInfoWindow(infoWindow, point); //开启信息窗口  
}

//轨迹回放函数
function showOrderTrackDiv(){
	alert("轨迹回放函数");
}

二,画圆、矩形、多边形

首先得包含百度地图鼠标绘制工具的css和js,如下:

<!--加载鼠标绘制工具-->
<script type="text/javascript" src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"></script>
<!--加载鼠标绘制工具-->
<link rel="stylesheet" href="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css" />

然后定义一个绘制样式,并实例化鼠标绘制工具,最后为鼠标绘制工具添加鼠标绘制完成后的回调方法。具体如下:

var styleOptions = {
	strokeColor:"black",    //边线颜色。
	fillColor:"red",      //填充颜色。当参数为空时,圆形将没有填充效果。
	strokeWeight: 3,       //边线的宽度,以像素为单位。
	strokeOpacity: 0.8,	   //边线透明度,取值范围0 - 1。
	fillOpacity: 0.6,      //填充的透明度,取值范围0 - 1。
	strokeStyle: 'solid' //边线的样式,solid或dashed。
}

//实例化鼠标绘制工具
var myDrawingManagerObject = new BMapLib.DrawingManager(map, {
	isOpen: false, //是否开启绘制模式
	enableDrawingTool: true, //是否显示工具栏
	drawingToolOptions: {
		anchor: BMAP_ANCHOR_TOP_RIGHT, //位置
		offset: new BMap.Size(5, 5), //偏离值
	},
	circleOptions: styleOptions, //圆的样式
	polylineOptions: styleOptions, //线的样式
	polygonOptions: styleOptions, //多边形的样式
	rectangleOptions: styleOptions //矩形的样式
});

 //添加鼠标绘制工具监听事件,用于获取绘制结果
myDrawingManagerObject.addEventListener('overlaycomplete', overlaycomplete);

三, 判断点是否在圆内或矩形内

在鼠标绘制完成的回调方法中,利用BMapLib.GeoUtils.isPointInCircle(point, circleObject)判断点是否在圆内,或者利用BMapLib.GeoUtils.isPointInPolygon(point, polygonObject)判断点是否在矩形内。

在利用isPointInCircle或isPointInPolygon方法时,需在页面中包含GeoUtils_min.js。如下:

<script type="text/javascript" src="http://api.map.baidu.com/library/GeoUtils/1.2/src/GeoUtils_min.js"></script>

具体如下:

function overlaycomplete(e){
	
	var cirCount = 0;
	var polyCount = 0;
	
	myDrawingManagerObject.close();		//关闭画图
	
	var drawingModeType = e.drawingMode;	//获取所画图形类型
	
	locPoints.forEach(function(value) {
		if (drawingModeType == "circle") {
			//圆
			if(BMapLib.GeoUtils.isPointInCircle(value, e.overlay)) {  
				cirCount++;
			}  
		} else if (drawingModeType == "rectangle" || drawingModeType == "polygon") {
			//矩形  或  多边形
			if(BMapLib.GeoUtils.isPointInPolygon(value, e.overlay)) {
				polyCount++;
			}
		}
	});
	
	alert("圆中包含"+cirCount+"个定位点,多边形或矩形中包含"+polyCount+"个定位点。");
				
	map.removeOverlay(e.overlay);	//画完后清除所画对象
}

最终效果如下图所示:



鼠标滑过marker效果如下图所示:


至此,如何在百度地图中画圆、画矩形、画多边形,并且判断坐标点是否在圆内、矩形内的功能就已经完成了。

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
: ```c++ glBegin(GL_POINTS); // 告诉 OpenGL 接下来要 glVertex2f(x, y); // 一个,坐标为 (x, y) glEnd(); // 结束过程 ``` 折线: ```c++ glBegin(GL_LINE_STRIP); // 告诉 OpenGL 接下来要一条折线 glVertex2f(x1, y1); // 第一个的坐标 glVertex2f(x2, y2); // 第二个的坐标 glVertex2f(x3, y3); // 第三个的坐标 // ... glEnd(); // 结束折线过程 ``` 画圆: ```c++ glBegin(GL_POLYGON); // 告诉 OpenGL 接下来要一个多边形 for (int i = 0; i < 360; i++) { // 360 条线段组成的 float angle = i * 3.1415926 / 180.0; // 将角度转换为弧度 float x = r * cos(angle) + cx; // 计算的 x 坐标 float y = r * sin(angle) + cy; // 计算的 y 坐标 glVertex2f(x, y); // 将上的加入多边形集中 } glEnd(); // 结束画圆过程 ``` 矩形: ```c++ glBegin(GL_POLYGON); // 告诉 OpenGL 接下来要一个多边形 glVertex2f(x1, y1); // 左下角的 glVertex2f(x1, y2); // 左上角的 glVertex2f(x2, y2); // 右上角的 glVertex2f(x2, y1); // 右下角的 glEnd(); // 结束矩形过程 ``` 三角形: ```c++ glBegin(GL_TRIANGLES); // 告诉 OpenGL 接下来要三角形 glVertex2f(x1, y1); // 第一个的坐标 glVertex2f(x2, y2); // 第二个的坐标 glVertex2f(x3, y3); // 第三个的坐标 glEnd(); // 结束三角形过程 ``` 多边形: ```c++ glBegin(GL_POLYGON); // 告诉 OpenGL 接下来要一个多边形 glVertex2f(x1, y1); // 第一个的坐标 glVertex2f(x2, y2); // 第二个的坐标 glVertex2f(x3, y3); // 第三个的坐标 // ... glEnd(); // 结束多边形过程 ``` 利用状态模式实现不同交互方式的控制: ```c++ class InteractionState { public: virtual void onMouseClick(int x, int y) = 0; virtual void onMouseMove(int x, int y) = 0; }; class SelectState : public InteractionState { public: void onMouseClick(int x, int y) { // 处理选择操作 } void onMouseMove(int x, int y) { // 处理鼠标移动操作 } }; class DrawState : public InteractionState { public: void onMouseClick(int x, int y) { // 处理绘制操作 } void onMouseMove(int x, int y) { // 处理鼠标移动操作 } }; class InteractionController { private: InteractionState* state; public: void setState(InteractionState* newState) { state = newState; } void onMouseClick(int x, int y) { state->onMouseClick(x, y); } void onMouseMove(int x, int y) { state->onMouseMove(x, y); } }; ``` 使用时,可以根据用户的操作设置不同的状态: ```c++ InteractionController controller; controller.setState(new SelectState()); // 设置选择状态 controller.onMouseClick(x, y); // 处理鼠标击事件 controller.onMouseMove(x, y); // 处理鼠标移动事件 controller.setState(new DrawState()); // 设置绘制状态 controller.onMouseClick(x, y); // 处理鼠标击事件 controller.onMouseMove(x, y); // 处理鼠标移动事件 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值