經緯度到平面座標的相互轉換

現在好多人在使用ArcObject的時候都可能需要作經緯度和平面座標的相互轉換。由於經緯度是球面座標,平面座標是X-Y的笛卡爾座標系統,所以這是一個看起來比較難的問題。

#此前在首頁部分顯示#

      好多人一上來就搬出地圖學、地圖投影學或者測繪學中的投影公式(如高斯投影 或 墨卡託投影),又是基準座標又是角度的搞的人頭都大了。

      實際上要想實現這個功能非常easy。 ARC Engine中的IPoint就可以進行投影和反投影運算了。

投影過程(C#):

///  flatref 投影的座標系統,這裏的54013是世界投影  ,世界投影所有經緯度都可以轉換爲平面座標,但是由於投影面積大失真也會比較大(相當於把整個地球劈成一片片的,然後拉伸最後貼到平面上,失真當然大了)。當然也可以選擇精度更高的平面如:esriSRProjCS_Beijing1954GK_23N      對應數值21483  僅僅把北京附近的地球平面拉伸鋪在平面上,由於投影面積變小,所以投影經度提高。但是由於面積變小,所以有些經度緯度不能轉換,比如所美國的精度緯度用北京投影就投不了。

        flatref = pfactory.CreateProjectedCoordinateSystem(54013);

 

//沒什麼說的,標準大地經緯度,可以將X-Y逆投影爲經度和緯度

  earthref = pfactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_NAD1983);


        /// 將經緯度點轉換爲平面座標。
      
        private IPoint GetProject(double x, double y)
        {

            IPoint pt = new PointClass();
          
            pt.PutCoords(x, y);

            IGeometry geo = (IGeometry)pt;
            geo.SpatialReference = earthref;
            geo.Project(flatref);

        
            return pt;
        }

 

           /// 將平面座標轉換爲經緯度。
         private IPoint GetGeo(double x, double y)
        {

            IPoint pt = new PointClass();

            pt.PutCoords(x, y);

            IGeometry geo = (IGeometry)pt;
            geo.SpatialReference = flatref;
            geo.Project(earthref);
            double xx = pt.X;
            return pt;
        }

 實際上IPoint的投影和任何地圖都沒什麼大關係,完全可以不用地圖,直接調用IPoint進行投影的轉換 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章