文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/。
1.沒有豆漿機怎么辦?
喝豆漿是我們早晨中基本必備的一環,油條豆漿,其樂融融。如果我問大家豆漿是怎么來的,五谷不分的人會說是用錢買的,了解有黃豆這會事的人會說是用豆漿機把黃豆磨出來的。如果我們再倒退十幾年,我相信見到過挑着擔子賣豆漿的人就會給出一個更詳細的答案了,先用水侵泡黃豆一夜,然后在器皿中充分搗碎,再用中火一直煮,並且要不斷攪拌,直至浮沫消失,豆漿才做成了。
聽到這個答案,很多人就會驚訝了,這么麻煩啊,還是有豆漿機方便。現在我提出一個問題,如果停電了,如果豆漿機壞了,如果你沒有錢去買豆漿機,你還能自己做出豆漿嗎?難道你就只能去買別人的豆漿喝?
2.如果沒有二次開發包,怎么辦?
如果我把已經有的地圖數據比作黃豆,我問大家一個問題,如果我們的項目由於經費問題,不提供正版的Runtime,也不提供AGS的地形圖服務,那我們該如何讓瀏覽器來顯示地形圖呢?當然,有的人會指出一整套開源的方案,比如我用Geoserver啊等等。
那如果我再問你,假如有一天我們碰到了一個奇怪的業主,它跟你說,我們只想地圖在第級別顯示,我們只想地圖顯示某一區域,我們的要素太多太多了,我們希望能在地圖拖動的時候動態的將可視范圍內的要素加載上來,等等等等問題。如果你是一個只知道用豆漿機的人,你該如何完成這些刁鑽的問題?
二次開發做到一定程度的人,也不會只局限在,C/S時加載MXD出個地圖,B/S時寫入一個地形圖服務URL出個圖的。他同樣也必須了解,到底是如何將服務端一個一個瓦片變成瀏覽器里看到的一張完整的地圖的。
這里我將連續花上幾個篇幅來一一回答這個問題。
3.地圖比例尺中的Scale和Resolution
前面我不厭其煩的給大家說了很多本節的題外話,現在言歸正傳,我們開始這個系列中的第一個問題,地圖比例尺換算原理。想要從底層實現瓦片的顯示,我們首先必須了解瓦片本身。
我們用arcgis切完圖后,打開發布的服務或者打開config.xml配置文件,可以看到所切之圖的相關配置。如圖所示:
其中levels即為所切圖的比例尺參數。每一層Level包含了一個resolution參數和一個scale參數。
Scale表示的是比例尺,即地圖上的一厘米代表着實際上的多少厘米。例如地圖上1厘米代表實地距離500千米,可寫成:1 ∶ 50,000,000或寫成:1/50,000,000。
Resolution表示的是分辨率。Resolution 的實際含義代表當前地圖范圍內,1像素代表多少地圖單位(X地圖單位/像素),地圖單位取決於數據本身的空間參考。可見Resolution跟 dpi有關系(dpi代表每英寸的像素數),跟地圖的單位也有關系。
4.行列號——瓦片存放地址的標識
在這里給大家再介紹一個GIS里的術語——行列號。我么可以這么想象,把一張矩形的地圖,按照一定的規律(按照切圖原點,切圖范圍,瓦片大小),分成了很多個大小相同的矩形,那么這個矩形所在位置,我么基本上是可以用Row和Col來表示出來。當然,如果我們了解影像金字塔這個概念,那么前面還要加上一個Level(影像級別),說通俗點就是你目前切割的這個矩形是屬於整個影像中的哪一層的。
這里,我們先看看切完地圖后,瓦片的存放路徑,我以離散型瓦片(Exploded)為例:
這里的L06表示的是瓦片所在地圖的級別,R00001179d表示的瓦片的行號,C0000a24e為瓦片的列號。這些數字是怎么算出來的,容我留着在后面的幾章給大家一一來講解。
不過這里我可以負責任的告訴大家,如果想知道行列號怎么換算,那么下面這個問題你必須知道答案。
屏幕上1像素代表實際距離是多少?
5.屏幕上1像素代表的實際距離是多少?
在計算瓦片的行列號之前,我們需要得到圖上一像素代表實際距離多少米。現在假設地圖的坐標單位是米,dpi為96 ;
1英寸=2.54厘米;
1英寸=96像素;
最終換算的單位是米;
如果當前地圖比例尺為1:125000000,則代表圖上1米等於實地125000000米;
米和像素間的換算公式:
1英寸=0.0254米=96像素
1像素=0.0254/96 米
則根據1:125000000比例尺,圖上1像素代表實地距離是 125000000*0.0254/96 = 33072.9166666667米。
6.平面坐標系和經緯度坐標系中的比例尺
6.1平面坐標系中的比例尺
當數據庫為平面坐標系統時,此時系統中所需的比例尺應該從scale中取得。因為原scale中表示的實際單位是厘米,而我們系統中需要的單位是米,所以在填寫地圖比例尺時,會將scale除以一百后再填寫。更具第二節中描寫,我們可以在系統中換算出1像素代表了多少米。
6.2經緯度坐標系中的比例尺
當數據庫為經緯度坐標系統時,此時系統中所需的比例尺應該從resolution中取得。此時的resolution直接代表了地圖上一像素等於實際中的多少度。
但是,因為代碼中已經有了一個如第二節中所描述的一個轉換算法,所以此時在填寫數據庫中比例尺時,需要將此算法逆向換算后再填入。
即:resolution*96/inch2centimeter
7.英寸轉厘米所引發的問題
英寸轉厘米的國際參數是:2.5399998,當利用天地圖或者其他第三方非AGS切圖的地圖時,都可使用這個參數值。
但是,當用AGS所切之圖時,此參數變成了:2.54000508001016。這可能是AGS自己內部定義的一個轉換參數。
根據參數的不同,當我們換算經緯度坐標系下的比例尺時,要根據不同的參數來進行轉換。當是AGS地圖時,則為:resolution*96/2.54000508001016。
8.總結
在了解屏幕上1像素代表實際距離多少是怎么算出來之后,我們可以進入下一章節了——根據地理范圍換算出瓦片行列號的原理。
敬請大家持續關注,我將爭取每一到兩周做一次更新,如果工作繁忙,可能更新時間還會延后。這一系列我將大致寫出20到25篇文章,其中涉及到原理,設計,實現方面的知識,其中可能有很多不對的地方,原諒我是一個在GIS領域只走了小小的一步的新人,原諒我資質的愚笨,容我冒昧的總結前人的成果,結合我的所思所想,和大家一起分享。
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^