黑帽联盟

标题: 利用百度地图实现高精度定位 [打印本页]

作者: dormant    时间: 2016-12-13 23:46
标题: 利用百度地图实现高精度定位
本帖最后由 dormant 于 2016-12-13 23:47 编辑

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());                }        }}
JAVA代码打包:
作者: admin    时间: 2016-12-14 00:06
楼主测试过没有,牛叉
作者: dormant    时间: 2016-12-14 00:08
admin 发表于 2016-12-14 00:06
楼主测试过没有,牛叉

你可以测试下撒
作者: 芝麻SEO    时间: 2016-12-14 09:12
什么东西表示看不懂,学习一下
作者: 小木木    时间: 2016-12-19 00:42
  厉害了!
作者: swwff    时间: 2017-2-6 14:08

作者: qiaoqingyi    时间: 2018-4-28 00:27
hen牛逼啊··········




欢迎光临 黑帽联盟 (https://bbs.cnblackhat.com/) Powered by Discuz! X2.5