python之批量转换坐标系

图层处理的时候,如果遇到坐标系不一致,该如何进行转换?

最近工作中,碰巧遇到关于图层处理的问题,涉及坐标系的转换。结合自己遇到的坑,做一个小白经验分享。

本内容中是将百度经纬度坐标系转换为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中

python之批量转换坐标系_第1张图片

你可能感兴趣的:(python)