图层处理的时候,如果遇到坐标系不一致,该如何进行转换?
最近工作中,碰巧遇到关于图层处理的问题,涉及坐标系的转换。结合自己遇到的坑,做一个小白经验分享。
本内容中是将百度经纬度坐标系转换为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中