Google maps切割方法
<!--[if !supportLists]-->1. <!--[endif]-->縮放等級與圖幅數(shù)
Google maps的縮放等級是0-17共18個等級,比例尺與縮放等級是成反比的(比例尺越大地圖越詳細),其第17等級只有一幅世界地圖,某一等級下所含地圖數(shù)的計算公式為
<!--[if !supportLists]-->2. <!--[endif]-->圖幅生成與編號
可以假設Google maps在每一縮放等級下的地圖上都建立了一個坐標系,坐標原點為(西經(jīng)180度,北緯90度),正方向分別為向東向南,經(jīng)度跨度為360度,緯度跨度為180度。一般情況下,為便于理解可以這么認為,若在縮放等級n的情況下,共需生成(2<!--[endif]-->^(17-n))^2副圖片,其編號形如(x,y)(0<=x<=
但由于制 圖區(qū)域的范圍、形狀和地理位置等的不同需要選擇不同的投影方式,以減少投影成平面地圖后的誤差值。在世界地圖中常用墨卡托投影繪制世界航線圖、世界交通圖 與世界時區(qū)圖;我國出版的世界地圖多采用等差分緯線多圓錐投影,選用這個投影,對于表現(xiàn)中國形狀以及與四鄰的對比關系較好,但投影的邊緣地區(qū)變形較大。根 據(jù)不同的需要還有許多其它的投影方式,在此不再贅述,當然國家基本比例尺地形圖的投影、分幅等,是由國家測繪主管部門研究制訂,不容許任意改變的,另外編 制小區(qū)域大比例尺地圖,無論采用什么投影,變形都是很小的。
由于Google是 面向全世界的,故其不同比例尺下并且相同比例尺下不同地區(qū)不同國家其投影方式都是不同的,我猜測為使整個世界范圍內(nèi)的地圖達到相對的精確是以犧牲海洋兩極 等人煙稀少地圖的變形為代價的,當然這也只是針對小比例尺下的地圖,隨著比例尺的不斷放大這種投影上的差距會越來越小。
<!--[if !supportLists]-->3. <!--[endif]-->結論
每個切割的小圖片是256*256(像素),常識來判斷每個小圖片代表的實際區(qū)域長寬之比應為2:1,但由于投影不同的存在,其實它是1:1的,至于中間過程怎么處理的我也沒搞明白。
關于51ditu
<!--[if !supportLists]-->1. <!--[endif]-->縮放等級
使用的比例級別總共有0-12級共13個級別,他們和實際的比例尺的對應關系分別是:
0級 -------------------- 1:2,500
1級 -------------------- 1:5,000
2級 -------------------- 1:10,000
3級 -------------------- 1:25,000
4級 -------------------- 1:50,000
5級 -------------------- 1:100,000
6級 -------------------- 1:250,000
7級 -------------------- 1:500,000
8級 -------------------- 1:1,000,000
9級 -------------------- 1:2,500,000
10級 ------------------- 1:5,000,000
11級 ------------------- 1:10,000,000
12級 ------------------- 1:50,000,000
簡單的說,0級地圖最詳細,12級地圖最簡單。
以上是其官方發(fā)布的數(shù)據(jù)。
<!--[if !supportLists]-->2. <!--[endif]-->與Google的比較
51地圖和Google maps都開放了API,有人結合兩者的API把它們集成到一塊,發(fā)現(xiàn)兩者的經(jīng)緯度吻合的非常好,我想這也主要是在大比例尺地圖下只要兩者的切割方法相同就可以做到的,故為了以后能更好的兼容并向領先者學習我們也爭取達到這種比較好的吻合效果。
但分析兩者的切割圖片發(fā)現(xiàn)Google的是256*256(像素),而51ditu是128*128(像素)。如下圖(1)、圖(2)兩幅圖(兩幅圖均沒有包含到最南端的曾母暗沙):
由于兩者是采用的不同的投影方式,故地圖在外形上有著比較大的差別,但應該注意的是每一小片上只是面積上的差別,通俗點來講要有都有要沒有都沒有;由于兩者每一幅圖片是不等的,在實際中Google的每一圖幅的面積應該是51ditu的4倍,但我們將兩者放在同樣大小的比例中發(fā)現(xiàn)兩者吻合的比較好,由此也可推測隨著比例的放大吻合程度將會更好,也就是說兩者的切割方法是相同的,只不過導出圖片的大小不同而已。
<!--[if !supportLists]-->3. <!--[endif]-->坐標系統(tǒng)
同樣可以假設51ditu在每一縮放等級下的地圖上也都建立了一個坐標系,不同的是其坐標原點為(西經(jīng)11.25度,北緯0度),正方向分別為向東向北,跨度范圍基本上就是覆蓋中國的國土面積,即經(jīng)度跨度為【67.5,135】,緯度跨度為【0,56.25】,而中國領土北起漠河以北的黑龍江江心(北緯53°30′),南到南沙群島南端的曾母暗沙(北緯4°),跨緯度49度多;東起黑龍江與烏蘇里江匯合處(東經(jīng)135°05′),西到帕米爾高原(東經(jīng)73°40′),跨經(jīng)度60多度。
<!--[endif]-->
圖(1)
<!--[endif]-->
圖(2)
擬采用的方案
<!--[if !supportLists]-->1. <!--[endif]-->方案簡述
由于Google maps并沒有提供大比例尺下的中國地圖,故將其作為參照系不是一個很好的選擇,為便于以后的比較,我們采用與51ditu相同的坐標系統(tǒng),即編號方式。
如上圖(2)所示,小圖片<!--[endif]-->*
<!--[endif]-->張,在投影影響的基礎上,每個圖片的跨度為11.25*11.25度,圖片12-1-7.png左下角點的經(jīng)緯度為(67.5,11.25),很明顯(67.5+11.25)/11.25=7,11.25/11.25=1。這樣我們就得到了切割圖片序號的計算公式,一般化如下:
在縮放等級為n之下,切割圖片的邊長(設為d)d=360度/
由于我們只是針對中國范圍,故取經(jīng)度跨度為【67.5,135】,緯度跨度為【0,56.25】,在切割時可以適當延展,延展單位以11.25為準。
<!--[if !supportLists]-->2. <!--[endif]-->命名規(guī)則、存儲方案
在最大比例尺即縮放等級為0之下,取經(jīng)度跨度為【67.5,135】,緯度跨度為【0,56.25】,可以計算出共需切割的圖片數(shù)量為
以下為各比例尺之下的對應關系
縮放級別 |
比例尺 |
圖幅數(shù) |
存儲空間(4K/幅) |
0級 |
1:2,500 |
503,316,480 |
1920G |
1級 |
1:5,000 |
125,829,120 |
480G |
2級 |
1:10,000 |
31,457,180 |
120G |
3級 |
1:25,000 |
7,864,320 |
30G |
4級 |
1:50,000 |
1,966,080 |
7.5G |
5級 |
1:100,000 |
491,520 |
1.875G |
6級 |
1:250,000 |
122,880 |
|
7級 |
1:500,000 |
30,720 |
|
8級 |
1:1,000,000 |
7,680 |
|
9級 |
1:2,500,000 |
1,920 |
|
10級 |
1:5,000,000 |
480 |
|
11級 |
1:10,000,000 |
120 |
|
12級 |
1:50,000,000 |
30 |
|
由以上分析可見在大比例尺下若全部生成,其數(shù)量是很巨大的,考慮到某些大比例尺地圖只是在某些地區(qū)或特殊要求時是必須的,我們沒有必要全部生成,只需生成規(guī)定經(jīng)緯度范圍內(nèi)的某一縮放級別下的地圖。但即使這樣小縮放級別下的圖幅數(shù)量仍然不小,所以我們應該分區(qū)域在不同文件夾下存放。從級別n到級別n+1,圖片數(shù)量后者是前者的4倍,即放大一個級別原級別一張圖片裂變?yōu)樗膹?/SPAN>,這樣我們可以借鑒四杈樹的組織形式,即若樹的深度為N,深度為N-1的節(jié)點子節(jié)點均為30個,其余節(jié)點子節(jié)點為四個(當深度為1時,根結點子節(jié)點為5*6=30個),樹的深度與縮放級別的對應關系為N=13-n。
樹的節(jié)點的命名即為對應文件夾的名稱,根結點即以縮放級別命名,葉節(jié)點對應圖片以形如“bx-by.png”的形式命名,其它節(jié)點則是形如“0-0”、“0-1”、“1-0”、“1-1”的形式命名。
這樣一來生成圖片的時候就有一個路徑判斷和生成的問題。在確定了經(jīng)度跨度為【67.5,135】,緯度跨度為【0,56.25】,并且在最小比例尺(縮放等級為12)之下我們已知圖片是5*6張,即經(jīng)度方向為6,緯度方向為5,這兩個值很重要直接影響到我們的命名,當然前提變了這個值也隨著變了。我們制定規(guī)則如下:
如前樹的深度為N,經(jīng)度方向上的序號為bx,緯度方向上的序號為by。則當1<N<max(N)時,經(jīng)度方向上的節(jié)點值Lng=ToString(((bx-7*N)/6)%2), 緯度方向上的節(jié)點值Lat=ToString((by/5)%2),則節(jié)點名稱命名為Lng+”-”+Lat。
{{item.content}}