您的足迹:首页 > 精彩文章 >利用百度地图实现高精度定位

利用百度地图实现高精度定位

0x00介绍  

高精度IP定位目前只支持WiFi链接上网情况下的使用,其原理是实时建库和百度大数据分析挖掘,因此相比于普通IP定位能返回更加精确的定位结果。

目前相关参数如下:

成功率:综合定位成功率 65%

精度:90% 误差 80m 以内;95% 误差 350m

如果高精度定位失败的话,直接返回普通IP定位结果。

高精度IP定位服务和普通IP定位服务并存,两个服务的配额不同,定位效果也不同,请开发者结合自身业务合理选择。


0x01准备工具

1.申请请密钥(AK),作为访问API的依据

2.下载HttpClient.jar,用于进行http/https请求

httpclient_jar.zip

3.下载json-ib,用于处理json

json-lib.rar

0x02编写代码

1.编写实体类用于处理json返回数据

public class IpEntity {
	//需要定位的ip
	private String ip;
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	//纬度坐标 
	private String lat;
	//经度坐标 
	private String lng;
	//详细地址
	private String address;
	public String getLat() {
		return lat;
	}
	public void setLat(String lat) {
		this.lat = lat;
	}
	public String getLng() {
		return lng;
	}
	public void setLng(String lng) {
		this.lng = lng;
	}
	//定位时间
	private String loc_time;
	//返回代码
	private String error;
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getLoc_time() {
		return loc_time;
	}
	public void setLoc_time(String loc_time) {
		this.loc_time = loc_time;
	}
	public String getError() {
		return error;
	}
	public void setError(String error) {
		this.error = error;
	}
}

2.编写方法,调用百度高精度定位API

/**
* ip定位
* @param ip 需要定位的Ip
* @return  地址实体对象
* */
public static IpEntity IpTest(String ip){
	CloseableHttpClient httpClient  = null;
	HttpGet httpGet = null;
	CloseableHttpResponse response = null;
	IpEntity ipEntity = null;
	try {
		httpClient =  HttpClients.createDefault();
		//String ip = "59.109.64.160";
		String ak = "9w0bGND7tWoDQlbC2IGT3VGxe73rlEUG";
		//请求url
		String url = "https://api.map.baidu.com/highacciploc/v1?qcip="+ip+"&ak="+ak+"&qterm=pc&extensions=1&coord=bd09ll&callback_type=json";
		httpGet = new HttpGet(url);
		//System.out.println(httpGet.getURI());
		//执行get请求
		response = httpClient.execute(httpGet);
		//获取请求返回字符串
		HttpEntity entity = response.getEntity();
		//请求状态码
		//System.out.println(response.getStatusLine());
		if(entity != null){
			//长度
			//System.out.println("length:"+entity.getContentLength());
			String tmp = EntityUtils.toString(entity);
			//将json字符串转换为json对象
			JSONObject jsonObject = JSONObject.fromObject(tmp);
			//定位时间
			String loc_time = JSONObject.fromObject(jsonObject.getString("result")).getString("loc_time");
			//获取定位代码  161 位定位成功
			String error = JSONObject.fromObject(jsonObject.getString("result")).getString("error");
			//获取结构化地址
			String address = JSONObject.fromObject(jsonObject.getString("content")).getString("formatted_address");
			//纬度坐标 
			String lat = JSONObject.fromObject(JSONObject.fromObject(jsonObject.getString("content")).getString("location")).getString("lat");
			//经度坐标 
			String lng = JSONObject.fromObject(JSONObject.fromObject(jsonObject.getString("content")).getString("location")).getString("lng");
			ipEntity = new IpEntity();
			ipEntity.setError(error);
			ipEntity.setIp(ip);
			ipEntity.setAddress(address);
			ipEntity.setLoc_time(loc_time);
			ipEntity.setLat(lat);
			ipEntity.setLng(lng);
		}
	} catch (Exception e) {
		e.printStackTrace();
		return null;
	}finally{
		try {
			response.close();
			httpClient.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	return ipEntity;
}


3.编写main方法调用

/**
 *  测试方法
 * @param args
*/
public static void main(String[] args) {
	IpEntity ipEntity = test.IpTest("59.109.64.160");
	if(ipEntity != null){
		//判断返回状态吗是否为161 定位成功
		if(ipEntity.getError().equals("161")){
			System.out.println("定位成功!");
			System.out.println("定位ip为:"+ipEntity.getIp());
			System.out.println("定位时间:"+ipEntity.getLoc_time());
			System.out.println("具体位置:"+ipEntity.getAddress());
			System.out.println("经度为:"+ipEntity.getLat());
			System.out.println("维度为:"+ipEntity.getLng());
		}
	}
}


运行结果

QQ截图20161030232610.png

0x03项目脚本


IP定位java脚本:Ip定位源码(JAVA).rar

本博客所有文章如无特别注明均为原创。作者:0nise复制或转载请以超链接形式注明转自 0nise's Blog ---1931sec TeAm!
原文地址《利用百度地图实现高精度定位

相关推荐

  • blogger

发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(2)

注释好评
云梦渊泽 11个月前 (2017-02-18) 回复
@云梦渊泽:谢谢
0nise 11个月前 (2017-02-19) 回复