图层处理的时候,如果遇到坐标系不一致,该如何进行转换?
最近工作中,碰巧遇到关于图层处理的问题,涉及坐标系的转换。结合自己遇到的坑,做一个小白经验分享。
本内容中是将百度经纬度坐标系转换为WGS84坐标系。思路:百度转高德,高德再转wgs84.
代码思路:
第一步、处理原始文件数据。
第二步、定位提取到经纬度信息。
第三步、将多对经纬度信息按组提取进行分计算。
第四步、将计算结果保存到目标文件。
首先如果拿到的原始文件是用分隔符将内容进行分隔的txt文件,先按分隔符将内容提取到列表中。
原始数据如下图:
本txt是以‘|’进行分隔。
第一步:数据提取:
def Txt_line(depth): """ 读取txt文件,并写入返回列表 :depth :文件的绝对路径 :return:返回列表 """ text1 = [] f = open(depth) # 文件内容按行遍历 for line in f: new_line = line.split("|") text2 = [] #分隔符分隔后内容二次遍历 for str in new_line: text2.append(str) text1.append(text2) print("text1:",text1) f.close() return text1 第二步:原始数据被转换为列表后,再定位到列表中经纬度的元素,将经纬度取出进行计算,最后将计算的结果写入指定的目录文件中,代码示例如下:
def line_str(line): """ 读取列表中的所有值,并拼接为字符串 :line :列表 :return:返回字符串 """ # 按行遍历列表中的内容 for i in line: # 取小区ID l1 = i[0] # 取对应的经纬度信息 l2 = i[6] print("l1:", l1) print("l2:", l2) # 将字符串形式经纬度信息,通过;和,进行分隔后,每一对经纬度信息再一个列表中 l3 = lat.str_split(l2) print("l3:", l3) # 依次再把每一个图层的经纬度信息转换成wgs84坐标系 l4 = lat.jwd_math(l3) print("l4:", l4) s = l1 + '|' for i in l4: s = s + str(Decimal(i[0]).quantize(Decimal('0.00000000000000'))) + ',' + str( Decimal(i[1]).quantize(Decimal('0.000000000000000'))) + ';' s = s + '\n' file = open(r'D:\test220623\test\jwd_test06301.txt', 'a') file.write(s) file.close() 我的pyrhon为2.7版本,计算后的float型结果,输出会被自动截取,通过百度最后使用了Decimal方法做了精度取值。
def str_split(string): c = [] #每次有经纬度进来计算,都先将结果集置空 new_str = string.split(";") for i in new_str: #分隔每一对经纬度信息 t = [] new_str1 = i.split(",") for j in new_str1: #每一对经纬度信息进一步分隔 t.append(j) c.append(t) return c
#计算每一对经纬度信息 def jwd_math(s): d = [] for i in range(0, len(s)): # 同时存在经纬度信息的才进入计算 if len(s[i])==2: bd_lat = float(s[i][0]) bd_lon = float(s[i][1]) print('bd_lat:{},bd_lon:{}'.format(s[i][0], s[i][1])) t = bd09_to_gcj02(bd_lon, bd_lat) print('t:{}'.format(t)) m = gcj02_to_wgs84(t[0], t[1]) print('m:{}'.format(m)) d.append(m) return d
def bd09_to_gcj02(bd_lon, bd_lat): """ 百度坐标系(BD-09)转火星坐标系(GCJ-02) 百度——>谷歌、高德 :param bd_lat:百度坐标纬度 :param bd_lon:百度坐标经度 :return:转换后的坐标列表形式 """ x = bd_lon - 0.0065 y = bd_lat - 0.006 z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi) theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi) gg_lng = z * math.cos(theta) gg_lat = z * math.sin(theta) return [gg_lat,gg_lng ]
def gcj02_to_wgs84(lng, lat): """ GCJ02(火星坐标系)转GPS84 :param lng:火星坐标系的经度 :param lat:火星坐标系纬度 :return: """ d=[] if out_of_china(lng, lat): return [lng, lat] dlat = _transformlat(lng - 105.0, lat - 35.0) dlng = _transformlng(lng - 105.0, lat - 35.0) radlat = lat / 180.0 * pi magic = math.sin(radlat) magic = 1 - ee * magic * magic sqrtmagic = math.sqrt(magic) dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi) dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi) mglat = lat + dlat mglng = lng + dlng return [lng * 2 - mglng, lat * 2 - mglat]
最后,带入进行验证:
depth=r'D:\test220623\test\jwd_test.txt' #读取txt文件,并将内容写入一个列表 a=Txt_line(depth) print("a:{}".format(a)) #取列表中经纬度图框信息依次转换为需要的坐标系 line_str(a)
执行之后,批量转换后的经纬度信息被写入到指定目录的txt中