文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。

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/

如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                      

(十七)WebGIS中距离及面积测量的原理和实现以及坐标转换的简单介绍的更多相关文章

  1. iOS开发——多线程篇——快速生成沙盒目录的路径,多图片下载的原理、SDWebImage框架的简单介绍

    一.快速生成沙盒目录的路径 沙盒目录的各个文件夹功能 - Documents - 需要保存由"应用程序本身"产生的文件或者数据,例如:游戏进度.涂鸦软件的绘图 - 目录中的文件会被 ...

  2. ASP.NET Core 运行原理解剖[2]:Hosting补充之配置介绍

    在上一章中,我们介绍了 ASP.NET Core 的启动过程,主要是对 WebHost 源码的探索.而本文则是对上文的一个补充,更加偏向于实战,详细的介绍一下我们在实际开发中需要对 Hosting 做 ...

  3. 简单介绍Excel单元格行列指示的实现原理(俗称聚光灯功能)

    原始出处:www.cnblogs.com/Charltsing/p/CellLight.html QQ:564955427 Excel单元格行列指示的实现原理(俗称聚光灯功能) 单元格行列指示功能在录 ...

  4. CAS单点登录原理简单介绍

    1. SSO简介 1.1 单点登录定义 单点登录(Single sign on),英文名称缩写SSO,SSO的意思就是在多系统的环境中,登录单方系统,就可以在不用再次登录的情况下访问相关受信任的系统. ...

  5. LDAP服务器的概念和原理简单介绍

    LDAP服务器的概念和原理简单介绍 1. 目录服务 目录是一个为查询.浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样.目录数据库和关系数据库不 ...

  6. VBox虚拟机与主机(宿主)通讯原理以及socat(套接字猫)简单介绍

    前言 尝试虚拟机使用socat建立服务器端接口转发时,发现对虚拟机接入网络原理不是非常了解,于是乎上网查找资料想搞明白是怎么回事,于是乎有了这篇总结博文.socat可以在服务器端口间建立全双工通信通道 ...

  7. Android通过辅助功能实现抢微信红包原理简单介绍

    简书文章:https://www.jianshu.com/p/e1099a94b979 附抢红包开源项目地址,代码已全改为Kotlin了,已适配到最新微信7.0.5版本,如果对你有所帮助赏个star吧 ...

  8. jenkins持续集成工作原理、功能、部署方式等介绍

    超详细的jenkins持续集成工作原理.功能.部署方式等介绍 原创 波波说运维 2019-08-29 00:01:00 概述 今天简单整理了一下jenkins的一些概念性内容,归纳如下: 1.概念 j ...

  9. Docker系列之原理简单介绍

    目录 1.1.Docker架构简介 1.2.Docker 两个主要部件 1.3.虚拟机和Docker对比: 1.4.Docker内部结构 Docker系列之原理简单介绍 @ Docker是一个开源的应 ...

随机推荐

  1. spark 大数据 LR测试

    #!/bin/bash size="120Y*10W"date1=`date +%F_%H-%M-%S`config="spark-submit \ --jars /da ...

  2. Cannot create file "C:\Users\Administrator\AppData\Local\Temp\EditorLineEnds.ttr"

    这个问题的产生根据网上搜集的资料是因为微软的新补丁KB2970228和KB2982791限制了字体文件的使用机制, 而EditorLineEnds.ttr是delphi字体临时文件, 这就导致了del ...

  3. FastReport.Net 常用功能总汇

    一.常用控件 文本框:输入文字或表达式 表格:设置表格的行列数,输入数字或表达式 子报表:放置子报表后,系统会自动增加一个页面,你可以在此页面上设计需要的报表.系统在打印处理时,先按主报表打印,当碰到 ...

  4. USACO翻译:USACO 2013 NOV Silver三题

    USACO 2013 NOV SILVER 一.题目概览 中文题目名称 未有的奶牛 拥挤的奶牛 弹簧牛 英文题目名称 nocow crowded pogocow 可执行文件名 nocow crowde ...

  5. Android分享一款漂亮的折叠书架菜单

    一个Android折叠书架菜单,效果极佳,给人的视觉感觉很好,便于使用. FoldingMenu

  6. ListView.setAdapter(adapter);空指针异常的解决的总结

    报空指针异常一般的情况: 1,没有找到布局文件的ID  检验是不是id重复或者写错了 2.控件没有实例化 3.没有找到布局文件的id,要看看是不是加载了布局了,必须加载了对应的布局才能找到对应布局下的 ...

  7. java学习之面向对象(2)

    在描述事物的时候,该事物已存在就具备的一些内容,这是我们就可以把它们都定义在构造函数中,那么什么是构造函数呢? 构造函数就是构建创造对象时调用的函数,它可以给对象进行初始化.构造函数与类名相同,第一个 ...

  8. Hadoop 和 HDInsight:Windows Azure 中的大数据

    世界的大数据包含一个庞大而充满活力的生态系统,但一个开放源码项目上面有这一切,那就是 Hadoop 的王朝. Hadoop 是事实上的标准的分布式的数据运算.Hadoop 提供了一个 MapReduc ...

  9. .Net开发笔记(十四) 基于“泵”的UDP通信(接上篇)

    上一篇中说到了“泵”在编程中的作用以及一些具体用处,但没有实际demo,可能不好理解,这篇文章我分享一个UDP通信的demo,大概实现了类似“飞鸽传书”在局域网中文本消息和文件传输的功能.功能不全也不 ...

  10. SQL Server 备份迁移策略

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/xp_cmdshell/备份压缩 概述 当备份空间不是很充裕的情况下需要找方法将备份文件拷贝到专用的备份机器上去,特别是存储空间不 ...