小秋的家

          home

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            1 Posts :: 91 Stories :: 17 Comments :: 0 Trackbacks
               剛接觸到這個東東,確實頭暈!什么地理坐標,投影坐標,屏幕坐標等等.......哎....地理知識中學學過(都不知道咋學的),數學貌似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;

            呼呼......終于寫完了,由于要趕著睡覺,因為明天還要早起上班,可能寫的還不夠清楚,大家再仔細研究一下就能夠明白了!   
          posted on 2009-04-30 00:41 棋劍小秋 閱讀(3976) 評論(5)  編輯  收藏 所屬分類: GIS

          Feedback

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

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

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

          # re: 地理(投影)坐標與屏幕坐標的轉換![未登錄] 2012-06-22 18:44 aaron
          當地圖比例尺發生變化時,又該怎么算  回復  更多評論
            

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


          反了吧  回復  更多評論
            

          主站蜘蛛池模板: 邢台县| 紫阳县| 曲阳县| 宁晋县| 河北区| 内江市| 安多县| 克东县| 阜城县| 山东省| 云龙县| 鄂伦春自治旗| 龙岩市| 星子县| 雷州市| 宁晋县| 凌海市| 衡水市| 长兴县| 禹城市| 五常市| 屯门区| 吴桥县| 博白县| 修武县| 定陶县| 壶关县| 绿春县| 宜章县| 兰考县| 宜良县| 安义县| 海晏县| 崇明县| 保亭| 南和县| 太和县| 色达县| 永昌县| 西和县| 巴林左旗|