JWDUtil.java 6.34 KB
/**
 * JWDUtil.java
 * com.bsth.web.service
 * JwdChange
 */
package com.bsth.util;

import java.util.HashMap;
import java.util.Map;

import com.bsth.util.CoordinateConverter.Location;

/**
 * @author caiwangjue
 * @date 2011-10-13 上午09:53:40
 * 经纬度和城建坐标互转
 */
public class JWDUtil {

	/**
	 * 经纬度坐标转换成上海城建坐标
	 * @param fLon 经度
	 * @param fLat 纬度
	 * @return 城建坐标Map
	 */
	@SuppressWarnings("rawtypes")
	public static Map ConvertJWToSH(double fLon, double fLat)
	{
	    double jd = fLon;
	    double wd = fLat;
	    Map map = ConvertJWDToBeijing(jd, wd);
	    //Map rmap = ConvertBeijingToShanghai((Double)map.get("x"), (Double)map.get("y"));
	    return map;
	}
	
	/**
	 * 上海城建坐标转换为经纬度
	 * @param fXX X坐标
	 * @param fYY Y坐标
	 * @return 经纬度坐标Map
	 */
	@SuppressWarnings("rawtypes")
	public static Map ConvertSHToJW(double fXX, double fYY)
	{
	    double x = fXX;
	    double y = fYY;
	    Map map = ConvertShanghaiToBeijing(x, y);
	    Map rmap = ConvertBeijingToJWD((Double)map.get("x"), (Double)map.get("y"));
	    return rmap;
	}

	
	/**
	 * 经纬度坐标转换成北京城建坐标
	 * @param jd 经度
	 * @param wd 纬度
	 * @return 城建坐标Map
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	private static Map ConvertJWDToBeijing(double jd, double wd)
	{
		Map map = new HashMap();
		double num = 121.4671606;
	    double num2 = jd - num;
	    double num3 = num2 / 57.2957795130823;
	    double a = (wd / 180.0) * Math.PI;
	    double num5 = Math.tan(a);
	    double num6 = Math.cos(a);
	    double num7 = (0.006738525415 * num6) * num6;
	    double num8 = num5 * num5;
	    double d = 1.0 + num7;
	    double num10 = 6399698.9018 / Math.sqrt(d);
	    double num11 = ((num3 * num3) * num6) * num6;
	    double num12 = num5 * num6;
	    double num13 = num12 * num12;
	    double num14 = 32005.78006 + (num13 * (133.92133 + (num13 * 0.7031)));
	    double num15 = (((6367558.49686 * wd) / 57.29577951308) - ((num12 * num6) * num14)) + ((((((((((((((num8 - 58.0) * num8) + 61.0) * num11) / 30.0) + (((4.0 * num7) + 5.0) * d)) - num8) * num11) / 12.0) + 1.0) * num10) * num5) * num11) / 2.0);
	    double num16 = ((((((((((((num8 - 18.0) * num8) - (((58.0 * num8) - 14.0) * num7)) + 5.0) * num11) / 20.0) + d) - num8) * num11) / 6.0) + 1.0) * num10) * (num3 * num6);
	    map.put("x", (num15 + -3457140.589));
	    map.put("y", num16);
	    return map;
	}
	
	/**
	 * 上海城建坐标转换为北京城建坐标
	 * @param x X坐标
	 * @param y Y坐标
	 * @return 城建坐标Map
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private static Map ConvertShanghaiToBeijing(double x, double y)
	{
		Map map = new HashMap();
        double num = x;
        x = y;
        y = num;
        double num2 = 3458144.04;
        double num3 = -146121.96;
        double num4 = 1.000140682;
        double num5 = 0.013930556;
        double num6 = (num2 + (num4 * x)) - (num5 * y);
        double num7 = (num3 + (num4 * y)) + (num5 * x);
        map.put("x", num6);
        map.put("y", (num7 + 21000000.0) + 500000.0);
        return map;
	}
	
	/**
	 * 北京城建坐标转换为上海城建坐标
	 * @param x X坐标
	 * @param y Y坐标
	 * @return 城建坐标Map
	 */
	@SuppressWarnings({ "rawtypes", "unused", "unchecked" })
	private static Map ConvertBeijingToShanghai(double x, double y)
	{
		Map map = new HashMap();
	    double num = 3458144.04;
	    double num2 = -146121.96;
	    double num3 = 1.000140682;
	    double num4 = 0.013930556;
        y -= 21500000.0;
        double num5 = ((num3 * (x - num)) + (num4 * (y - num2))) / (Math.pow(num3, 2.0) + Math.pow(num4, 2.0));
        double num6 = ((num3 * (y - num2)) - (num4 * (x - num))) / (Math.pow(num3, 2.0) + Math.pow(num4, 2.0));
        map.put("x", num6);
        map.put("y", num5);
        return map;
	}
	
	/**
	 * 北京城建坐标转换为经纬度
	 * @param x X坐标
	 * @param y Y坐标
	 * @return 经纬度坐标Map
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private static Map ConvertBeijingToJWD(double x, double y)
	{
		Map map = new HashMap();
		double num = 123.0;
        y -= 21500000.0;
        double num2 = (x / 1000000.0) - 3.0;
        double num3 = (((((27.11115372595 + (9.02468257083 * num2)) - (0.00579740442 * Math.pow(num2, 2.0))) - (0.00043532572 * Math.pow(num2, 3.0))) + (4.857285E-05 * Math.pow(num2, 4.0))) + (2.15727E-06 * Math.pow(num2, 5.0))) - (1.9288E-07 * Math.pow(num2, 6.0));
        double num4 = Math.tan((num3 * Math.PI) / 180.0);
        double num5 = 0.0067385254147 * Math.pow(Math.cos((num3 * Math.PI) / 180.0), 2.0);
        double num6 = (y * Math.sqrt(1.0 + num5)) / 6399698.90178271;
        double num7 = num3 - ((((1.0 + num5) * num4) * (((90.0 * Math.pow(num6, 2.0)) - ((7.5 * ((5.0 + (3.0 * Math.pow(num4, 2.0))) -
        					((9.0 * num5) * Math.pow(num5, 2.0)))) * Math.pow(num6, 4.0))) + ((0.25 * ((61.0 + (90.0 * Math.pow(num5, 2.0))) 
        					+ (45.0 * Math.pow(num4, 4.0)))) * Math.pow(num6, 6.0)))) / Math.PI);
        double num8 = (((180.0 * num6) - ((30.0 * ((1.0 + (2.0 * Math.pow(num4, 2.0))) + num5)) * Math.pow(num6, 3.0))) + 
        					((1.5 * ((5.0 + (28.0 * Math.pow(num4, 2.0))) + (24.0 * Math.pow(num4, 4.0)))) * Math.pow(num6, 5.0))) / (Math.PI * Math.cos((num3 * Math.PI) / 180.0));
        double num9 = num + num8;
        map.put("x", num9);
        map.put("y", num7);
        return map;
	}
	
	@SuppressWarnings({ "rawtypes", "unused" })
	private static Map ConvertJWDToSH(double x, double y)
	{
		Map map = new HashMap();
		double num = 123.0;
		
		return map;
	}
	
	public static void main(String[] args)
	{
		//2447.667013 351.858477
		Map map = JWDUtil.ConvertJWToSH(121.56320853169203, 31.264449981962045);
		/*System.out.println(map.get("x")+"####"+map.get("y"));*/
		
		Map map_2 = JWDUtil.ConvertSHToJW(8733.12663,103.65674);
		System.out.println(map_2.get("x")+"####"+map_2.get("y"));
		Location location = CoordinateConverter.LocationMake(Float.parseFloat(map_2.get("x").toString()), Float.parseFloat(map_2.get("y").toString()));
		location = CoordinateConverter.bd_encrypt(CoordinateConverter.transformFromWGSToGCJ(location));
		System.out.println(location.getLng()+","+location.getLat());
	}
}