openlayer5 半径不准 画圆_Openlayers手动绘制圆形(v2.13)

本文介绍了如何使用OpenLayers 5创建一个控制来手动绘制圆形,并解决了半径不准确的问题。通过监听拖动事件,计算宽度和高度以确定圆的半径,然后创建并显示正多边形来模拟圆形。当绘制结束时,方法会自动清除之前的圆形,除非修改了`removeBox`部分的代码。
摘要由CSDN通过智能技术生成

该方法绘制结束后会自动清除已经绘制的圆,如需保留的话修改方法中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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值