UTM坐标转GPS方法分享
UTM坐標轉GPS方法分享
- 1. UTM簡介
- 2. UTM轉GPS網站
- 3. 代碼實現UTM轉GPS
最近第一次接觸到了UTM坐標值,項目需求要將其轉換成GPS坐標,在網上找了將近一天的資源(ps:好多帖子只有幾行代碼,用到的庫、轉換原理什么的都沒有說一下),這里分享下自己的調研結果,也歡迎大家補充。
1. UTM簡介
UTM的介紹網上有很多,不再贅述,這里主要講一下UTM的坐標表示方法,方便大家理解轉換過程。該部分主要參考了 這里。
UTM坐標的主要信息包含:經度分區(1-60)、東向位置、緯度分區(C-X,不包含I、O)、北向位置。其位置定義方式如下:
1)東向位置
UTM坐標系規定每個經度區均有一條中心經線,如11區的經度范圍為120W-114W,則其中心經線為117W(各經度區的中心經線請參考: Utm Zones)。中心經線以東的點到中心經線距離為正,中心經線以西的點到中心經線距離為負。則某點的東向位置即為該點到中心經線的距離加500000m。例如: 中心經線以東8m的點的東向位置為:500000 + 8 = 500008m中心經線以西350m的點的東向位置為:500000 - 350 = 499650m。
2) 北向位置
北半球北向位置即為該點到赤道的距離。南半球北向位置為10000000m減去該點到赤道的距離。例如:赤道以北34m的點的北向位置為:34m。赤道以南34m的點的南向位置為:10000000 - 34 = 9999966m,所有點的北向位置也是正數。
2. UTM轉GPS網站
Online Coordinates Converter網站提供了包含WGS84及UTM在內的多種坐標系在線轉換功能,可以用作測試代碼轉換是否準確的參考標準。
3. 代碼實現UTM轉GPS
在網上找到了utm功能包,這個包是python寫的,提供了UTM和GPS互相轉換的接口函數,在路徑utm/utm/conversion.py下,from_latlon()和to_latlon()函數分別實現GPS到UTM和UTM到GPS的轉換,函數里有詳細的轉換步驟,我直接在conversion.py腳本的最后加了下面幾行代碼,然后運行這個腳本就行了(雖然有點莽,但是可行)。
if __name__ =='__main__':utm_Point = numpy.loadtxt('保存UTM坐標的文本路徑.txt')print (len(utm_Point))output=open('保存轉換后GPS坐標的文本路徑.txt','w+')for i in range (len(utm_Point)) :# print("lat: %s, lon: %s" % (utm_Point[i][0], utm_Point[i][1]))utm_x = utm_Point[i][0]utm_y = utm_Point[i][1]utm_zone = 51utm_band = 'S'lat, lon = to_latlon(utm_x, utm_y, utm_zone, utm_band)output.write(str(lat))output.write('\t') output.write(str(lon))output.write('\t') output.write(str(utm_Point[i][2]))output.write('\n')output.close()其中的utm_zone和utm_band分別對應前面提到的經度分區和緯度分區,需要根據實際情況修改,可以在Online Coordinates Converter網站查到,如下圖所示,青島市的經緯度區為51S.
ps:這里我用的是txt的方式讀入UTM坐標,因為我是從las點云文件中直接讀取并進行處理的,前面說到這個腳本是python寫的,我本人前面工作都是用的C++,目前急用就用腳本進行操作了(運行會比較耗費時間),如果大家有C++實現UTM到GPS的,歡迎交流共享。
如果你沒有包含utm坐標的txt文檔,這里也分享一下我讀las點云文件里的坐標到txt的函數(我項目拿到的las里面存的是UTM坐標),處理las點云前需要先下載liblas庫,調用時las_input對應las文件路徑,txt_output對應保存讀取坐標值的文件路徑。
//C++ 讀取las點云文件的坐標信息 #include <fstream> #include <liblas/liblas.hpp>int txt_write_las(std::string las_input, std::string txt_output) {std::ifstream ifs(las_input.c_str(), std::ios::in | std::ios::binary); liblas::ReaderFactory f;liblas::Reader reader = f.CreateWithStream(ifs);liblas::Header const& header = reader.GetHeader();int nbPoints = header.GetPointRecordsCount();double x=0, y=0, z=0;std::ofstream fout(txt_output.c_str());for (size_t i=0;i<nbPoints;++i){reader.ReadNextPoint();liblas::Point const& laspoint = reader.GetPoint();x = (double)laspoint.GetX();y = (double)laspoint.GetY();z = (double)laspoint.GetZ();std::cout<<" "<<x<<"\t"<<y<<"\t"<<z<<std::endl;fout <<x<<"\t"<<y<<"\t"<<z<<std::endl;}fout << std::endl;fout.close();return nbPoints; }總結
以上是生活随笔為你收集整理的UTM坐标转GPS方法分享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实打实的方式VS对方是否
- 下一篇: java中ofd文件转pdf_ofd格式