这是网上找来的代码,实现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 的正式代码,使用至今。