文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。算法
在这一章里咱们将讨论基础工具栏中另外两个经常使用工具:距离测量工具盒面积测量工具。微信
距离测量工具要求实现以下功能:工具
a.经过鼠标点击,在地图上将每一个点击点连成线段进行表示blog
b.每一个线段处表示出此线段表明的实际距离事件
c.双击鼠标,中止此轮测量,表示出全部线段总长度get
d.容许鼠标拖动地图博客
面积测量工具的需求与测量工具的需求大体相同,描述为下:qt
a.经过鼠标点击,在地图上将点击点连成面基础
b.双击鼠标,中止此轮测量,表示出面的总面积原理
c.容许鼠标拖动地图
在完成上述需求时,咱们首先得了解此功能涉及到的核心原理,其实就是咱们在初等几何中学过的距离公式和面积公式。
这里我先给出一个模型示意图:
L(AB)= Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
首先我直接给出公式:
S(total)=Math.abs(0.5*(x1*y2-y1*x2+x2*y3-y2*x3+….+xn*y1-yn*x1)));
这个公式究竟是怎么推导出来的呢?我这里跟你们大体说下。
咱们都知道三角形中最通用的面积公式: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));
如模型中,咱们在多边形内部设定一个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)));
经过推导公式,咱们能够看出,该公式对环状多边形的面积无效。
距离量测和面积量测的实现方式上大体是同样的。
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。算出整个过程当中的总距离或者总面积。
由于此功能添加入了地图平移功能,因此在实时绘制时,若是不注意很容易出现绘制点偏移问题。
关于该偏移的引起,我在前面两章作了比较详细的解释,也提供了解决方法,你们若是不是很明白,能够回头看看。
在具体步骤中,我提到mouseMove事件中有个清空重绘过程,即是为了防止地图移动所照成的影响。同时,在每个点的绘制时,必定要减去总偏移量。
这里分别给出距离量测和面积量测的两个效果图:
以上,咱们给出的公式,均是针对平面坐标的,即作过投影转换的坐标。假如,咱们获得的坐标是经纬度坐标,此公式还能用么?
答案是不能。因此咱们得本身作投影转换,将经纬度坐标转成平面坐标。这类转换公式,涉及的原理比较复杂,代码的实现也相对困难。
目前,我接触过的转换有WGS84的,BeJing54的,XiAn80的以及一些地方本身的地理坐标系,这其中还涉及到四参数和七参数方法。具体的过程,在这个系列的之后章节我再跟你们详细讨论。
不过,在精度要求不高的状况里,咱们能够统一用Mecator(UTM)投影进行转换,而且使用四参数方法,将四参数固定便可。
这一章里,咱们留了一个巨大的问题,即坐标转换问题。该问题是一个很大的学问,不过咱们可以通常性理解而且使用这方面的算法便可。在下一个章节里,我将跟你们一块儿探讨基本功能中剩下的另外两个功能,清空功能和地图定位功能。在下下章,咱们将一块儿探讨基本功能中所涉及到的比较难的一个功能,I查询功能,该功能的合理实现和合理展示均是须要仔细推敲的。欢迎你们持续关注。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^