做了一个项目的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);
}