小秋的家

          home

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            1 Posts :: 91 Stories :: 17 Comments :: 0 Trackbacks
               剛接觸到這個東東,確實頭暈!什么地理坐標(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ì)研究一下就能夠明白了!   
          posted on 2009-04-30 00:41 棋劍小秋 閱讀(3976) 評論(5)  編輯  收藏 所屬分類: GIS

          Feedback

          # re: 地理(投影)坐標(biāo)與屏幕坐標(biāo)的轉(zhuǎn)換! 2009-05-21 16:50 huiai
          感覺好像不太對哦!
          我的msn: huiai_zhang@hotmail.com  回復(fù)  更多評論
            

          # re: 地理(投影)坐標(biāo)與屏幕坐標(biāo)的轉(zhuǎn)換! 2009-05-26 16:20 棋劍小秋
          @huiai
          是對的,我代碼實現(xiàn)了。公式基本上是這個公式,如果地圖要拖動那么公式需要發(fā)生一點變化的。
          lon = (x - stripPx(innerDiv.style.left)) * scaleX / 3600 + minLon;
          lat = maxLat + (stripPx(innerDiv.style.top) - y )*scaleX/3600;
          stripPx()這個方法就是去掉"px"字符串的  回復(fù)  更多評論
            

          # re: 地理(投影)坐標(biāo)與屏幕坐標(biāo)的轉(zhuǎn)換! 2009-12-08 07:59 weichen
          高手  回復(fù)  更多評論
            

          # re: 地理(投影)坐標(biāo)與屏幕坐標(biāo)的轉(zhuǎn)換![未登錄] 2012-06-22 18:44 aaron
          當(dāng)?shù)貓D比例尺發(fā)生變化時,又該怎么算  回復(fù)  更多評論
            

          # re: 地理(投影)坐標(biāo)與屏幕坐標(biāo)的轉(zhuǎn)換![未登錄] 2012-07-26 14:11 過客
          scaleX = h/((maxLon-minLon)*3600) ----------X軸上每像素代表的經(jīng)度秒數(shù);
          這個就不對了吧??


          反了吧  回復(fù)  更多評論
            

          主站蜘蛛池模板: 巴里| 淮滨县| 大化| 灌云县| 饶平县| 邵东县| 吉木萨尔县| 饶河县| 南川市| 兴仁县| 延安市| 马边| 定边县| 泊头市| 平谷区| 砀山县| 驻马店市| 霍邱县| 泰来县| 扎囊县| 金溪县| 南开区| 荥经县| 安庆市| 苗栗市| 龙陵县| 阿拉善左旗| 景宁| 安吉县| 巴里| 宿迁市| 乐都县| 曲沃县| 临邑县| 玉树县| 太和县| 黎平县| 云安县| 登封市| 晴隆县| 五指山市|