(十七)WebGIS中距离及面积测量的原理和实现

1.背景

在这一章里我们将讨论基础工具栏中另外两个常用工具:距离测量工具盒面积测量工具。

距离测量工具要求实现如下功能:

a.通过鼠标点击,在地图上将每个点击点连成线段进行表示

b.每个线段处表示出此线段代表的实际距离

c.双击鼠标,停止此轮测量,表示出所有线段总长度

d.允许鼠标拖动地图

面积测量工具的需求与测量工具的需求大致相同,描述为下:

a.通过鼠标点击,在地图上将点击点连成面

b.双击鼠标,停止此轮测量,表示出面的总面积

c.允许鼠标拖动地图

2.从原理谈起

在完成上述需求时,我们首先得了解此功能涉及到的核心原理,其实就是我们在初等几何中学过的距离公式和面积公式。

这里我先给出一个模型示意图:

2.1距离换算公式

L(AB)= Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

2.2多边形面积换算公式

首先我直接给出公式:

S(total)=Math.abs(0.5*(x1*y2-y1*x2+x2*y3-y2*x3+….+xn*y1-yn*x1)));

这个公式到底是怎么推导出来的呢?我这里跟大家大致说下。

2.2.1 用坐标点表示三角形面积

我们都知道三角形中最通用的面积公式:S=1/2*a*h。

在我之前的文章(存储过程判断两线重合点)里还提到过另外一个公式,海伦公式:

S=Math.sqt((p*(p-a)*(p-b)*(p-c))),其中p=1/2*(a+b+c)。

这里我们继续推导海伦公式,我们已经知道A(x1,y1),B(x2,y2),C(x3,y3)。则:

a=Math.sqt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)),b和c同理。

将用坐标点表示的a,b,c,p代入海伦公式,我们可以得出面积在坐标系下的另外一个等同公式:

S= Math.abs(0.5*(x1*y2-y1*x2+x2*y3-y2*x3+x3*y1-y3*x1));

2.2.2 由三角形面积推导出多边形面积

如模型中,我们在多边形内部设定一个P(x0,y0)点,通过P点连接多边形中各端点,便可将多边形分割成(n-2)个三角形。

则多边形的面积变成了:

S(total)=S(PAB)+S(PBC)+S(PCD)+…+S(PNA);

将三角形的面积坐标公式代入,最后可以算出一个抵消掉了P点坐标的通用公式:

S(total)=Math.abs(0.5*(x1*y2-y1*x2+x2*y3-y2*x3+….+xn*y1-yn*x1)));

2.2.3注意

通过推导公式,我们可以看出,该公式对环状多边形的面积无效。

3.实现过程

3.1 具体步骤

距离量测和面积量测的实现方式上大致是一样的。

a.初始化三个参数,isDone为true,flag为false,isClick为false。

b.鼠标mouseDown时,首先判断done是否为true,如果是,则清掉地图上已有的绘制。记录此时的startPoint,并且给定三个参数,isDone为false,flag为true,isClick为true。

c.鼠标mouseMove时,判断此时flag是否为true。如果是true,则触发平移功能。如果是false,首先判断isDone是否为true,如果是,先对之前所有的点进行清空重绘,再判断isClick是否为true,如果是,则随着鼠标移动实时绘制线段。

d.鼠标mouseUp时,记录此时的endpoint,可以通过startpoint和endpoint算出此时的线段长度。将flag变为false,即停止平移功能。

e.鼠标doubleClick时,将isDone参数改为true,flag改为false,isClick改为false。算出整个过程中的总距离或者总面积。

3.2 注意问题

因为此功能添加入了地图平移功能,所以在实时绘制时,如果不注意很容易出现绘制点偏移问题。

关于该偏移的引发,我在前面两章做了比较详细的解释,也提供了解决方法,大家如果不是很明白,可以回头看看。

在具体步骤中,我提到mouseMove事件中有个清空重绘过程,便是为了防止地图移动所照成的影响。同时,在每一个点的绘制时,一定要减去总偏移量。

3.3效果展示

这里分别给出距离量测和面积量测的两个效果图:

4.进一步探讨

以上,我们给出的公式,均是针对平面坐标的,即做过投影转换的坐标。假如,我们得到的坐标是经纬度坐标,此公式还能用么?

答案是不能。所以我们得自己做投影转换,将经纬度坐标转成平面坐标。这类转换公式,涉及的原理比较复杂,代码的实现也相对困难。

目前,我接触过的转换有WGS84的,BeJing54的,XiAn80的以及一些地方自己的地理坐标系,这其中还涉及到四参数和七参数方法。具体的过程,在这个系列的以后章节我再跟大家详细讨论。

不过,在精度要求不高的情况里,我们可以统一用Mecator(UTM)投影进行转换,并且使用四参数方法,将四参数固定即可。

5.总结

这一章里,我们留了一个巨大的问题,即坐标转换问题。该问题是一个很大的学问,不过我们能够一般性理解并且使用这方面的算法即可。在下一个章节里,我将跟大家一起探讨基本功能中剩下的另外两个功能,清空功能和地图定位功能。在下下章,我们将一起探讨基本功能中所涉及到的比较难的一个功能,I查询功能,该功能的合理实现和合理展现均是需要仔细推敲的。欢迎大家持续关注。

--欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

时间: 2024-08-22 12:52:39

(十七)WebGIS中距离及面积测量的原理和实现的相关文章

(十八)WebGIS中I查询的原理及设计(包含AGS、GeoServer、Supermap)

1.背景 我们在使用arcmap时,经常会用到被称为I查询的工具.具体功能便是,当激活I查询功能后,鼠标点击到某个要素上时,界面上会弹出一个对话框用来显示该要素的各属性信息.该功能截图如下: 2.原理 在WebGIS中设计和实现该功能之前,我们有必要对该功能的原理做一个了解. 在OGC的WMS标准中规定了一个接口:GetFeatureInfo.该接口的功能描述便是:根据屏幕坐标.当前视图范围等参数,获得屏幕坐标某处要素的信息. 在OGC的WFS标准中也规定了一个接口:GetFeature.该接口

第三十七课 Spark之Task执行原理及结果

主要内容 1.     Task执行原理流程图 2.     Task执行源码 3.     Task执行结果在Driver端的处理 一.Task在Executor(worker)端执行及返回Driver流程图 图37-1 Driver端与Executor交互图 二.Executor(worker)端执行源码解析 1.接收Driver端发来的消息 当Driver中的SchedulerBackend给ExecutorBackend发送LaunchTask之后,ExecutorBackend在接收到

(十八)WebGIS中清空功能和地图定位功能的设计以及实现

1.背景 当地图中增加了很多元素后,对不同的元素需要进行一定的控制,最简单的控制就是能对元素有选择的进行清空删除.在本节中,还将介绍WebGIS中另外一个常用功能,即地图定位功能.具体描述便是:当输入一个坐标点后,能够将地图缩放到该点处.下面我便就以上两个功能展开此章节的内容. 2.清空功能 2.1设计思路 根据功能点,我们可以将清空分为如下几个情形: a.清空某个或者指定个数元素 b.清空某类或多类元素 c.清空所有元素 在之前的矢量图层原理章节中,我已经就WebGIS中的矢量图层原理做了详细

某站web安全工程师VIP培训视频

这是2017年刚出的,非网上流传的那套老视频. 下载地址:http://www.zygx8.com/thread-5754-1-1.html 目录:  web安全工程师速成秘籍第一课:web术语  web安全工程师速成秘籍第七课:会话劫持概念  web安全工程师速成秘籍第七课:网络嗅探概念  web安全工程师速成秘籍第三十一课:AWVS之补录HTTP协议(2)  web安全工程师速成秘籍第三十七课:SQL注入之原理  web安全工程师速成秘籍第三十七课:SQL注入之注入点  web安全工程师速成

Unity面试题整理

Unity技术面试题 一:什么是协同程序?答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行.换句话说,开启协程就是开启一个可以与程序并行的逻辑.可以用来控制运动.序列以及对象的行为. 二:Unity3d中的碰撞器和触发器的区别?答:碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性.当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数:当Is Trigger=true时,碰撞器被物理引

(七)WebGIS中的栅格图层和矢量图层的显示原理

1.何为栅格数据,何为矢量数据? 在GIS中,对于数据格式的分类,我们一般会将其分为栅格数据和矢量数据两种类型.栅格数据是将空间看做离散的像元,由二维数组或者其他数据组织方式来进行表达.矢量数据恰恰相反,它将空间看成是连续的,用要素(点.线.面)来进行表达. 我们把栅格数据和矢量数据的特点归纳如下: (1)栅格数据是离散的,矢量数据是连续的.所以栅格数据多用二维数组(行.列)的方式组织.而矢量数据可以理解为一种向量,它用平面坐标(X.Y)的有序几何来组织. (2)栅格数据的最小单位是像素,矢量数

(十)WebGIS中地理坐标与屏幕坐标间的转换原理

1.前言 地图本身是拥有坐标的,一般可以大致分为平面坐标和经纬度坐标,在这里我们统称为地理坐标,比如北京,(115.9°E ,39.6°N)和(506340,304400)均是其地理坐标,只是表示形式不同而已. 我们在上一章讲解了矢量图层中数据的来源,最后提出了一个还未解决的问题,即当我们获得了矢量数据后,如何在屏幕中将这些数据里的地理(Geometry)坐标转换为屏幕坐标,从而在屏幕端Canvas里的各个UIComponent(要素)中绘制出来? 这一章我们将对此转换做出讲解. 2.转换前提

(六)WebGIS中地图瓦片在Canvas上的拼接显示原理

1.前言 在之前的五个章节中,我们在第一章节里介绍了WebGIS的基本框架和技术,第二章节里介绍了什么是瓦片行列号以及计算它的原因,第三章节里介绍了如何通过地理范围计算出这个范围内瓦片的行列号,第四和第五章节里介绍了在得到瓦片行列号后如何获得离线和在线地图的URL,这个章节里,我们将介绍在通过URL得到瓦片后,如何将其显示在浏览器相对应的地方,拼接出整块地图. 2.左上角瓦片起始点屏幕坐标的计算 在第三章节中,我介绍了对于左上角瓦片起始点屏幕坐标的换算原理和方法,这里我再次给出这个公式: off

(三)WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(核心)

1.前言 在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或经纬度)的换算方法,而知道这个原理后,接下来我们要怎么用它呢?它和我们前端显示地图有什么关联呢?这一节,我会尽量详细的将这两个问题一一回答.说一个题外话,这一系列的文章我都会少给代码,多画流程图或者UML图来跟大家交流,一来便于没有很多GIS和编程基础的人读懂,二来使大家不局限于某种代码的实现而更关注于原理. 2.影像金字塔简介 我们之前反复提到了影像金字塔这个概念,但是没有对其做一个大概的介绍,这里我将这个概念补充一下. 2