文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處: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/
若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^