隨機地圖定位的思考

隨機地圖定位的思考

幾乎人人都用過地圖,你如果去另外一個城市旅遊,下車第一件事就是買張地圖。如今網絡的發展催生了新的形式的地圖-電子地圖,更加方便了人們的生活。無論你是使用電腦

上網,抑或是手機上網,都可以登錄網上的電子地圖,直接搜索你要到達的目的地以及最快捷的到達目的地的方式,方便至極。電子地圖比紙地圖方便的地方在於,它不僅可以瀏覽,而且可以隨意縮放以及運算,如計算兩地距離,統計辦事處數量等。

任何地圖都是基於一定的座標系來繪製的,地圖專業知道,世界地圖可以有多種不同的座標系,對於廣大地圖用戶來說用的最廣泛的是經度-緯度座標,也是用戶最容易接受的坐

標系。網上應用最多的Google地圖也是採用了這種座標方式,而且Google地圖也提供了基於這種方式的API,方便用戶進行二次開發。

對於最終用戶來說,也許並不需要知道經緯度這一概念,但是如果要在地圖上開發,放置各種覆蓋物,如標記、文本等,則必須是要透徹理解的。下面就簡單說一下經緯座標概念。

地球是圍繞一根軸來自轉的,稱爲地軸,這根軸與地球表面相交於兩點,稱爲南極和北極,地球繞地軸轉一圈,地表形成的周長最長的軌跡稱爲赤道。規定赤道的緯度爲0度,北

極的緯度爲90度,南極的緯度爲-90度。地球表面上的任何一點與赤道平面的交角,其度數稱爲該點的緯度,北半球爲正的度數,南半球爲負的度數。再來看經度,把地球看作一個

剝了皮的桔子,沿着平行於地軸的方向把地圖等分爲360份,也就是把這桔子分360個桔子瓣,每一個份是一個經度數,從英國某個天文臺開始計數,爲0度,向西爲西經,向東爲東

經,一般規定西經爲負的經度,最小爲-180度,東經爲正的經度,最大爲180度,應該說正180度和負180度是重合的。這樣一來,地球上任何一點都可以由一個經緯度座標表示:(x,y),x大於等於負180,小於等於正180y大於等於負90度,小於等於90度。所以定位地球上的某一點,只需要一個經緯度座標就可以了。由於地球表面面積非常大,定位某一個目標,需要把經緯度精確到小數點後面好幾位數才行,如故宮西南角的座標爲(116.392,39.913)

經緯度的概念明確之後,現在考慮一個問題:在全世界範圍內隨機定位地圖上的某一點。這是一個比較有意思的題目。想想我們隨便產生一個合理的經緯度,它就能定位到地球上

某一個不知名的地點,這個地點有可能是南美的熱帶雨林,也有可能是有非洲的熱帶沙漠,當然更有可能是浩瀚的太平洋。最初想到這個問題,我只需要幾秒鐘就能想到,只要隨機產生一個-180180之間的經度數以及一個-90度到90度的緯度就可以了。當我想到的時候就不走腦子地去做了,利用Google提供的免費的世界地圖以及方便的Javascript腳本接口,我很快實現出來了。然而,結果卻不能讓人滿意,地圖經常定位到渺無人煙的俄羅期西伯利亞北邊的苔原以及萬年冰封的南極大陸,而且概率很高。

靜下心來簡單地想了一下,原來我把立體的地圖平面化了。爲了簡單起見,我們先上一張圖,如下。這張圖是Google提供的世界全圖,大家看出來有什麼奇怪的地方嗎?

                                                                           世界地圖

原來,這張地圖就是簡單地把球體表面拉伸爲平面了,經過這樣處理之後,兩極及其附近的區域產生了很大程度的擴展,尤其是南極大陸,差不多佔了整個陸地面積的一半,這顯然是不合理的。

不過這並不是說Google就做錯了,事實上把球面平鋪成平面本來就沒有完美的解決辦法。我們要產生任意的定位點,就是基於這張平面地圖了,所以高緯度的地方命中的機率比較大。所以,因爲平面地圖不合理,我們的隨機方法也是不合理的。

接下來,我們只能在球體表面產生隨機地點,也就是越接近赤道的地方,命中概率越高,越接近兩極的地方命中率越低。很容易想象,從-180180之間隨機產生一個經度,是很容易的,無論是接近兩極,還是接近赤道,經度都是均勻分佈的。整個問題最關鍵的地方就是,如何產生一個隨機的緯度。Javascript產生的隨機數是從01之間均勻分佈的,我們需要找到緯度與01之間的對應關係。爲了簡單起見,我們把緯度爲90定義爲0點,把緯度爲0定義爲1點,那麼某個緯度就可以對應於01之間的某個數,就看怎麼對應比較合理。

我們做如下想象,把一根極細的足夠長的帶子從北極開始,繞着地軸一圈一圈地鋪在北半球表面,一直鋪到赤道,把整個帶子的長度定爲1,那麼,某個緯度所在的位置必然爲帶子上的某一點,那麼重新把帶子抻開來,一頭是北極,一頭是赤道,帶子上的這個點距離北極點的距離就是這個點的緯度所對應的那個從01之間的數,這個想法是比較合理的。這個數值可以用比值來確定,真正帶子的長度是一個很大的數,把這個點轉化爲01的數可以用比值來獲得,即從這點到北極的距離除以從北極到赤道的距離。把帶子理想化之後,這個比值實際上就成了這個緯度點以北的球冠的表面積與整個北半球的表面積之比。問題到這裏就豁然開朗了!

中學立體幾何學過,球冠的表面積是與球冠的高成正比的,要比表面積,只需要比高就可以了,到這裏問題又進一步簡化了,假設半徑爲1,半徑也就是整個北半球的高,緯度爲x,球冠的高比上半徑就是(1-sin(x))/1。這個值對應的隨機數假如是隨機函數產生的rand,那麼這個式子就是:1-sin(x)=rand,這個緯度值就是arcsin(1-rand)

北半球的緯度得出來了,再乘一個隨機的1或者-1就得出整個地圖的緯度來了。用Javascript一試,呵呵,果然不再定位到南極洲了。基本上比較完美,除了經常定位到太平洋裏去。

隨機定位地圖這個問題不是很難的問題,不過對於數學沒學好的同學還是需要動一番腦筋的,即使不難的問題,完美解決之後仍會有一種成就感,這就是勤於動腦所帶給程序員的快樂。

 

發佈了56 篇原創文章 · 獲贊 7 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章