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