Openlayers实现图形绘制


Posted in Javascript onSeptember 28, 2020

本文实例为大家分享了Openlayers实现图形绘制的具体代码,供大家参考,具体内容如下

1、新建一个html页面,引入ol.js文件,然后在body中创建一个div标签、label标签和一个select下拉选项卡;

2、代码实现

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 <title></title>
 <script src="../lib/ol/ol.js"></script>
 <script type="text/javascript">
 window.onload = function () {
  //获取下拉列表框
  var typeSelect = document.getElementById('type');
  //定义一个用来接收绘制对象的对象,方便以后对绘制对象进行添加、移除等操作
  var draw;
 
  //初始化地图对象
  var map = new ol.Map({
  target: 'map',
  layers: [
   new ol.layer.Tile({
   source: new ol.source.OSM()
   })
  ],
  view: new ol.View({
   center: [0, 0],
   zoom: 3
  })
  });
 
  //初始化矢量数据源对象
  //wrapX:Wrap the world horizontally. Default is true. 
  //For vector editing across the -180° and 180° meridians to work properly, this should be set to false
  var source = new ol.source.Vector({ wrapX: false });
  //实例化矢量数据图层
  var vector = new ol.layer.Vector({
  //数据源
  source: source,
  //样式
  style: new ol.style.Style({
   //样式填充
   fill: new ol.style.Fill({
   //填充颜色
   color: 'rgba(37,241,239,0.2)'
   }),
   //笔触
   stroke: new ol.style.Stroke({
   //笔触颜色
   color: '#264df6',
   //笔触宽度
   width:2
   }),
   //图形样式,主要适用于点样式
   image: new ol.style.Circle({
   //半径大小
   radius: 7,
   //填充
   fill: new ol.style.Fill({
    //填充颜色
    color: '#e81818'
   })
   })
  })
  });
 
  //将矢量图层加载到map中
  map.addLayer(vector);
 
  //添加绘图交互的函数
  function addInteraction() {
  //获取当前选择的绘图类型
  var value = typeSelect.value;
  //如果当前选择的绘图类型不为"None"的话,则进行相应绘图操作
  //如果当前选择的绘图类型为"None"的话,则清空矢量数据源
  if (value !== 'None') {
   //如果当前的矢量数据源为空的话,则重新创建和设置数据源
   //因为当你选择的绘图类型为"None"时,会清空数据源
   if (source == null) {
   source = new ol.source.Vector({ wrapX: false });
   vector.setSource(source);
   }
   //geometryFunction变量,用来存储绘制图形时的回调函数
   //maxPoints变量,用来存储最大的点数量
   var geometryFunction, maxPoints;
   //如果当前选择的绘图类型是"Square"的话,则将value设置为Circle
   //然后调用createRegularPolygon()方法
   if (value === 'Square') {
   value = 'Circle';
   //Create a geometryFunction for type: 'Circle' 
   //that will create a regular polygon with a user specified number of sides and start angle instead of an ol.geom.
   //根据圆来创建一个四边形
   geometryFunction = ol.interaction.Draw.createRegularPolygon(4);
   } else if (value === 'Rectangle') {
   //如果当前选择的绘图类型是"Square"的话,则将value设置为LineString
   value = 'LineString';
   //设置最大点数为2
   maxPoints = 2;
   geometryFunction = function (coordinates, geometry) {
    //如果geometry对象不存在或者为空,则创建
    if (!geometry) {
    geometry = new ol.geom.Polygon(null);
    }
    //开始点的坐标
    var start = coordinates[0];
    //结束点的坐标
    var end = coordinates[1];
    //根据开始坐标和结束坐标设置绘图点坐标
    geometry.setCoordinates([
    [start, [start[0], end[1]], end, [end[0], start[1]], start]
    ]);
    return geometry;
   };
   }
 
   //将交互绘图对象赋给draw对象
   //初始化交互绘图对象
   draw = new ol.interaction.Draw({
   //数据源
   source: source,
   //绘制类型
   type: value,
   //回调函数
   //Function that is called when a geometry's coordinates are updated
   geometryFunction: geometryFunction,
   //最大点数
   maxPoints: maxPoints
   });
   //将draw对象添加到map中,然后就可以进行图形绘制了
   map.addInteraction(draw);
  } else {
   //清空矢量数据源
   source = null;
   //设置矢量图层的数据源为空
   vector.setSource(source);
  }
  }
 
  //当绘制类型下拉列表框的选项发生改变时执行
  typeSelect.onchange = function (e) {
  //从map中移除交互绘图对象
  //如果不移除,则会在下拉列表框选项发生改变时再次进行绘制时,保留上一次的draw对象
  map.removeInteraction(draw);
  //执行添加绘图交互的函数
  addInteraction();
  };
  //添加绘图交互的函数
  //此处是为保证刷新页面后,仍然能够根据下拉列表框框的选项进行图形绘制
  addInteraction();
 };
 </script>
</head>
<body>
 <div id="menu">
 <label>几何图形绘制:</label>
 <select id="type">
  <option value="None">无</option>
  <option value="Point">点</option>
  <option value="LineString">线</option>
  <option value="Polygon">多边形</option>
  <option value="Circle">圆</option>
  <option value="Square">正方形</option>
  <option value="Rectangle">长方形</option>
 </select>
 </div>
 <div id="map"></div>
</body>
</html>

3、结果展示

绘制点图形

Openlayers实现图形绘制

绘制线图形

Openlayers实现图形绘制

绘制多边形

Openlayers实现图形绘制

绘制圆形

Openlayers实现图形绘制

绘制正方形

Openlayers实现图形绘制

绘制矩形

Openlayers实现图形绘制

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript笔记 String类replace函数的一些事
Sep 22 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
Aug 07 Javascript
jQuery Form 页面表单提交的小例子
Nov 15 Javascript
微信小程序 开发之快递查询功能的实现
Jan 09 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
Aug 16 Javascript
Js利用console计算代码运行时间的方法示例
Sep 24 Javascript
webpack 模块热替换原理
Apr 09 Javascript
Angular Excel 导入与导出的实现代码
Apr 17 Javascript
Vue实现搜索结果高亮显示关键字
May 28 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
Aug 21 Javascript
vue页面切换项目实现转场动画的方法
Nov 12 Javascript
jQuery cookie的公共方法封装和使用示例
Jun 01 jQuery
Openlayers显示瓦片网格信息的方法
Sep 28 #Javascript
Openlayers实现地图全屏显示
Sep 28 #Javascript
Openlayers学习之加载鹰眼控件
Sep 28 #Javascript
Openlayers显示地理位置坐标的方法
Sep 28 #Javascript
Openlayers学习之地图比例尺控件
Sep 28 #Javascript
Openlayers实现地图的基本操作
Sep 28 #Javascript
TypeScript 运行时类型检查补充工具
Sep 28 #Javascript
You might like
解析htaccess伪静态的规则
2013/06/18 PHP
PHP使用php-resque库配合Redis实现MQ消息队列的教程
2016/06/29 PHP
详解json在php中的应用
2018/09/30 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
JS仿百度搜索自动提示框匹配查询功能
2013/11/21 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
浅析js预加载/延迟加载
2014/09/25 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
详解VS Code使用之Vue工程配置format代码格式化
2019/03/20 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
Typescript的三种运行方式(小结)
2019/09/18 Javascript
微信小程序进入广告实现代码实例
2019/09/19 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
基于javascript实现贪吃蛇经典小游戏
2020/04/10 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
python学习 流程控制语句详解
2016/06/01 Python
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
python 获取字符串MD5值方法
2018/05/29 Python
对python字典元素的添加与修改方法详解
2018/07/06 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
高中自我评价分享
2013/12/05 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
2014年物流工作总结
2014/11/25 职场文书
经济纠纷起诉状
2015/05/20 职场文书
2019学子的答谢词范本!
2019/07/05 职场文书
如何在python中实现ECDSA你知道吗
2021/11/23 Python
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js