[ iOS / Swift ] 將坐標系統 TWD97 (二度分帶) 轉換成 WGS84 (經緯度)
遇到的問題:
最近在解析資料,遇到資料提供的座標為 TWD97 二度分帶座標,發現要轉成經緯度才有辦法使用在 iOS 的地圖上,所以花了點時間上網找公式才完成的,帶 X,Y 座標進去就可以轉換成經緯度囉。import UIKit
// input TWD97 Value
var x = 306462.171550054
var y = 2769588.30091467
var a = 6378137.0
var b = 6356752.314245
var lng0 = 121 * Double.pi / 180
var k0 = 0.9999
var dx = 250000.0
var dy = 0.0
var e = pow((1 - pow(b, 2) / pow(a, 2)), 0.5)
x = x - dx
y = y - dy
var mm = y / k0
var mu = mm / (a * (1.0 - pow(e, 2) / 4.0 - 3 * pow(e, 4) / 64.0 - 5 * pow(e, 6) / 256.0))
var e1 = (1.0 - pow((1.0 - pow(e, 2)), 0.5)) / (1.0 + pow((1.0 - pow(e, 2)), 0.5))
var j1 = (3 * e1 / 2 - 27 * pow(e1, 3) / 32.0)
var j2 = (21 * pow(e1, 2) / 16 - 55 * pow(e1, 4) / 32.0)
var j3 = (151 * pow(e1, 3) / 96.0)
var j4 = (1097 * pow(e1, 4) / 512.0)
var fp = mu + j1 * sin(2 * mu) + j2 * sin(4 * mu) + j3 * sin(6 * mu) + j4 * sin(8 * mu)
var e2 = pow((e * a / b), 2)
var c1 = pow(e2 * cos(fp), 2)
var t1 = pow(tan(fp), 2)
var r1 = a * (1 - pow(e, 2)) / pow((1 - pow(e, 2) * pow(sin(fp), 2)), (3.0 / 2.0))
var n1 = a / pow((1 - pow(e, 2) * pow(sin(fp), 2)), 0.5)
var dd = x / (n1 * k0)
var q1 = n1 * tan(fp) / r1
var q2 = (pow(dd, 2) / 2.0)
var q3 = (5 + 3 * t1 + 10 * c1 - 4 * pow(c1, 2) - 9 * e2) * pow(dd, 4) / 24.0
var q4 = (61 + 90 * t1 + 298 * c1 + 45 * pow(t1, 2) - 3 * pow(c1, 2) - 252 * e2) * pow(dd, 6) / 720.0
var lat = fp - q1 * (q2 - q3 + q4)
var q5 = dd
var q6 = (1 + 2 * t1 + c1) * pow(dd, 3) / 6
var q7 = (5 - 2 * c1 + 28 * t1 - 3 * pow(c1, 2) + 8 * e2 + 24 * pow(t1, 2)) * pow(dd, 5) / 120.0
var lng = lng0 + (q5 - q6 + q7) / cos(fp)
// output WGS84
lat = (lat * 180) / Double.pi
lng = (lng * 180) / Double.pi
留言
張貼留言