美文网首页
五章-51-绘制形状

五章-51-绘制形状

作者: 彩云飘过 | 来源:发表于2020-04-07 18:48 被阅读0次

本文基于腾讯课堂老胡的课《跟我学Openlayers--基础实例详解》做的学习笔记,使用的openlayers 5.3.x api。

源码 见 1051.html ,对应的 官网示例 https://openlayers.org/en/latest/examples/draw-shapes.html

关键是addInteraction函数的实现
 ol.interaction.Draw.createRegularPolygon
ol.interaction.Draw.createBox

image.png image.png
<!DOCTYPE html>
<html>

<head>
   <title>绘制形状</title>
   <link rel="stylesheet" href="../include/ol.css" type="text/css" />
   <script src="../include/ol.js"></script>
</head>
<style></style>

<body>
   <form class="form-inline">
       <label>形状类型 &nbsp;</label>
       <select id="type">
           <option value="Circle">圆形</option>
           <option value="Square">方形</option>
           <option value="Box">矩形</option>
           <option value="Star">六角星型</option>
           <option value="None">无</option>
       </select>
   </form>

   <div id="map" class="map"></div>

   <script>
       var raster = new ol.layer.Tile({
           source: new ol.source.OSM()
       });

       var source = new ol.source.Vector({
           wrapX: false
       });

       var vector = new ol.layer.Vector({
           source: source
       });

       var map = new ol.Map({
           layers: [raster, vector],
           target: 'map',
           view: new ol.View({
               center: [-11000000, 4600000],
               zoom: 4
           })
       });

       var typeSelect = document.getElementById('type');

       var draw; 
       function addInteraction() {
           var value = typeSelect.value;
           if (value !== 'None') {
               var geometryFunction;
               if (value === 'Square') {
                   value = 'Circle';
                   geometryFunction = ol.interaction.Draw.createRegularPolygon(4);
               } else if (value === 'Box') {
                   value = 'Circle';
                   geometryFunction = ol.interaction.Draw.createBox();
               } else if (value === 'Star') {
                   value = 'Circle';
                   //自定义绘图函数,绘制六角星,共12个顶点
                   geometryFunction = function (coordinates, geometry) {
                       //中心点
                       var center = coordinates[0];
                       //鼠标点击的另一个点
                       var last = coordinates[1];
                       var dx = center[0] - last[0];
                       var dy = center[1] - last[1];
                       //半径
                       var radius = Math.sqrt(dx * dx + dy * dy);
                       //反正切函数,计算旋转的角度
                       var rotation = Math.atan2(dy, dx);
                       //用来记录顶点坐标的数组
                       var newCoordinates = [];
                       //顶点个数
                       var numPoints = 12;
                       for (var i = 0; i < numPoints; ++i) {
                           //顶点相对转过的角度
                           var angle = rotation + i * 2 * Math.PI / numPoints;
                           //确定凸顶点和凹顶点
                           var fraction = i % 2 === 0 ? 1 : 0.58;
                           //计算顶点的坐标
                           var offsetX = radius * fraction * Math.cos(angle);
                           var offsetY = radius * fraction * Math.sin(angle);                          
                           newCoordinates.push([center[0] + offsetX, center[1] + offsetY]);
                       }
                       newCoordinates.push(newCoordinates[0].slice()); //把第一个顶点坐标加入,形成一个闭合的环
                       if (!geometry) {
                           geometry = new ol.geom.Polygon([newCoordinates]);
                       } else {
                           geometry.setCoordinates([newCoordinates]);
                       }
                       return geometry;
                   };
               }

               draw = new ol.interaction.Draw({
                   source: source,
                   type: value,
                   geometryFunction: geometryFunction
               });
               map.addInteraction(draw);
           }
       }


   
       typeSelect.onchange = function () {
           map.removeInteraction(draw);
           addInteraction();
       };

       addInteraction();
   </script>
</body>

</html> 

相关文章

  • 五章-51-绘制形状

    本文基于腾讯课堂老胡的课《跟我学Openlayers--基础实例详解》做的学习笔记,使用的openlayers 5...

  • 015 几何形状绘制

    几何形状绘制 绘制直线 绘制圆 绘制矩形 绘制椭圆 填充几何形状 OpenCV没有专门的填充方法,只是把绘制几何形...

  • PPT:3-1 常用形状的绘制与调整(形状篇)

    常用形状的绘制与调整:形状绘制 大小改变 方向旋转位置移动 1.形状绘制 (1)开始~绘图~用鼠标拖动 (2)开始...

  • 教你PPT如何简单的美化绘制的形状

    教你PPT如何简单的美化绘制的形状 对绘制的形状进行编辑后,还可通过为形状应用样式,设置形状填充色、形状轮廓和形状...

  • PPT中的形状——基础技术贴

    主要内容包括PPT中形状的绘制,形状的组合与拆分,形状的对齐方式,形状在幻灯片中的应用等。 1.形状的绘制 打开方...

  • 绘制view形状

    最近有个需求,是仿照微信公众号做一个界面,里面有一个弹出菜单。这次我选择自己绘制弹出菜单,而不是让UI切图。 直接上代码

  • CAShapeLayer

    CAShapeLayer(形状图层) 父类是CALayer 根据路径绘制形状图层 CAShapeLayer所有独有...

  • 学习Android界面开发: Shape Drawable

    用于绘制几何形状(geometric shape)支持以下属性: 形状 android:shape...

  • 菜鸟教程——iOS UIKit绘制图像

    iOS两大绘图框架:UIKit像UIImage、NSString(绘制文本)、UIBezierPath(绘制形状)...

  • Android高德之旅(9)绘制面

    废话 这篇文章记录下绘制面,绘制面其实就是绘制形状,形状有很多种,但是归纳起来我们只要两种,一是圆形,二是多边形。...

网友评论

      本文标题:五章-51-绘制形状

      本文链接:https://www.haomeiwen.com/subject/ljfluhtx.html