关于GPS坐标与百度坐标相互转换的方法与问题

阅读更多

做了一个项目的gis开发这块 突然想把遇到的一些问题及解决办法分享记录下来 关于GPS坐标与百度坐标相互转换的方法与问题 网上看了很多人写的博客 所以我想结合自己的想法分享 坐标转换注意问题 一:GPS坐一:标转百度坐标

       方法一:

首先引入一个js文件:

引入这个js文件的目的调用这个方法: BMap.Convertor.translate(gpsPoint,0,translateCallback); 百度地图提供的translate方法。其中参数gpspoint代表真实的gps坐标,0表示类型代表GPS(2代表google 4代表百度), translateCallback回调函数。下面举个例子

                         var gps_x =120.8484309 ,gps_y=30.0998883;//GPS坐标

                         /**GPS转换为百度坐标*/

                         function translate(){

                               BMap.Convertor.translate(new BMap.Point(gps_x,gps_y),0,function(point){

                                                      var marker = new BMap.Marker(point);

                                                       map.addOverlay(marker);

                             });

                         }

上面的function(point) 就是回调函数 translateCallback; point是回调函数返回的值也就是表示 GPS转为百度坐标时的point

       方法二: 下面是我的个人理解 就是如果在回调函数里面牵涉到与后台的数据交互 可能就会出现问题 例如数据无法存入数据库 或者数据刷新不上来 这个时候我们可以尝试下面这个方法:使用HTTP请求方法转换GPS坐标获取结果(此方法适用于从后台数据库获取gps坐标后转换为百度坐标传到前台进行操作)

一个小技巧 下面类里面的请求地址即http://api.map.baidu.com/ag/coord/convert?from=0&to=4&x="+lng+"+&y="+lat+"&callback=BMap.Convertor.cbk_7594 我们可以替换里面的lng和lat为某个数值例如lng为116.397428 lat为39.90923 然后再浏览器里面打开这个地址 我们就会获取一个返回的字符串 如下

BMap.Convertor.cbk_7594&&BMap.Convertor.cbk_7594({"error":0,"x":"MTE2LjQxMDA0OTUwNTY2","y":"MzkuOTE2OTc5NTE5ODcz"})

    这样我们就可以很清晰的发现返回数据的格式和结果即x 和 y的值

public class Gps2Baidu{

      public static String translate(String lng,String lat){

          //请求地址
        String path = "http://api.map.baidu.com/ag/coord/convert?from=0&to=4&x="+lng+"+&y="+lat+"&callback=BMap.Convertor.cbk_7594";
        try
        {
            //使用http请求获取转换结果
            URL url = new URL(path);
            //获取连接conn
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //设置请求的方式
            conn.setRequestMethod("GET");
            //设置请求的过期时间
            conn.setConnectTimeout(5 * 1000);
            
            //读取conn返回的数据流
            InputStream inStream = conn.getInputStream();
            //输出流
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            //写入操作
            while ((len = inStream.read(buffer)) != -1)
            {
                outStream.write(buffer, 0, len);
            }
            //得到返回的结果
            String res = outStream.toString();
            //判断返回结果的格式
            if (res.indexOf("(") > 0 && res.indexOf(")") > 0)
            {
                //截取返回字符串游泳的部分即'('与')'之间的数据
                String str = res.substring(res.indexOf("(") + 1, res.indexOf(")"));
                //获取 参数error的值
                String err = res.substring(res.indexOf("error") + 7, res.indexOf("error") + 8);
                //error=0
                if ("0".equals(err))
                {
                    JSONObject js = JSONObject.fromObject(str);
                    //编码转换
                    String x1 = new String(Base64.decode(js.getString("x")));
                    String y1 = new String(Base64.decode(js.getString("y")));
                    return (x1 + "," + y1);
                }
            }
            } catch (Exception e)
            {
                e.printStackTrace();
            }
            return null;
        }                             

}

 

二:百度坐标转为GPS坐标  这个百度地图并没有提供相应的方法          我们可以试用一下方法

          ① 对百度地图坐标 bd_x bd_y 进行一次 BMap.Convertor.translate 获取一个新的bd_x1 bd_y1

          ②利用以下公式 gps_x = 2*bd_x-bd_x1; gps_y =2*bd_y-bd_y1 获取 GPS坐标  不信可以去试试 误差很少

 三:java  google转百度坐标

/**

* google经纬度转换成百度经纬度 纬度转换

* @param longitude

* @return

*/

private static String googlePoint2BdMapLat(double lng,double lat){

double x = lng, y = lat;

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

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

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

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

return String.valueOf(lat);

}

你可能感兴趣的:(百度坐标,GPS,google)