文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/。
1.前言
地圖本身是擁有坐標的,一般可以大致分為平面坐標和經緯度坐標,在這里我們統稱為地理坐標,比如北京,(115.9°E ,39.6°N)和(506340,304400)均是其地理坐標,只是表示形式不同而已。
我們在上一章講解了矢量圖層中數據的來源,最后提出了一個還未解決的問題,即當我們獲得了矢量數據后,如何在屏幕中將這些數據里的地理(Geometry)坐標轉換為屏幕坐標,從而在屏幕端Canvas里的各個UIComponent(要素)中繪制出來?
這一章我們將對此轉換做出講解。
2.轉換前提
實現屏幕坐標能與地理坐標進行轉換的前提是:
1).知道屏幕的最左上角所對應的真實的地理坐標(screenGeoBounds.left, screenGeoBounds.top)。
2).知道此時的地圖所在級別上每個瓦片所對應的實際地理長度(sliceLevelLength)。
3).知道瓦片的大小,即一個瓦片所擁有的屏幕像素(tileSize)。
3.如何獲得這些前提參數
3.1 tileSize參數的獲取
由於此參數為固定參數,所以獲取十分簡單,與實際中的瓦片大小一致即可。
3.2 sliceLevelLength參數的獲取
此參數需要經過一定的算法才能獲得,具體算法和原理可以在第三章《通過地理范圍獲取瓦片行列號》中得到詳細的講解。我這里直接給出公式:
resolution=scale*inch2centimeter/dpi;
sliceLevelLength=tileSize*resolution;
英文代表如下意思:
inch2centimeter:英寸轉里面的參數。
Dpi:一英寸所包含的像素。
Resolution:單位像素所代表的實際單位長度。
3.3 screenGeoBounds的獲取
此參數的實際意思是屏幕坐標上(0,0)所對應的地理坐標(screenGeoBounds.left, screenGeoBounds.top)。而screenGeoBounds卻同時是不確定,動態變化的一個參數值。因為隨着地圖的平移、放大、縮小操作,此screenGeoBounds均會發生變化。
參考第三章內容(我們整個系統中,第三章的內容均是重點),我們可以知道,每一次我們觸發瓦片請求時,都會重新計算出此時的屏幕四角坐標所對應的實際地理坐標。
並且,在以后章節中跟大家探討WebGIS功能,當講解地圖平移功能時,我們還能了解到,事實上每次地圖平移事件發生時,我們的屏幕四角坐標也會加減相同的地理平移量。
4.轉換公式
下面我將給出基於tileSize、sliceLevelLength、screenGeoBounds三個參數的地理坐標與屏幕坐標互相轉換的公式。
4.1 屏幕坐標轉換為地理坐標
geoXY.x = screenGeoBounds.left + screenX * sliceLevelLength / tileSize;
geoXY.y = screenGeoBounds.top - screenY * sliceLevelLength / tileSize;
4.2 地理坐標轉換為屏幕坐標
screenXY.x = (geoX - screenGeoBounds.left)/(sliceLevelLength/ tileSize);
screenXY.y = (screenGeoBounds.top - geoY)/(sliceLevelLength/ tileSize);
4.3 公式的簡單解說
兩個轉換公式均是首先算出在屏幕上的一個像素所對應的單位地理長度后,再根據轉換需求進行需要的轉換。所需要注意的是,在真實的地圖上,Y代表的是緯度,其越往上緯度越大,而在屏幕上,Y越往上走反而越小。所以仔細觀察兩種轉換公式中關於緯度和屏幕Y坐標的轉換就能發現這一點。
5.WebGIS中基於坐標轉換公式的用法
這兩個轉換公式很多時候是配合使用的。比如有這樣一個需求:鼠標點擊在地圖上后需要查詢出鼠標點擊處的要素屬性信息,並且將該查詢到的要素在地圖上畫出來(其實此需求是一個I查詢的需求)。
我們的實現方法是先將鼠標點擊處的屏幕坐標轉換為地理坐標,然后加上tolerance后拼成一個Geometry范圍,從前端發出I查詢的請求URL,通過地理服務器得到返回的矢量數據,再在前端將矢量數據中的地理坐標轉換為屏幕坐標,根據此屏幕坐標在UIComponent里繪出要素,並將矢量數據中攜帶的Atrributes進行解析作為查詢所得的屬性數據。
以下為此過程的流程圖:
6.總結
在此章中,我們知道了如何將得到的矢量數據里的地理坐標轉換為屏幕坐標,接下來我們要做的事情是在UIComponent中基於得到的屏幕坐標,繪制出要素的shape。在了解了矢量數的據獲得方式以及矢量數據的用法后,在后面的兩章里我們終於可以進行要素的設計和矢量圖層的設計了。歡迎大家持續關注。
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^