剛接觸到這個東東,確實頭暈!什么地理坐標,投影坐標,屏幕坐標等等.......哎....地理知識中學學過(都不知道咋學的),數學貌似N多年不用也都還給老師了!確實悲哀.....唉....終于認真的研究了一下才算明白是怎么回事了!其實不要管什么地理坐標,投影坐標還是屏幕坐標,搞的你是非要知道天文地理似的才能去動手去做這個東東!原理掌握一個,那就是只用弄明白地理坐標和屏幕坐標的定義規則就OK了...
地理坐標定義規則:X軸(代表經度)向右遞增,Y軸(緯度)向上遞增,就好比小學學過的平面坐標(貌似又忘了,要重讀小學了)吧?向左,向下的規則,這個不用我再闡述了吧,如果你還不明白,那我勸你還是真要去重讀小學了....比我更悲哀,嘿嘿,總算找到一個知已啊....不容易啊...
屏幕坐標定義規則:X軸向右遞增,Y軸向下遞增..
可以看出,地理坐標和屏幕坐標的區別僅僅只是在于Y軸遞增方向是相反的...(這就是不同).
好了,現在我們開始轉換他們吧. 這里強調一點的就是為了保證精度,地理坐標的度*3600換算成秒,所有的取值用double來計算,最后的結果再轉換成int
1.已知道屏幕的高(y)和寬(h),地理坐標區域的范圍(maxLon,minLon,maxLat,minLat)..這里我們知道了這些已知的參數...
2.我們可以算出每像素所代表的經度和緯度(有人稱這個為比例因子):
公式:scaleX = h/((maxLon-minLon)*3600) ----------X軸上每像素代表的經度秒數;
公式:scaleY = y/((maxLat-minLat)*3600) -----------Y軸上每像素代表的緯度秒數;
這兩個比例因子就是兩個坐標系之間的關系..
3.很簡單的一步了,那就是算出該地理坐標區域中的任何一點(lon,lat)在屏幕上的坐標了,怎么算?下面來講:
公式:screenX = lon*3600/scaleX; ---------屏幕坐標X軸坐標
公式:screenY = lat*3600/scaleY; ----------屏幕坐標Y軸坐標, 怎么樣?很簡單吧?這里我們就算出地理坐標上任何一點轉到屏幕上的坐標是多少了......
還有最后一步,那就是我們要把該地理區域占滿占個屏幕該怎么辦呢?
4. 接著我們需要該地理區域占滿占個屏幕該怎么辦呢
公式:minX = minLon*3600/scaleX; 區域左邊置最左端
公式:minY = minLat*3600/scaleY; 區域上面置最上端
5. 當地地理范圍區域占滿整個屏幕時,我們需要用到第三步計算出來的 screenX和screenY兩個參數
,該區域中的任何一點的公式如下:
公式:X = screenX - minX = (lon - minLon)*3600/scaleX;
由于緯度的方向和屏幕Y軸是相反的,
公式:screenMaxLat = (maxLat - minLat)*3600/scaleY;
公式:screenLat = (lat - minLat)*3600/scaleY;
公式:Y = screenMaxLat - screenLat = (maxLat - lat)*3600/scaleY; 至于為什么是這個公式,我想大家仔細想想就明白了..
6.總結:
經緯度轉屏幕坐標的最終公式如下:
公式: X = (lon - minLon)*3600/scaleX;
公式: Y = (maxLat - lat)*3600/scaleY;
接著我們由上面的公式可以推出屏幕坐標轉經緯度坐標公式如下:
公式:lon = X * scaleX/3600 + minLon;
公式:lat = maxLat - y* scaleY/3600;
呼呼......終于寫完了,由于要趕著睡覺,因為明天還要早起上班,可能寫的還不夠清楚,大家再仔細研究一下就能夠明白了!
地理坐標定義規則:X軸(代表經度)向右遞增,Y軸(緯度)向上遞增,就好比小學學過的平面坐標(貌似又忘了,要重讀小學了)吧?向左,向下的規則,這個不用我再闡述了吧,如果你還不明白,那我勸你還是真要去重讀小學了....比我更悲哀,嘿嘿,總算找到一個知已啊....不容易啊...
屏幕坐標定義規則:X軸向右遞增,Y軸向下遞增..
可以看出,地理坐標和屏幕坐標的區別僅僅只是在于Y軸遞增方向是相反的...(這就是不同).
好了,現在我們開始轉換他們吧. 這里強調一點的就是為了保證精度,地理坐標的度*3600換算成秒,所有的取值用double來計算,最后的結果再轉換成int
1.已知道屏幕的高(y)和寬(h),地理坐標區域的范圍(maxLon,minLon,maxLat,minLat)..這里我們知道了這些已知的參數...
2.我們可以算出每像素所代表的經度和緯度(有人稱這個為比例因子):
公式:scaleX = h/((maxLon-minLon)*3600) ----------X軸上每像素代表的經度秒數;
公式:scaleY = y/((maxLat-minLat)*3600) -----------Y軸上每像素代表的緯度秒數;
這兩個比例因子就是兩個坐標系之間的關系..
3.很簡單的一步了,那就是算出該地理坐標區域中的任何一點(lon,lat)在屏幕上的坐標了,怎么算?下面來講:
公式:screenX = lon*3600/scaleX; ---------屏幕坐標X軸坐標
公式:screenY = lat*3600/scaleY; ----------屏幕坐標Y軸坐標, 怎么樣?很簡單吧?這里我們就算出地理坐標上任何一點轉到屏幕上的坐標是多少了......
還有最后一步,那就是我們要把該地理區域占滿占個屏幕該怎么辦呢?
4. 接著我們需要該地理區域占滿占個屏幕該怎么辦呢
公式:minX = minLon*3600/scaleX; 區域左邊置最左端
公式:minY = minLat*3600/scaleY; 區域上面置最上端
5. 當地地理范圍區域占滿整個屏幕時,我們需要用到第三步計算出來的 screenX和screenY兩個參數
,該區域中的任何一點的公式如下:
公式:X = screenX - minX = (lon - minLon)*3600/scaleX;
由于緯度的方向和屏幕Y軸是相反的,
公式:screenMaxLat = (maxLat - minLat)*3600/scaleY;
公式:screenLat = (lat - minLat)*3600/scaleY;
公式:Y = screenMaxLat - screenLat = (maxLat - lat)*3600/scaleY; 至于為什么是這個公式,我想大家仔細想想就明白了..
6.總結:
經緯度轉屏幕坐標的最終公式如下:
公式: X = (lon - minLon)*3600/scaleX;
公式: Y = (maxLat - lat)*3600/scaleY;
接著我們由上面的公式可以推出屏幕坐標轉經緯度坐標公式如下:
公式:lon = X * scaleX/3600 + minLon;
公式:lat = maxLat - y* scaleY/3600;
呼呼......終于寫完了,由于要趕著睡覺,因為明天還要早起上班,可能寫的還不夠清楚,大家再仔細研究一下就能夠明白了!