百度api使用方法(java、js)

自己的项目使用到了百度地图api,我就论我使用到的部分进行说明。首先我们先了解几个网站http://lbsyun.baidu.com/   这是百度地图开放平台首页    http://lbsyun.baidu.com/index.php?title=jspopular/openlibrary   这是javascript对接百度地图api的首页        http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding  这是web服务的首页(包括地址解析和逆地址解析)  http://lbsyun.baidu.com/jsdemo.htm#i7_2  这是用js调用百度地图api示例的源码。   http://lbsyun.baidu.com/apiconsole/key   这是创建ak的网站。但是使用外国的地址解析时,需要付费。

接下来我们开始第一步,创建ak,我们要使用百度地图的api,首先得自己创一个ak(也就是密钥),不同的应用需要创建不同的ak。点击应用

 因为我是用在浏览器上的,所以我选择浏览器端的应用类型,下面的启动服务介绍可以用哪些服务,我需要用js调用百度地图,所以这才是我所需要的,我们也可以从这里看出我们选的应用类型是否正确。

 第二步,那就是研究我上面上传的几个网站,对于我的网站我只用到了地址解析和用js调用百度地图,就是输入详细地址,转换为地理坐标或者直接显示为地图。

这是一个案例网址   http://api.map.baidu.com/geocoder/v2/?address=北京市海淀区上地十街10号&output=json&ak=您的ak&callback=showLocation //GET请求,我们打开这个网址便能得到北京市海淀区上地十街10号的坐标,不过要换为自己的ak,所以我们通过改变address的参数就可以得到我们想要的坐标。下面为介绍的参数。

 

请求参数

参数名参数含义类型举例默认值是否必须
address待解析的地址。最多支持84个字节。
可以输入两种样式的值,分别是: 
1、标准的结构化地址信息,如北京市海淀区上地十街十号 【推荐,地址结构越完整,解析精度越高】
2、支持“*路与*路交叉口”描述方式,如北一环路和阜阳路的交叉路口
第二种方式并不总是有返回结果,只有当地址库中存在该地址描述时才有返回。
string北京市海淀区上地十街10号
city地址所在的城市名。用于指定上述地址所在的城市,当多个城市都有上述地址时,该参数起到过滤作用,但不限制坐标召回城市。string北京市
ret_coordtype可选参数,添加后返回国测局经纬度坐标或百度米制坐标 坐标系说明stringgcj02ll(国测局坐标)、bd09mc(百度墨卡托坐标)bd09ll(百度经纬度坐标)
ak用户申请注册的key,自v2开始参数修改为“ak”,之前版本参数为“key” 申请akstring 
sn若用户所用ak的校验方式为sn校验时该参数必须 
sn生成
string 
output输出格式为json或者xmlstringjson或xmlxml
callback将json格式的返回值通过callback函数返回以实现jsonp功能stringcallback=showLocation(JavaScript函数名)

返回结果参数

名称含义类型
status返回结果状态值, 成功返回0,其他值请查看下方返回码状态表。int
location经纬度坐标object
 lat纬度值float
 lng经度值float
precise位置的附加信息,是否精确查找。1为精确查找,即准确打点;0为不精确,即模糊打点。int
confidence描述打点绝对精度(即坐标点的误差范围)。
confidence=100,解析误差绝对精度小于20m;
confidence≥90,解析误差绝对精度小于50m;
confidence≥80,解析误差绝对精度小于100m;
confidence≥75,解析误差绝对精度小于200m;
confidence≥70,解析误差绝对精度小于300m;
confidence≥60,解析误差绝对精度小于500m;
confidence≥50,解析误差绝对精度小于1000m;
confidence≥40,解析误差绝对精度小于2000m;
confidence≥30,解析误差绝对精度小于5000m;
confidence≥25,解析误差绝对精度小于8000m;
confidence≥20,解析误差绝对精度小于10000m;
int
comprehension描述地址理解程度。分值范围0-100,分值越大,服务对地址理解程度越高(建议以该字段作为解析结果判断标准);
当comprehension值为以下值时,对应的准确率如下:
comprehension=100,解析误差100m内概率为91%,误差500m内概率为96%;
comprehension≥90,解析误差100m内概率为89%,误差500m内概率为96%;
comprehension≥80,解析误差100m内概率为88%,误差500m内概率为95%;
comprehension≥70,解析误差100m内概率为84%,误差500m内概率为93%;
comprehension≥60,解析误差100m内概率为81%,误差500m内概率为91%;
comprehension≥50,解析误差100m内概率为79%,误差500m内概率为90%;
//解析误差:地理编码服务解析地址得到的坐标位置,与地址对应的真实位置间的距离。
int
level能精确理解的地址类型,包含:UNKNOWN、国家、省、城市、区县、乡镇、村庄、道路、地产小区、商务大厦、政府机构、交叉路口、商圈、生活服务、休闲娱乐、餐饮、宾馆、购物、金融、教育、医疗 、工业园区 、旅游景点 、汽车服务、火车站、长途汽车站、桥 、停车场/停车区、港口/码头、收费区/收费站、飞机场 、机场 、收费处/收费站 、加油站、绿地、门址string

 

服务状态码

返回码英文描述定义常见原因
0ok正常服务请求正常召回
1 服务器内部错误 
2Parameter Invalid请求参数非法必要参数拼写错误或漏传(如query和tag请求中均未传入)
3Verify Failure权限校验失败 
4Quota Failure配额校验失败服务当日调用次数已超限,请前往API控制台提升(请优先进行开发者认证
5AK Failureak不存在或者非法未传入ak参数;ak已被删除(可前往回收站恢复);
101 服务禁用 
102 不通过白名单或者安全码不对 
2xx 无权限 
3xx 配额错误 

我在网上找了个例子,网址名忘记了,不过就是jar包错误,我后面找到了对的,在使用j'son攻击类的时候,我们依赖阿里巴巴的一个jar包即可使用,名字叫做fastjson,网上有很多关于它的教程与介绍。下面我们介绍通过java获取坐标系的方法。

导入maven依赖:

<dependency>
		<groupId>commons-lang</groupId>
		<artifactId>commons-lang</artifactId>
		<version>2.5</version>
	</dependency>
	<dependency>
		<groupId>commons-beanutils</groupId>
		<artifactId>commons-beanutils</artifactId>
		<version>1.9.3</version>
	</dependency>
	<dependency>
		<groupId>commons-collections</groupId>
		<artifactId>commons-collections</artifactId>
		<version>3.2.2</version>
	</dependency>

		<dependency>
			<groupId>com.vaadin.external.google</groupId>
			<artifactId>android-json</artifactId>
			<version>RELEASE</version>
			<scope>compile</scope>
		</dependency>
<!--使用json的工具类,由阿里巴巴开发的工具包-->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.57</version>
		</dependency>

第二步,给前端的bean


import java.io.Serializable;

/**
 * 测试java与百度api结合一起,通过地址取得经纬度返回的json类
 */
public class BaseResponse implements Serializable{
    private String data;
    private Boolean Success;
    private String ErrorMsg;

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public Boolean getSuccess() {
        return Success;
    }

    public void setSuccess(Boolean success) {
        Success = success;
    }

    public String getErrorMsg() {
        return ErrorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        ErrorMsg = errorMsg;
    }

    @Override
    public String toString() {
        return "BaseResponse{" +
                "data='" + data + '\'' +
                ", Success=" + Success +
                ", ErrorMsg='" + ErrorMsg + '\'' +
                '}';
    }
}

自己的controller类:

//根据地名获取经纬度
    public  String loadJSON(String url) {

        StringBuilder json = new StringBuilder();
        try {
            log.info("11-2");
            URL oracle = new URL(url);
            URLConnection yc = oracle.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream(), "UTF-8"));
            String inputLine = null;
            while ((inputLine = in.readLine()) != null) {
                json.append(inputLine);
            }
            in.close();
        } catch (MalformedURLException e) {} catch (IOException e) {}
        return json.toString();
    }

    //返回值
    @GetMapping("/getCoordinate")
    @ResponseBody
    public BaseResponse  getCoordinate(String address) {
        BaseResponse response = new BaseResponse();
        log.info("1");
        try{
            log.info("2");
            if (address != null && !"".equals(address)) {
                log.info("3");
                address = address.replaceAll("\\s*", "").replace("#", "栋");
                String url = "http://api.map.baidu.com/geocoder/v2/?address=" + address + "&output=json&ak=Iyv2Gax3s1PF0PR4DtvToePapxIOuj1Y";
                String json = loadJSON(url);
                log.info("json:{}",json);
                if (json != null && !"".equals(json)) {
                    com.alibaba.fastjson.JSONObject obj = JSON.parseObject(json);
                    if ("0".equals(obj.getString("status"))) {
                        //log.info(String.valueOf(obj.getJSONObject("result").getJSONObject("location").getDouble("lng")));
                        double lng = obj.getJSONObject("result").getJSONObject("location").getDouble("lng"); // 经度
                        log.info(String.valueOf(lng));
                        double lat = obj.getJSONObject("result").getJSONObject("location").getDouble("lat"); // 纬度

                      /*这个是固定小数位,这里固定了7位小数,返回结果为40.057339
                        DecimalFormat df = new DecimalFormat("#.######");
                        String lng1 = df.format(lng);
                        String lat1 = df.format(lat);*/
                        response.setData("经度:"+lng+"纬度:"+lat);
                        response.setSuccess(true);

                        return response;
                    }
                }
            }

        }catch (Exception e){
            response.setErrorMsg("无网络");
        }
        return response;
    }

第三步:其实第二步和第三步可以自己随便选一种,看自己的需求。可以直接通过传入地址或者传入经纬度就可以得到自己想要的地图,这个在官网上有源码,这个是使用地址解析,将北京市海淀区上地10街换成其他地址,并输入自己的ak密钥即可显示地图。

<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
	<style type="text/css">
		body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
	</style>
	<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"></script>
	<title>地址解析</title>
</head>
<body>
	<div id="allmap"></div>
</body>
</html>
<script type="text/javascript">
	// 百度地图API功能
	var map = new BMap.Map("allmap");
	var point = new BMap.Point(116.331398,39.897445);
	map.centerAndZoom(point,12);
	// 创建地址解析器实例
	var myGeo = new BMap.Geocoder();
	// 将地址解析结果显示在地图上,并调整地图视野
	myGeo.getPoint("北京市海淀区上地10街", function(point){
		if (point) {
			map.centerAndZoom(point, 16);
			map.addOverlay(new BMap.Marker(point));
		}else{
			alert("您选择地址没有解析到结果!");
		}
	}, "北京市");
  map.enableScrollWheelZoom(true);     //开启鼠标滚轮缩放
</script>

因为自己也是刚使用百度地图api,所以有很多东西还是不是很清楚,以后有机会再慢慢改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值