From 90e2c4f9ef2d9b20b070d316f725b43283129e43 Mon Sep 17 00:00:00 2001
From: bigsk <i@ianxia.com>
Date: Tue, 1 Nov 2022 16:45:11 +0000
Subject: [PATCH] added main.js

---
 main.js | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 86 insertions(+)
 create mode 100644 main.js

diff --git a/main.js b/main.js
new file mode 100644
index 0000000..ad9d500
--- /dev/null
+++ b/main.js
@@ -0,0 +1,86 @@
+/** 长半径a=6378137 */
+let a = 6378137;
+/** 短半径b=6356752.314245 */
+let b = 6356752.314245;
+/** 扁率f=1/298.257223563 */
+let f = 1 / 298.257223563;
+
+/**
+ * 根据提供的经纬度计算两点间距离
+ *
+ * @param lat_one 坐标1纬度
+ * @param lon_one 坐标1经度
+ * @param lat_two 坐标2纬度
+ * @param lon_two 坐标2经度
+ * @return 两点间距离
+ */
+function getDistance(lat_one, lon_one, lat_two, lon_two) {
+    let L = toRadians(lon_one - lon_two);
+    let U1 = Math.atan((1 - f) * Math.tan(toRadians(lat_one)));
+    let U2 = Math.atan((1 - f) * Math.tan(toRadians(lat_two)));
+    let sinU1 = Math.sin(U1), cosU1 = Math.cos(U1),
+            sinU2 = Math.sin(U2), cosU2 = Math.cos(U2);
+    let lambda = L, lambdaP = Math.PI;
+    let cosSqAlpha = 0, sinSigma = 0, cos2SigmaM = 0, cosSigma = 0, sigma = 0;
+    let circleCount = 40;
+    //迭代循环
+    while (Math.abs(lambda - lambdaP) > 1e-12 && --circleCount > 0) {
+        let sinLambda = Math.sin(lambda), cosLambda = Math.cos(lambda);
+        sinSigma = Math.sqrt((cosU2 * sinLambda) * (cosU2 * sinLambda) +
+                (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) * (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda));
+        if (sinSigma == 0) {
+            return 0;  // co-incident points
+        }
+        cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;
+        sigma = Math.atan2(sinSigma, cosSigma);
+        let alpha = Math.asin(cosU1 * cosU2 * sinLambda / sinSigma);
+        cosSqAlpha = Math.cos(alpha) * Math.cos(alpha);
+        cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSqAlpha;
+        let C = f / 16 * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha));
+        lambdaP = lambda;
+        lambda = L + (1 - C) * f * Math.sin(alpha) *
+                (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)));
+    }
+    if (circleCount == 0) {
+        return NaN;  // formula failed to converge
+    }
+    let uSq = cosSqAlpha * (a * a - b * b) / (b * b);
+    let A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));
+    let B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));
+    let deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * (cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM) -
+            B / 6 * cos2SigmaM * (-3 + 4 * sinSigma * sinSigma) * (-3 + 4 * cos2SigmaM * cos2SigmaM)));
+
+    let result = b * A * (sigma - deltaSigma) / 1000;
+    return result;
+}
+
+/**
+ * 根据提供的角度值,将其转化为弧度
+ *
+ * @param angle 角度值
+ * @return 结果
+ */
+function toRadians(angle) {
+    let result = 0;
+    if (angle != null) {
+        result = angle * Math.PI / 180;
+    }
+    return result;
+}
+
+
+function main(args) {
+    // TODO Auto-generated method stub
+    //坐标1经度
+    let lon_one = 1;
+    //坐标1纬度
+    let lat_one = 2;
+    //坐标2经度
+    let lon_two = 3;
+    //坐标2纬度
+    let lat_two = 4;
+    let distance = getDistance(lat_one, lon_one, lat_two, lon_two);
+    console.log(distance);
+}
+
+main();
\ No newline at end of file