小秋的家

          home

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

            呼呼......終于寫(xiě)完了,由于要趕著睡覺(jué),因?yàn)槊魈爝€要早起上班,可能寫(xiě)的還不夠清楚,大家再仔細(xì)研究一下就能夠明白了!   
          posted on 2009-04-30 00:41 棋劍小秋 閱讀(3979) 評(píng)論(5)  編輯  收藏 所屬分類: GIS

          Feedback

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

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

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

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

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


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

          主站蜘蛛池模板: 永川市| 阳朔县| 嘉荫县| 吉隆县| 尤溪县| 阿合奇县| 曲麻莱县| 内黄县| 县级市| 涿州市| 柳林县| 溧阳市| 霍山县| 金湖县| 绍兴县| 怀宁县| 宜兴市| 盐亭县| 徐闻县| 建始县| 光泽县| 鞍山市| 容城县| 五家渠市| 纳雍县| 凤山县| 五莲县| 望都县| 贺州市| 永年县| 光山县| 新源县| 嘉善县| 蒲江县| 南涧| 双辽市| 新蔡县| 铜梁县| 丁青县| 四子王旗| 仙居县|