首页>代码>地图纠偏java算法>/correct_lat_lon/src/com/hgq/correct/MapFix.java
package com.hgq.correct;


/**
 * 经纬度纠偏工具类
 * [一句话功能简述]<p>
 * [功能详细描述]<p>
 * @author PeiYu
 * @version 1.0, 2012-8-24
 * @see
 * @since gframe-v100
 */
public class MapFix
{
    private double casm_f = 0.0;

    private double casm_rr = 0.0;

    private double casm_t1 = 0.0;

    private double casm_t2 = 0.0;

    private double casm_x1 = 0.0;

    private double casm_x2 = 0.0;

    private double casm_y1 = 0.0;

    private double casm_y2 = 0.0;

    private MapFix()
    {
        casm_rr = 0.0;
        casm_t1 = 0.0;
        casm_t2 = 0.0;
        casm_x1 = 0.0;
        casm_y1 = 0.0;
        casm_x2 = 0.0;
        casm_y2 = 0.0;
        casm_f = 0.0;
    }

    private static MapFix instance;

    public static MapFix getInstance()
    {
        if (instance == null)
        {
            instance = new MapFix();
        }
        return instance;
    }

    /**
     * 纠偏
     * @param x 经度
     * @param y 纬度
     * @return [0]纠偏后经度   [1]纠偏后纬度
     */
    public double[] fix(double x , double y)
    {
        double[] res = new double[2];
        try
        {
            double num = x * 3686400.0;
            double num2 = y * 3686400.0;
            double num3 = 0.0;
            double num4 = 0.0;
            double num5 = 0.0;
            MapPoint point = wgtochina_lb(1, (int) num, (int) num2, (int) num5, (int) num3, (int) num4);
            double num6 = point.getX();
            double num7 = point.getY();
            num6 /= 3686400.0;
            num7 /= 3686400.0;
            res[0] = num6;
            res[1] = num7;
        }
        catch (Exception ex)
        {
            System.out.println(ex);
        }
        return res;
    }

    private void IniCasm(double w_time , double w_lng , double w_lat)
    {
        casm_t1 = w_time;
        casm_t2 = w_time;
        double num = (int) (w_time / 0.357);
        casm_rr = w_time - (num * 0.357);
        if (w_time == 0.0)
        {
            casm_rr = 0.3;
        }
        casm_x1 = w_lng;
        casm_y1 = w_lat;
        casm_x2 = w_lng;
        casm_y2 = w_lat;
        casm_f = 3.0;
    }

    private double random_yj()
    {
        double num = 314159269.0;
        double num2 = 453806245.0;
        casm_rr = (num * casm_rr) + num2;
        double num3 = (int) (casm_rr / 2.0);
        casm_rr -= num3 * 2.0;
        casm_rr /= 2.0;
        return casm_rr;
    }

    private double Transform_jy5(double x , double xx)
    {
        double num = 6378245.0;
        double num2 = 0.00669342;
        double num3 = Math.sqrt(1.0 - ((num2 * yj_sin2(x * 0.0174532925199433)) * yj_sin2(x * 0.0174532925199433)));
        return ((xx * 180.0) / (((num / num3) * Math.cos(x * 0.0174532925199433)) * 3.1415926));
    }

    private double Transform_jyj5(double x , double yy)
    {
        double num = 6378245.0;
        double num2 = 0.00669342;
        double d = 1.0 - ((num2 * yj_sin2(x * 0.0174532925199433)) * yj_sin2(x * 0.0174532925199433));
        double num4 = (num * (1.0 - num2)) / (d * Math.sqrt(d));
        return ((yy * 180.0) / (num4 * 3.1415926));
    }

    private double Transform_yj5(double x , double y)
    {
        double num = ((((300.0 + (1.0 * x)) + (2.0 * y)) + ((0.1 * x) * x)) + ((0.1 * x) * y))
                + (0.1 * Math.sqrt(Math.sqrt(x * x)));
        num += ((20.0 * yj_sin2(18.849555921538762 * x)) + (20.0 * yj_sin2(6.283185307179588 * x))) * 0.6667;
        num += ((20.0 * yj_sin2(3.141592653589794 * x)) + (40.0 * yj_sin2(1.0471975511965981 * x))) * 0.6667;
        return (num + (((150.0 * yj_sin2(0.26179938779914952 * x)) + (300.0 * yj_sin2(0.10471975511965979 * x))) * 0.6667));
    }

    private double Transform_yjy5(double x , double y)
    {
        double num = ((((-100.0 + (2.0 * x)) + (3.0 * y)) + ((0.2 * y) * y)) + ((0.1 * x) * y))
                + (0.2 * Math.sqrt(Math.sqrt(x * x)));
        num += ((20.0 * yj_sin2(18.849555921538762 * x)) + (20.0 * yj_sin2(6.283185307179588 * x))) * 0.6667;
        num += ((20.0 * yj_sin2(3.141592653589794 * y)) + (40.0 * yj_sin2(1.0471975511965981 * y))) * 0.6667;
        return (num + (((160.0 * yj_sin2(0.26179938779914952 * y)) + (320.0 * yj_sin2(0.10471975511965979 * y))) * 0.6667));
    }

    private MapPoint wgtochina_lb(int wg_flag , int wg_lng , int wg_lat , int wg_heit , int wg_week , int wg_time)
    {
        MapPoint point = null;
        if (wg_heit <= 0x1388)
        {
            double num = wg_lng;
            num /= 3686400.0;
            double x = wg_lat;
            x /= 3686400.0;
            if (num < 72.004)
            {
                return point;
            }
            if (num > 137.8347)
            {
                return point;
            }
            if (x < 0.8293)
            {
                return point;
            }
            if (x > 55.8271)
            {
                return point;
            }
            if (wg_flag == 0)
            {
                IniCasm((double) wg_time, (double) wg_lng, (double) wg_lat);
                point = new MapPoint();
                point.setLatitude((double) wg_lng);
                point.setLongitude((double) wg_lat);
                return point;
            }
            casm_t2 = wg_time;
            double num3 = (casm_t2 - casm_t1) / 1000.0;
            if (num3 <= 0.0)
            {
                casm_t1 = casm_t2;
                casm_f++;
                casm_x1 = casm_x2;
                casm_f++;
                casm_y1 = casm_y2;
                casm_f++;
            }
            else if (num3 > 120.0)
            {
                if (casm_f == 3.0)
                {
                    casm_f = 0.0;
                    casm_x2 = wg_lng;
                    casm_y2 = wg_lat;
                    double num4 = casm_x2 - casm_x1;
                    double num5 = casm_y2 - casm_y1;
                    double num6 = Math.sqrt((num4 * num4) + (num5 * num5)) / num3;
                    if (num6 > 3185.0)
                    {
                        return point;
                    }
                }
                casm_t1 = casm_t2;
                casm_f++;
                casm_x1 = casm_x2;
                casm_f++;
                casm_y1 = casm_y2;
                casm_f++;
            }
            double xx = Transform_yj5(num - 105.0, x - 35.0);
            double yy = Transform_yjy5(num - 105.0, x - 35.0);
            double num9 = wg_heit;
            xx = ((xx + (num9 * 0.001)) + yj_sin2(wg_time * 0.0174532925199433)) + random_yj();
            yy = ((yy + (num9 * 0.001)) + yj_sin2(wg_time * 0.0174532925199433)) + random_yj();
            point = new MapPoint();
            point.setX((num + Transform_jy5(x, xx)) * 3686400.0);
            point.setY((x + Transform_jyj5(x, yy)) * 3686400.0);
        }
        return point;
    }

    private double yj_sin2(double x)
    {
        double num = 0.0;
        if (x < 0.0)
        {
            x = -x;
            num = 1.0;
        }
        int num2 = (int) (x / 6.28318530717959);
        double num3 = x - (num2 * 6.28318530717959);
        if (num3 > 3.1415926535897931)
        {
            num3 -= 3.1415926535897931;
            if (num == 1.0)
            {
                num = 0.0;
            }
            else if (num == 0.0)
            {
                num = 1.0;
            }
        }
        x = num3;
        double num4 = x;
        double num5 = x;
        num3 *= num3;
        num5 *= num3;
        num4 -= num5 * 0.166666666666667;
        num5 *= num3;
        num4 += num5 * 0.00833333333333333;
        num5 *= num3;
        num4 -= num5 * 0.000198412698412698;
        num5 *= num3;
        num4 += num5 * 2.75573192239859E-06;
        num5 *= num3;
        num4 -= num5 * 2.50521083854417E-08;
        if (num == 1.0)
        {
            num4 = -num4;
        }
        return num4;
    }
}
最近下载更多
cxlone515  LV1 2022年8月7日
1158583576  LV1 2022年7月28日
615715427  LV1 2022年2月10日
ninilulu  LV1 2021年12月25日
ruchusd  LV1 2021年11月22日
简单  LV2 2021年11月13日
shiqingwen  LV1 2021年9月16日
usernull 2021年8月10日
暂无贡献等级
嗨喽  LV1 2021年7月15日
最近浏览更多
edpwyg  LV14 2023年10月21日
yangzhoubing 2023年6月9日
暂无贡献等级
暂无贡献等级
xiexiaoming05  LV14 2022年11月16日
wangjing11 2022年10月19日
暂无贡献等级
cxlone515  LV1 2022年8月7日
1158583576  LV1 2022年7月28日
luisfabiano  LV2 2022年4月2日
yaojindou  LV2 2022年2月10日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友