在地图上基于OpenLayers实现点/线/面静态的绘制显示

news/2024/11/28 23:57:07/

        在做GIS相关的工作过程中,是离不开矢量的数据的。矢量作为最基础的数据形式,一般通用在各个项目中。在导航软件开发或者应用中,点/线/面的标记,标绘,显示等都是不可缺少的。本文主要是来介绍在地图上基于OpenLayers实现点/线/面静态的绘制显示方法。

1、准备

        本文的实现是在前文的框架基础上,继续添加点线面样式和显示函数。具体的准备内容包括ol库文件,瓦片地图服务等。参考:基于OpenLayers实现导航地图上(起/终)点的交互式图标显示的准备内容,和地图瓦片数据的多种利用形式以及瓦片数据的浏览显示的地图创建与后端服务启动。

2、创建矢量图层

        在地图上增加点/线/面,则需要在地图之上增加一个矢量图层。

    //创建矢量图层var vecSource = new ol.source.Vector();var vecLayer = new ol.layer.Vector({source: vecSource});vecSource.clear();map.addLayer(vecLayer);//添加到map里面

注意:如果点线面公用一个图层,如果项目中有清除的功能,那么会使所有已存在的矢量均被清除。为此,根据项目需要,可创建多个矢量图层分别去控制point、line、polygon的要素,即可分别作用显示和清除。

3、点/线/面样式

        样式的处理一般有两种方式:1、固定写法,放在之前,用时直接调用;2、不固定写法,在绘制的时候再写,可处理细节。

3.1、固定写法例子

//点样式var pointStyle = new ol.style.Style({image:new ol.style.Circle({radius:5,//半径fill:new ol.style.Fill({color:'red'}),	//填充颜色				stroke: new ol.style.Stroke({color: 'green',width: 1})//外环颜色和粗细})})//线样式var lineStyle = new ol.style.Style({stroke: new ol.style.Stroke({color: 'blue',width: 3})})//面样式var polygonStyle = new ol.style.Style({text:new ol.style.Text({testAlign:'center',text:"区域",font:'bold 20px 微软雅黑',fill:new ol.style.Fill({color:'#19339e'})}),fill: new ol.style.Fill({color: '#0055ff'}),stroke: new ol.style.Stroke({color: '#ffcc33',width: 3})})

        上面写的例子可以看出,写死后,直接调用,样式基本就固定了。细微细节想要变化不太好处理了。

3.2、不固定写法例子

        直接在对点线面绘制遍历过程逐一添加样式,可以增加细节上的优化。

            //点样式var pointStyle = new ol.style.Style({text:new ol.style.Text({testAlign:'left',text:i+"     ",             ///可变化font:'bold 15px 微软雅黑',fill:new ol.style.Fill({color:'yellow'})}),image:new ol.style.Circle({radius:r,//半径fill:new ol.style.Fill({color:c1}),	//填充颜色				stroke: new ol.style.Stroke({color: c2,width: w})//渐变颜色和大小})});

        点样式放在每个点要素的绘制过程中,可以对每个点要素进行标注等等,而固定写法则没法做到序号标注。

            var pFeature = new ol.Feature(geoPoint);//pFeature.setStyle(pointStyle);pFeature.setStyle(new ol.style.Style({text:new ol.style.Text({testAlign:'left',text:i+"    ",font:'bold 20px 微软雅黑',fill:new ol.style.Fill({color:'red'})}),}));

        线样式中则可以对每个节点进行标注,处理显示。

            var polygonStyle = new ol.style.Style({text:new ol.style.Text({testAlign:'center',text:"区域"+i,font:'bold 20px 微软雅黑',fill:new ol.style.Fill({color:'black'})}),fill: new ol.style.Fill({color: '#0055ff'}),stroke: new ol.style.Stroke({color: '#ffcc33',width: 3})});

        面样式放在每个面要素的绘制过程中进行渲染,可以获得想要的标注等样式。

4、显示效果

        为显示效果模拟的数据:

	var vectorlist = {"point":[[113.76101 , 23.52712],[113.73627 , 23.51769],[113.76506 , 23.51675],[113.74415 , 23.49535],[113.74415 , 23.49995],[113.75082 , 23.49976],[113.319 , 23.140],[113.319 , 23.109],[113.3386 , 23.1238]],"line":[[113.3386 , 23.1238],[113.4506 , 23.2675],[113.5415 , 23.49535],[113.74415 , 23.49995]],"polygon":["[[113.319 , 23.140],[113.319 , 23.109],[113.3386 , 23.1238]]","[[113.76101 , 23.52712],[113.73627 , 23.51769],[113.74415 , 23.49995],[113.76506 , 23.51675]]"]}

4.1、点显示

代码:

    function drawPoint(PointList){vecSource.clear();var points = PointList.point;//使用过程中需要修改为被请求服务中的字段for(var i=0;i<points.length;i++){var point = new ol.geom.Point(ol.proj.fromLonLat(points[i]));            var feature = new ol.Feature(point);var pointStyle = new ol.style.Style({text:new ol.style.Text({testAlign:'left',text:i+"     ",font:'bold 15px 微软雅黑',fill:new ol.style.Fill({color:'yellow'})}),image:new ol.style.Circle({radius:5,//半径fill:new ol.style.Fill({color:'red'}),	//填充颜色				stroke: new ol.style.Stroke({color: 'blue',width: 1})//渐变颜色和大小})});feature.setStyle(pointStyle);vecSource.addFeature(feature);}}

那么直接调用:

drawPoint(vectorlist);

得到效果有:

 4.2、线显示

代码:

    function drawLine(LineList){vecSource.clear();var lines = LineList.line;var line = new ol.geom.LineString();for(var i = 0;i < lines.length;i++){// var pPoint = ol.proj.transform([lines[i][0]*1,lines[i][1]*1], 'EPSG:4326', 'EPSG:3857');// line.appendCoordinate(pPoint);// var geoPoint = new ol.geom.Point([pPoint[0]*1,pPoint[1]*1]);line.appendCoordinate(ol.proj.fromLonLat(lines[i]));//标记每一个节点var geoPoint = new ol.geom.Point([ol.proj.fromLonLat(lines[i])[0]*1,ol.proj.fromLonLat(lines[i])[1]*1]);var pFeature = new ol.Feature(geoPoint);//pFeature.setStyle(pointStyle);pFeature.setStyle(new ol.style.Style({text:new ol.style.Text({testAlign:'left',text:i+"    ",font:'bold 20px 微软雅黑',fill:new ol.style.Fill({color:'red'})}),}));vecSource.addFeature(pFeature);}var feature = new ol.Feature(line);feature.setStyle(lineStyle);vecSource.addFeature(feature);}

效果:

4.3、面显示

代码:

	function drawPolygon(PloygonList){vecSource.clear();var ploys = PloygonList.polygon;for(var i=0;i < ploys.length;i++){var ploy = ploys[i];var json = JSON.parse(ploy);var polygon = new ol.geom.Polygon([json]);polygon.applyTransform(ol.proj.getTransform('EPSG:4326', 'EPSG:3857'));var feature = new ol.Feature(polygon);var polygonStyle = new ol.style.Style({text:new ol.style.Text({testAlign:'center',text:"区域"+i,font:'bold 20px 微软雅黑',fill:new ol.style.Fill({color:'black'})}),fill: new ol.style.Fill({color: '#0055ff'}),stroke: new ol.style.Stroke({color: '#ffcc33',width: 3})});feature.setStyle(polygonStyle);vecSource.addFeature(feature);}}

效果:

 5、结束

        由于个人喜好因素,矢量数据表现形式可能存在无数样式。所以往往大家有喜欢定制化的。那么在细节之处传入喜好的参数,就能够得到自己想要的样式了。所以有时候则需要将函数改动的更为灵活,这里静态显示其实也体现不出这种形式的好处,如若改为交互式的情形,那么所有配置参数将都可让用户自己设置。

        这里仅用点显示函数做例子,其他的都类似:

function drawPoint(PointList,c1,c2,r,w){vecSource.clear();var points = PointList.point;//使用过程中需要修改为被请求服务中的字段for(var i=0;i<points.length;i++){var point = new ol.geom.Point(ol.proj.fromLonLat(points[i]));            var feature = new ol.Feature(point);var pointStyle = new ol.style.Style({text:new ol.style.Text({testAlign:'left',text:i+"     ",font:'bold 15px 微软雅黑',fill:new ol.style.Fill({color:'yellow'})}),image:new ol.style.Circle({radius:r,//半径fill:new ol.style.Fill({color:c1}),	//填充颜色				stroke: new ol.style.Stroke({color: c2,width: w})//渐变颜色和大小})});feature.setStyle(pointStyle);vecSource.addFeature(feature);}}

        这里就可以将,点要素的半径、填充颜色、渐变色和大小都定制化选择了。


http://www.ppmy.cn/news/2529.html

相关文章

RemoteServiceException: can‘t deliver broadcast 问题分析

一、问题背景 最近测试跑monkey报了一个应用崩溃的log&#xff0c;核心堆栈如下&#xff08;已脱敏&#xff0c;出问题的android系统版本是api11&#xff0c;AndroidR&#xff09;&#xff1a; ps: 本次涉及的应用包名统一用com.my.app代替 11-28 03:57:20.326 12039 12039 E …

win11摄像头黑了用不了的七个解决办法

目录 前言必读 方法一、重置和隐式设置摄像头 方法二、更新windwos驱动 方法三、检查串行总线控制器 方法四、下载驱动精灵来安装驱动 方法五、驱动精灵里面修复 方法六、检查键盘上面有没有物理摄像头按键 方法七、使用万能摄像头 前言必读 读者手册&#xff08;必读&…

给你讲明白MySQL的乐观锁和悲观锁

乐观锁与悲观锁是一种广义上的概念。不管是 Java 语言&#xff0c;也或者是其他语言以及数据库都有这类概念对应的实际应用。想要学习乐观锁和悲观锁就要学习他们的基本知识&#xff0c;那么下面我们来学习一下。 锁 生活中&#xff1a;锁在我们身边无处不在&#xff0c;比如我…

【Zookeeper】学习笔记(二)

Zookeeper学习笔记四、客户端命令4.1、新增节点4.2、查询节点信息4.3、节点类型4.4、更新节点4.5、删除节点4.6、监听器五、SpringBOOT整合Zookeeper六、写数据流程6.1、写流程之写入请求直接发送给Leader节点6.2、写流程之写入请求发送给follower节点七、服务器动态上下线监听…

Spring从入门到精通(二)

文章目录1.动态代理1.1 概念1.2 jdk动态代理&#xff08;重点&#xff09;1.3 基于子类的动态代理&#xff08;了解&#xff09;2.AOP2.1 概念2.2 springAop — 基于AspectJ技术2.2.1 AspectJ使用&#xff08;XML&#xff09;2.2.2 AspectJ使用&#xff08;注解开发&#xff09…

c语言---指针进阶(2)--玩转指针

今天内容不多&#xff0c;但都是精华。 1.数组参数和指针参数 2.函数指针 2.1笔试题 3.函数指针数组 1.数组参数和指针参数 例1&#xff1a;一维数组传参 void test(int arr[]) {} void test(int arr[10]) {} void test(int *arr) {}void test2(int *arr2[20]) {} void …

Verilog语法之generate for、generate if、generate case

0、前言 Verilog-2005中有3个generate 语句可以用来很方便地实现重复赋值和例化&#xff08;generate for&#xff09;或根据条件选择性地进行编译&#xff08;generate if和generate case&#xff09;等功能。接下来就一起看下这3个语句的应用场景和应用方法吧。 1、generate …

Laravel 某个固定数据排序在列表顶部sql查询(自定义排序)

业务需要列表中某个固定用户数据处于列表顶部&#xff0c;该用户author状态有多个值&#xff08;例如&#xff1a;1-999&#xff09;&#xff0c;需要置于顶部的为中间的某个值&#xff08;例如&#xff1a;author68&#xff09; 实现方式&#xff1a; 1、判断 author的值是不…