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 相关文章推荐
PJ Blog修改-禁止复制的代码和方法
Oct 25 Javascript
javascript 类方法定义还是有点区别
Apr 15 Javascript
myeclipse安装jQuery插件的方法
Mar 29 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
Jul 05 Javascript
利用JS来控制键盘的上下左右键(示例代码)
Dec 14 Javascript
利用javascript判断文件是否存在
Dec 31 Javascript
js无刷新操作table的行和列
Mar 27 Javascript
基于canvas实现的钟摆效果完整实例
Jan 26 Javascript
基于Three.js插件制作360度全景图
Nov 29 Javascript
js实现购物车功能
Jun 12 Javascript
基于JavaScript实现十五拼图代码实例
Apr 26 Javascript
vue实现同时设置多个倒计时
May 20 Vue.js
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
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
ThinkPHP字符串函数及常用函数汇总
2014/07/18 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
Yii框架学习笔记之session与cookie简单操作示例
2019/04/30 PHP
JavaScript多线程的实现方法
2007/05/08 Javascript
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
js动画(animate)简单引擎代码示例
2012/12/04 Javascript
js调用AJAX时Get和post的乱码解决方法
2013/06/04 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
vue2.0实现导航菜单切换效果
2017/05/08 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
2020/07/19 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
Python urlopen()函数 示例分享
2014/06/12 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
Python中.join()和os.path.join()两个函数的用法详解
2018/06/11 Python
Numpy中的mask的使用
2018/07/21 Python
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
Pytorch高阶OP操作where,gather原理
2020/04/30 Python
IBatis持久层技术
2016/07/18 面试题
大学生护理专业自荐信
2013/10/03 职场文书
新闻系毕业生推荐信
2013/11/16 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书
银行爱岗敬业演讲稿
2014/05/05 职场文书
护士节策划方案
2014/05/19 职场文书
小学推普周活动总结
2015/05/07 职场文书
公司员工手册范本
2015/05/14 职场文书
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL
Python初识逻辑与if语句及用法大全
2021/08/07 Python