Skip to content

TWD97TM2 to WGS84

TWD97TM2toWGS84 提供了 TWD97 二度分帶座標轉 WGS 經緯度的 R 程式碼,但因為有許多資料清洗流程使用 Python,所以簡單轉換為 Python 程式碼。

gits: twd_to_wgs.py

import math


def twd_to_wgs(coord_x, coord_y):
    # coord_x: TWD97橫座標, 南北緯度, latitude N
    # coord_y: TWD97縱座標, 東西經度, longitude E

    a = 6378137.0
    b = 6356752.314245
    lon0 = 121 * math.pi / 180
    k0 = 0.9999
    dx = 250000
    dy = 0
    e = (1 - b ** 2 / a ** 2) ** 0.5

    x = coord_x - dx  # input_lat: TWD97橫座標, 緯度, latitude
    y = coord_y - dy  # input_lon: TWD97縱座標, 經度, longitude

    M = y / k0

    mu = M / (a * (1.0 - (e ** 2) / 4.0 - 3 * (e ** 4) / 64.0 - 5 * (e ** 6) / 256.0))
    e1 = (1.0 - ((1.0 - (e ** 2)) ** 0.5)) / (1.0 + ((1.0 - (e ** 2)) ** 0.5))

    J1 = 3 * e1 / 2 - 27 * (e1 ** 3) / 32.0
    J2 = 21 * (e1 ** 2) / 16 - 55 * (e1 ** 4) / 32.0
    J3 = 151 * (e1 ** 3) / 96.0
    J4 = 1097 * (e1 ** 4) / 512.0

    fp = ( mu + J1 * math.sin(2 * mu) + J2 * math.sin(4 * mu) + J3 * math.sin(6 * mu) + J4 * math.sin(8 * mu) )

    e2 = (e * a / b) ** 2
    C1 = e2 * math.cos(fp) ** 2
    T1 = math.tan(fp) ** 2
    R1 = a * (1 - (e ** 2)) / ((1 - (e ** 2) * (math.sin(fp) ** 2)) ** (3.0 / 2.0))
    N1 = a / ((1 - (e ** 2) * (math.sin(fp) ** 2)) ** 0.5)

    D = x / (N1 * k0)

    # 緯度計算 latitude
    Q1 = N1 * math.tan(fp) / R1
    Q2 = (D ** 2) / 2.0
    Q3 = (5 + 3 * T1 + 10 * C1 - 4 * (C1 ** 2) - 9 * e2) * (D ** 4) / 24.0
    Q4 = ( (61 + 90 * T1 + 298 * C1 + 45 * (T1 ** 2) - 3 * (C1 ** 2) - 252 * e2) * (D ** 6) / 720.0 )
    lat = fp - Q1 * (Q2 - Q3 + Q4)

    # 經度計算 longitude
    Q5 = D
    Q6 = (1 + 2 * T1 + C1) * (D ** 3) / 6
    Q7 = ( (5 - 2 * C1 + 28 * T1 - 3 * (C1 ** 2) + 8 * e2 + 24 * (T1 ** 2)) * (D ** 5) / 120.0 )
    lon = lon0 + (Q5 - Q6 + Q7) / math.cos(fp)

    lat = (lat * 180) / math.pi  # 南北緯度  latitude
    lon = (lon * 180) / math.pi  # 東西經度  longitude

    return (lon, lat)

Reference:

  1. TWD97TM2toWGS84

Comments