我們在開發GIS系統的時候,首先要解決的就是地圖的可視化問題,這個問題的關鍵就在於如何把地圖的坐標轉換成屏幕坐標,然后才到渲染着色、標注等。以下以wgs84經緯度坐標為基准,介紹一下地圖經緯度坐標與屏幕坐標轉換的問題。
一、比例尺
首先地圖本身就是表達地球上各種事物的空間分布、聯系及時間中的發展變化狀態繪制的圖形。如何把地球上大量的空間信息顯示在有限的地圖上,這就是涉及到比例尺的問題。比例尺=圖上距離與實際距離的比。
比例尺有resolution和scale兩個概念
Resolution是指屏幕上一個像素和其所顯示的地圖在實際地面上的距離之比。
Scale是圖上線段的長度和該段距離在地面的實際長度之比
一般來說計算機是使用Resolution這個概念,而人們生活中就是使用scale這個概念,因為Resolution直接就使用屏幕像素來計算,所以性能上比scale要快。
//計算resolution double Resolution=map.width / screen.width //計算scale float dpi=this.view.getResources().getDisplayMetrics().xdpi; double PIXEL_SIZE=(1/dpi)*0.0254; PIXEL_SIZE=(1/dpi)*0.0254 double Scale=Resolution* MetersPerUnit /PIXEL_SIZE //0.0254為1英寸=0.0254米
二、地圖坐標和屏幕坐標的轉換
如圖所示,由於地球是球形的,同樣兩條經線,緯度越高,經線之間的直線距離越短,但經度還是保持不變的,所以在北半球或南半球上任意兩條經線和緯線之間的區域,都是類似梯形的,由於這個梯形的左上角和左下角,右上角和右下角的經度都是相同的,所以我們可以把這個梯形看成是長方形,經過投影轉換,在屏幕上看到的地圖就是經過拉伸長方形了。
由於越向北,兩條經線之間的實際距離越短,所以,要投影成長方形,就必須確定一個經度的長度:MetersPerUnit=111319.4908
//地圖坐標轉屏幕坐標: screenPt.x=screen.center.x+ ((mapPt.x-mapExtent.center.x)/resolution+0.5); screenPt.y=screen.center.y- (mapPt.y-mapExtent.center.y)/resolution+0.5); //屏幕坐標轉地圖坐標: mapPt.x=mapExtent.center.x+(screenPt.x-screen.center.x)*resolution; mapPt.y=mapExtent.center.y-(screenPt.x-screen.center.x)*resolution;