Openlayers手动绘制圆形(v2.13)

Openlayers(v2.13)自带手动绘制矩形、多边形等图形的方法,方便快捷,但是并没有绘制圆的方法,在开发时根据API中的Box编写了手动绘圆的方法。此方法绘制的圆以鼠标拖动出的矩形较短的一条边为半径,与Windows中画图工具的画圆原理类似。

该方法绘制结束后会自动清除已经绘制的圆,如需保留的话修改方法中remove的部分即可。代码如下:

	var gPolygon = null;
	if (!layer.CIRCLEHADNLER) {
		var layerCircleControl = new OpenLayers.Control();
		OpenLayers.Util.extend(layerCircleControl, {
			draw : function() {
				layer.CIRCLEHANDLER = new OpenLayers.Handler.Box(layerCircleControl, null, {
					startBox: null,
					moveBox:function(xy){
						var start = this.map.getLonLatFromPixel(this.dragHandler.start);
						var last = this.map.getLonLatFromPixel(xy);
						var width = Math.abs(start.lon-last.lon);
						var height = Math.abs(start.lat-last.lat);
						var radius,originX,originY;
						if(width <= height){
							radius = width/2;
							originX = start.lon+(last.lon-start.lon)/2;
							if(start.lat - last.lat <= 0){
								originY = start.lat + radius;
							}else{
								originY = start.lat - radius;
							}
						}else{
							radius = height/2;
							if(start.lon - last.lon <=0){
								originX = start.lon + radius;
							}else{
								originX = start.lon - radius;
							}
							originY = start.lat+(last.lat-start.lat)/2;
						}
						var origin = new OpenLayers.Geometry.Point(originX,originY);
						var feature = OpenLayers.Geometry.Polygon.createRegularPolygon(origin, radius, 40, 0);
						if(gPolygon){
							layer.destroyFeatures(gPolygon);
							gPolygon = null;
						}						gPolygon = new OpenLayers.Feature.Vector(feature, null, style);
						if(!gPolygon){
							return;
						}
						layer.addFeatures([gPolygon]);
					},
					endBox: function(){
						//将gPolygon作为参数执行业务方法					},
			    	removeBox: function(){
						if(gPolygon){
							layer.destroyFeatures(gPolygon);
							gPolygon = null;
						}
			        }
				});
			}
		});
		this.getAbstractMap().getMap().addControl(layerCircleControl);
		var handler = layer.CIRCLEHANDLER.dragHandler;
        		handler.dragstart = function(evt){
            		var propagate = true;
            		handler.dragging = false;
            		if (handler.checkModifiers(evt) && (OpenLayers.Event.isLeftClick(evt) ||
                    		OpenLayers.Event.isSingleTouch(evt))) {
            			handler.started = true;
            			handler.start = evt.xy;
            			handler.last = evt.xy;
               			OpenLayers.Element.addClass(handler.map.viewPortDiv, "olDragDown");
                			handler.down(evt);
                			handler.callback("down", [evt.xy]);
                			OpenLayers.Event.preventDefault(evt);
                			if(!handler.oldOnselectstart) {
                			handler.oldOnselectstart = document.onselectstart ? document.onselectstart : OpenLayers.Function.True;
                			}
                			document.onselectstart = OpenLayers.Function.False;
                			propagate = !handler.stopDown;
            		}
            		return propagate;
        		}
	}
	layer.ADD_CIRCLE_HANDLER.activate();

时间: 2024-08-08 22:05:39

Openlayers手动绘制圆形(v2.13)的相关文章

Breaseman算法绘制圆形|中点算法绘制圆形_程序片段

Breaseman算法绘制圆形|中点算法绘制圆形_程序片段 1. Breaseman算法绘制圆形程序 由于算法的特殊性,限制绘制第一象限部分,其他部分通过旋转绘制. 1 void CCGProjectWorkView::bresenHam_1P4Circle(int radium, const float lineColor[]) 2 { 3 int pointX, pointY, deltD, deltHD, deltDV, direction; 4 pointX = 0; 5 pointY

项目中遇到的问题-2:编译第三方静态库报错、查看静态库的类型、绘制圆形

这一周比较折腾,由于项目应用涉及到和其他产品线APP的互相通信,在高层领导英(yi)明(ta)神(hu)武(tu)的战略指导下,我开始了与其他组同事的联调之旅.这几天鄙司负责产品的上级同事莅临监工,对现在的情况又提出了一些改进,作为一名程序猿,我已经奉上我的双膝... 一.集成公司其他组的.a静态库,报错:duplicate symbole for architectecture i386 XXX  查了一下报错的地方,都是指示.a的库和工程里面某些.m文件冲突,正好同事提到之前有碰到过这种情况

html5 canvas绘制圆形印章,以及与页面交互

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>HTML5 Canvas画印章</title> 6 <script type="text/javascript" src="../JQmain/jquery-2.2.0.min.js"></script> 7 &l

使用html5 canvas绘制圆形或弧线

注意:本文属于<html5 Canvas绘制图形入门详解>系列文章中的一部分.如果你是html5初学者,仅仅阅读本文,可能无法较深入的理解canvas,甚至无法顺畅地通读本文.请点击上述链接以了解使用html5 canvas绘制图形的完整内容. 在html5中,CanvasRenderingContext2D对象也提供了专门用于绘制圆形或弧线的方法,请参考以下属性和方法介绍: arc(x, y, radius, startRad, endRad, anticlockwise) 在canvas画

quartz2D 如何绘制圆形图片, 及圆环图片

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://e.hiphotos.baidu.com/lvpics/w=600/sign=eeeff27ca10f4bfb8cd09d54334d788f/267f9e2f0708283873d

Cocos2d-x之绘制圆形

自定义的方法 Circle.h 1 // 2 // Circle.h 3 // L01DrawingAPI 4 // 5 // Created by Mac OS 10.9.3 on 15-3-30. 6 // 7 // 8 9 #ifndef __L01DrawingAPI__Circle__ 10 #define __L01DrawingAPI__Circle__ 11 12 #include <iostream> 13 #include <cocos2d.h> 14 15 u

在DrawingVisual上绘制圆形的进度条,类似于IOS系统风格。

1.说明:在WPF中,文件下载时需要显示下载进度,由于系统自带的条型进度条比较占用空间,改用圆形的进度条,需要在DrawingVisual上呈现. 运行的效果如图: private Point GetPointOnCir(Point CenterPoint, double r, double angel) { Point p = new Point(); p.X = Math.Sin(angel * Math.PI / 180) * r + CenterPoint.X; p.Y = Center

SkylineGlobe 如何实现绘制圆形Polygon和对图层的圆形范围选择查询

//结束绘制圆形之前,得到Polygon var pos = gPolyObj.Position; var bufferR = gPolyObj.Radius; var cVerticesArray = [-122.415025, 37.76059, 10, ]; var point = sgworld.Creator.GeometryCreator.CreatePointGeometry(cVerticesArray); point.X = pos.X; point.Y = pos.Y; po

绘制圆形椭圆

/**绘制圆形*/ CGContextRef contextRef=UIGraphicsGetCurrentContext(); CGContextAddArc(contextRef, 150, 300, 100, 0, 3.14*2, 0); CGContextStrokePath(contextRef); /**绘制椭圆*/ CGContextAddEllipseInRect(contextRef, CGRectMake(50, 400, 200, 100)); CGContextStrok