GPS坐标(经纬度)转换为百度坐标(经纬度)续

本文介绍了两种坐标转换方法:一种是通过Java程序调用百度API实现GPS坐标到百度地图坐标的转换;另一种是在JavaScript中利用百度地图API完成坐标转换。

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;
})();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值