(十七)WebGIS中距離及面積測量的原理和實現以及座標轉換的簡單介紹

文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/算法

1.背景

在這一章裏咱們將討論基礎工具欄中另外兩個經常使用工具:距離測量工具盒面積測量工具。微信

距離測量工具要求實現以下功能:工具

a.經過鼠標點擊,在地圖上將每一個點擊點連成線段進行表示blog

b.每一個線段處表示出此線段表明的實際距離事件

c.雙擊鼠標,中止此輪測量,表示出全部線段總長度get

d.容許鼠標拖動地圖博客

面積測量工具的需求與測量工具的需求大體相同,描述爲下:qt

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/

                                                                           若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

                                      

相關文章
相關標籤/搜索