1、早前初步接触的时候转载过一个真实经纬度转百度经纬度的JAVA计算的方法,后续实用起来发现还是有一定的误差的,于是依然改为依赖网络调用百度接口去请求查询,此处依然先介绍一个java发送post请求调用百度提供的转换接口转换坐标
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.log4j.Logger;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
public class GPStoBaidu {
private static final Logger log = Logger.getLogger(GPStoBaidu.class);
public static double[] postBaidu(double lat, double lng) {
double[] latlng = null;
URL url = null;
URLConnection connection = null;
try {
url = new URL("http://api.map.baidu.com/ag/coord/convert?from=0&to=4&x=" + String.valueOf(lat) + "&y="
+ String.valueOf(lng));
connection = url.openConnection();
connection.setConnectTimeout(1000);
connection.setReadTimeout(1000);
connection.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "utf-8");
out.flush();
out.close();
// 服务器的回应的字串,并解析
String sCurrentLine;
String sTotalString;
sCurrentLine = "";
sTotalString = "";
InputStream l_urlStream;
l_urlStream = connection.getInputStream();
BufferedReader l_reader = new BufferedReader(new InputStreamReader(l_urlStream));
while ((sCurrentLine = l_reader.readLine()) != null) {
if (!sCurrentLine.equals(""))
sTotalString += sCurrentLine;
}
// System.out.println(sTotalString);
sTotalString = sTotalString.substring(1, sTotalString.length() - 1);
// System.out.println(sTotalString);
String[] results = sTotalString.split("\\,");
if (results.length == 3) {
if (results[0].split("\\:")[1].equals("0")) {
String mapX = results[1].split("\\:")[1];
String mapY = results[2].split("\\:")[1];
mapX = mapX.substring(1, mapX.length() - 1);
mapY = mapY.substring(1, mapY.length() - 1);
mapX = new String(Base64.decode(mapX));
mapY = new String(Base64.decode(mapY));
// System.out.println(mapX);
// System.out.println(mapY);
latlng = new double[] { Double.parseDouble(mapX), Double.parseDouble(mapY) };
} else {
System.out.println("error != 0");
}
} else {
System.out.println("String invalid!");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("GPS转百度坐标异常!");
}
SimpleDateFormat dateFormat1 = new SimpleDateFormat("HH:mm:ss");
log.info("百度GPS===" + dateFormat1.format(new Date()) + " " + latlng[0] + " " + latlng[1]);
return latlng;
}
public static void main(String[] args) throws IOException {
double lat = 114.42285333333334;
double lng = 30.459873333333334;
double[] latlng = GPStoBaidu.postBaidu(lat, lng);
System.out.println("lat===" + latlng[0] + " lng===" + latlng[1]);
}
}
2、在js中使用百度提供的方法转换坐标,这里就直接贴自己的代码了,没有做过多的删减,有心要用可详细了解下百度地图API中代码
var convertor = new BMap.Convertor();
//=============================设置地图中心
function setMapCenter_gps(lng, lat) {
translateCallback = function (data){
if(data.status === 0) {
map.setZoom(17);
map.setCenter(data.points[0]);
}
}
var pointArr = [];
pointArr.push(new BMap.Point(lng, lat));
convertor.translate(pointArr, 1, 5, translateCallback);
}
需要注意的是这个接口可以很多类型的地图互相之间的转换
上面代码中translate方法:
参数1:可push多个点进去同时转换
参数2:被转换的坐标类型
参数3:转换后的坐标类型
参数2、3可根据自己的需求按下面的类型相应转换:
1:GPS设备获取的角度坐标,wgs84坐标;
2:GPS获取的米制坐标、sogou地图所用坐标;
3:google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标,国测局坐标;
4:3中列表地图坐标对应的米制坐标;
5:百度地图采用的经纬度坐标;
6:百度地图采用的米制坐标;
7:mapbar地图坐标;
8:51地图坐标
注:Convertor的回调函数translate是可以重写的,需要重写掉百度的convertor.js文件,并在调用的页面中引入此文件,以下代码仅供特殊需求参考
convertor.js文件代码:
(function() { //闭包
function load_script(xyUrl, callback) {
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = xyUrl;
//借鉴了jQuery的script跨域方法
script.onload = script.onreadystatechange = function() {
if ((!this.readyState || this.readyState === "loaded" || this.readyState === "complete")) {
callback && callback();
// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
if (head && script.parentNode) {
head.removeChild(script);
}
}
};
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
head.insertBefore(script, head.firstChild);
}
function translate(point, type, callback, A, B, C, D, E, F, G, H) {
var callbackName = 'cbk_' + Math.round(Math.random() * 10000); //随机函数名
var xyUrl = "http://api.map.baidu.com/ag/coord/convert?from=" + type
+ "&to=4&x=" + point.lng + "&y=" + point.lat
+ "&callback=BMap.Convertor." + callbackName;
//动态创建script标签
load_script(xyUrl);
BMap.Convertor[callbackName] = function(xyResult) {
delete BMap.Convertor[callbackName]; //调用完需要删除改函数
var point = new BMap.Point(xyResult.x, xyResult.y);
callback && callback(point, A, B, C, D, E, F, G, H);
}
}
window.BMap = window.BMap || {};
BMap.Convertor = {};
BMap.Convertor.translate = translate;
})();