這是網上找來的代碼,實現wgs(epsg:4326)轉化為UTM 51N(epsg:32651),最后生成的投影坐標單獨存儲在txt文件中,如下代碼:
1 #-*-coding=utf-8 -*- 2 import pyproj 3 import pandas as pd 4 import numpy as np 5 data = pd.read_csv("test.csv",sep=',',header='infer')#導入數據,將第一行作為表頭 6 p1 = pyproj.Proj(init="epsg:4326")#wgs坐標系統的EPSG Code 7 p2 = pyproj.Proj(init="epsg:32651")#UTM 51N坐標系統的EPSG Code 8 lonprj, latprj = pyproj.transform(p1, p2,busstop['lng'], 9 xy = list(zip(lonprj,latprj))#封裝數組,使每一個經度對應一個緯度 10 np.savetxt("UTM51.txt",xy,fmt="%.5f")#小數點后保留5位
根據項目需要,對以上代碼做了一點調整,如下:
1、轉換坐標系調整為球體墨卡托坐標;
2、轉換的數據保存在原來的busstop文件內,新建兩列存儲。PS:保留小數點后5位。
說明:busstop在前面代碼已導入。
1 #-*-coding=utf-8 -*- 2 import pyproj 3 import pandas as pd 4 import numpy as np 5 p1 = pyproj.Proj(init="epsg:4326")#wgs坐標系統的EPSG Code 6 p2 = pyproj.Proj(init="epsg:3857")#球體墨卡托——轉換投影坐標系統的EPSG Code 7 busstop['lngprj'],busstop['latprj'] = pyproj.transform(p1, p2,busstop['lng'], busstop['lat']) 8 busstop['lngprj'] = round(busstop['lngprj'],5)#整列小數點保留5位 9 busstop['latprj'] = round(busstop['latprj'],5)#整列小數點保留5位
最后輸出的結果:
最后的最后,科普一下兩個坐標系,EPSG:4326 (WGS84) and EPSG:3857(Pseudo-Mercator),這又是啥呢?
EPSG:4326 (WGS84)
前面說了 WGS84 是目前最流行的地理坐標系統。在國際上,每個坐標系統都會被分配一個 EPSG 代碼,EPSG:4326 就是 WGS84 的代碼。GPS是基於WGS84的,所以通常我們得到的坐標數據都是WGS84的。一般我們在存儲數據時,仍然按WGS84存儲。
EPSG:3857 (Pseudo-Mercator)
偽墨卡托投影,也被稱為球體墨卡托,Web Mercator。它是基於墨卡托投影的,把 WGS84坐標系投影到正方形。我們前面已經知道 WGS84 是基於橢球體的,但是偽墨卡托投影把坐標投影到球體上,這導致兩極的失真變大,但是卻更容易計算。這也許是為什么被稱為”偽“墨卡托吧。另外,偽墨卡托投影還切掉了南北85.051129°緯度以上的地區,以保證整個投影是正方形的。因為墨卡托投影等正形性的特點,在不同層級的圖層上物體的形狀保持不變,一個正方形可以不斷被划分為更多更小的正方形以顯示更清晰的細節。很明顯,偽墨卡托坐標系是非常顯示數據,但是不適合存儲數據的,通常我們使用WGS84 存儲數據,使用偽墨卡托顯示數據。
Web Mercator 最早是由 Google 提出的,當前已經成為 Web Map 的事實標准。但是也許是由於上面”偽“的原因,最初 Web Mercator 被拒絕分配EPSG 代碼。於是大家普遍使用 EPSG:900913(Google的數字變形) 的非官方代碼來代表它。直到2008年,才被分配了EPSG:3785的代碼,但在同一年沒多久,又被棄用,重新分配了 EPSG:3857 的正式代碼,使用至今。