百度地图API位置偏移的校准算法

   日期:2024-12-26    作者:shzjhzq 移动:http://oml01z.riyuangf.com/mobile/quote/24135.html

1

百度地图API位置偏移的校准算法

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

package cn.wangbaiyuan.translate.tools;

 

public class PositionUtil {

 

    public static final String BAIDU_LBS_TYPE = "bd09ll";

 

    public static double pi = 3.1415926535897932384626;

    public static double a = 6378245.0;

    public static double ee = 0.00669342162296594323;

 

    

    public static Gps gps84_To_Gcj02(double lat, double lon) {

        if (outOfChina(lat, lon)) {

            return null;

        }

        double dLat = transformLat(lon - 105.0, lat - 35.0);

        double dLon = transformLon(lon - 105.0, lat - 35.0);

        double radLat = lat / 180.0 * pi;

        double magic = Math.sin(radLat);

        magic = 1 - ee * magic * magic;

        double sqrtMagic = Math.sqrt(magic);

        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);

        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);

        double mgLat = lat + dLat;

        double mgLon = lon + dLon;

        return new Gps(mgLat, mgLon);

    }

 

    

    public static Gps gcj_To_Gps84(double lat, double lon) {

        Gps gps = transform(lat, lon);

        double lontitude = lon * 2 - gps.getWgLon();

        double latitude = lat * 2 - gps.getWgLat();

        return new Gps(latitude, lontitude);

    }

 

    

    public static Gps gcj02_To_Bd09(double gg_lat, double gg_lon) {

        double x = gg_lon, y = gg_lat;

        double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * pi);

        double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * pi);

        double bd_lon = z * Math.cos(theta) + 0.0065;

        double bd_lat = z * Math.sin(theta) + 0.006;

        return new Gps(bd_lat, bd_lon);

    }

 

    

    public static Gps bd09_To_Gcj02(double bd_lat, double bd_lon) {

        double x = bd_lon - 0.0065, y = bd_lat - 0.006;

        double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * pi);

        double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * pi);

        double gg_lon = z * Math.cos(theta);

        double gg_lat = z * Math.sin(theta);

        return new Gps(gg_lat, gg_lon);

    }

 

    

    public static Gps bd09_To_Gps84(double bd_lat, double bd_lon) {

 

        Gps gcj02 = PositionUtil.bd09_To_Gcj02(bd_lat, bd_lon);

        Gps map84 = PositionUtil.gcj_To_Gps84(gcj02.getWgLat(),

                gcj02.getWgLon());

        return map84;

 

    }

 

    public static boolean outOfChina(double lat, double lon) {

        if (lon < 72.004 || lon > 137.8347)

            return true;

        if (lat < 0.8293 || lat > 55.8271)

            return true;

        return false;

    }

 

    public static Gps transform(double lat, double lon) {

        if (outOfChina(lat, lon)) {

            return new Gps(lat, lon);

        }

        double dLat = transformLat(lon - 105.0, lat - 35.0);

        double dLon = transformLon(lon - 105.0, lat - 35.0);

        double radLat = lat / 180.0 * pi;

        double magic = Math.sin(radLat);

        magic = 1 - ee * magic * magic;

        double sqrtMagic = Math.sqrt(magic);

        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);

        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);

        double mgLat = lat + dLat;

        double mgLon = lon + dLon;

        return new Gps(mgLat, mgLon);

    }

 

    public static double transformLat(double x, double y) {

        double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y

                + 0.2 * Math.sqrt(Math.abs(x));

        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;

        ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;

        ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;

        return ret;

    }

 

    public static double transformLon(double x, double y) {

        double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1

                * Math.sqrt(Math.abs(x));

        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;

        ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;

        ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0

                * pi)) * 2.0 / 3.0;

        return ret;

    }

 

    public static void main(String[] args) {

 

        // 北斗芯片获取的经纬度为WGS84地理坐标 31.426896,119.496145

        Gps gps = new Gps(31.426896, 119.496145);

        System.out.println("gps :" + gps);

        Gps gcj = gps84_To_Gcj02(gps.getWgLat(), gps.getWgLon());

        System.out.println("gcj :" + gcj);

        Gps star = gcj_To_Gps84(gcj.getWgLat(), gcj.getWgLon());

        System.out.println("star:" + star);

        Gps bd = gcj02_To_Bd09(gcj.getWgLat(), gcj.getWgLon());

        System.out.println("bd  :" + bd);

        Gps gcj2 = bd09_To_Gcj02(bd.getWgLat(), bd.getWgLon());

        System.out.println("gcj :" + gcj2);

    }


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号