前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >openlayers实现画圆

openlayers实现画圆

作者头像
lzugis
发布2018-10-23 14:47:44
3.1K0
发布2018-10-23 14:47:44
举报

概述:

本文讲述如何在openlayers中实现画圆。

效果:

实现思路:

1、画中心点

通过OpenLayers.Control.DrawFeature和OpenLayers.Handler.Point实现在地图上画圆心。

2、移动鼠标设置半径

画点结束后,激活地图的鼠标移动事件,获取圆心到鼠标点的距离,并画圆,将结果展示到地图上。

3、点击地图结束绘制

点击地图,结束绘制,将最终结果展示到地图上,并停止地图的鼠标移动事件。

实现代码:

代码语言:javascript
复制
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>china EPSG:4326 image/png</title>
    <link rel="stylesheet" type="text/css" href="http://localhost/olapi/theme/default/style.css"/>
    <style type="text/css">
        body { font-family: sans-serif; font-weight: bold; font-size: .8em; }
        body { border: 0px; margin: 0px; padding: 0px; }
        #map { width: 100%; height: 100%; border: 0px; padding: 0px; }
        .query-box{
            position: absolute;
            top: 15pt;
            right: 15pt;
            z-index:1001;
            border: 1px solid #ff0000;
            border-radius: 3px;
            background: #f2f2f2;
            padding: 5px 8px;
            font-family: "Trebuchet MS", Helvetica, Arial, sans-serif;
        }
    </style>
    <script type="text/javascript" src="http://localhost/olapi/OpenLayers.js"></script>
    <script type="text/javascript" src="http://localhost/olapi/lib/OpenLayers/Lang/zh-CN.js"></script>
    <script src="http://localhost/jquery/jquery-1.8.3.js"></script>
    <script src="circle.js"></script>
    <script type="text/javascript">
        var map, wfs;
        function init(){
            var bounds = new OpenLayers.Bounds(
                    87.57582859314434, 19.969920291221204,
                    126.56713756740385, 45.693810203800794
            );
            var options = {
                controls: [],
                maxExtent: bounds,
                maxResolution: 0.1523098006807012,
                projection: "EPSG:4326",
                units: 'degrees'
            };
            map = new OpenLayers.Map('map', options);


            var tiled = new OpenLayers.Layer.WMS(
                    "province", "http://localhost:8081/geoserver/lzugis/wms",
                    {
                        "LAYERS": 'province',
                        "STYLES": '',
                        format: 'image/png'
                    },
                    {
                        buffer: 0,
                        displayOutsideMaxExtent: true,
                        isBaseLayer: true,
                        yx : {'EPSG:4326' : true}
                    }
            );
            map.addLayer(tiled);
            map.addControl(new OpenLayers.Control.PanZoomBar({
                position: new OpenLayers.Pixel(2, 15)
            }));
            map.addControl(new OpenLayers.Control.Navigation());
            map.zoomToExtent(bounds);
            var drawLayer = new OpenLayers.Layer.Vector("drawLayer",{
                styleMap: new OpenLayers.StyleMap()
            });
            var showLayer = new OpenLayers.Layer.Vector("showLayer",{
                styleMap: new OpenLayers.StyleMap({'default':{
                 strokeColor: "#ff0000",
                 strokeOpacity: 1,
                 strokeWidth: 1,
                 fillColor: "#000000",
                 fillOpacity: 0.1
                 }})
            });
            map.addLayers([drawLayer,showLayer]);
            var drawCtrl = new OpenLayers.Control.DrawFeature(drawLayer, OpenLayers.Handler.Point);
            map.addControl(drawCtrl);
            drawCtrl.featureAdded = onEndDraw;
            function onEndDraw(feature){
                drawCtrl.deactivate();
                drawLayer.setVisibility(true);
                var start = feature.geometry;
                drawLayer.addFeatures(start);
                var circle,moveEvt;
                map.events.register("mousemove",map,function(e){
                    moveEvt = e;
                    drawLayer.removeAllFeatures();
                    var pt = map.getLonLatFromPixel(new OpenLayers.Pixel(e.x, e.y));
                    var end = new OpenLayers.Geometry.Point(pt.lon, pt.lat);
                    var line = new OpenLayers.Geometry.LineString([start, end]);
                    var radius = line.getLength();
                    var geometry = createCircle(start,radius,100,0);
                    var feature = new OpenLayers.Feature.Vector(geometry);
                    circle = feature;
                    drawLayer.addFeatures(feature);
                });
                map.events.register("click",map,function(e){
                    showLayer.removeAllFeatures();
                    showLayer.addFeatures(circle);
                    drawLayer.setVisibility(false);
                });
            }
            $("#draw").on("click",function(){
                drawLayer.removeAllFeatures();
                showLayer.removeAllFeatures();
                drawCtrl.activate();
            });
        }
    </script>
</head>
<body onLoad="init()">
<div class="query-box">
    <button id="draw">画圆</button>
</div>
<div id="map"></div>
</body>
</html>

在上文中用到了createCircle,该函数如下:

代码语言:javascript
复制
/**
 * Method: createCircle
 * Create a regular polygon around a radius. Useful for creating circles
 * and the like.
 *
 * Parameters:
 * origin - {<OpenLayers.Geometry.Point>} center of polygon.
 * radius - {Float} distance to vertex, in map units.
 * sides - {Integer} Number of sides. 20 approximates a circle.
 * rotation - {Float} original angle of rotation, in degrees.
 */
function createCircle(origin, radius, sides, rotation) {
    var angle = Math.PI * ((1/sides) - (1/2));
    if(rotation) {
        angle += (rotation / 180) * Math.PI;
    }
    var rotatedAngle, x, y;
    var points = [];
    for(var i=0; i<sides; ++i) {
        rotatedAngle = angle + (i * 2 * Math.PI / sides);
        x = origin.x + (radius * Math.cos(rotatedAngle));
        y = origin.y + (radius * Math.sin(rotatedAngle));
        points.push(new OpenLayers.Geometry.Point(x, y));
    }
    var ring = new OpenLayers.Geometry.LinearRing(points);
    return new OpenLayers.Geometry.Polygon([ring]);
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年05月31日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档