自己的项目使用到了百度地图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 | 可选参数,添加后返回国测局经纬度坐标或百度米制坐标 坐标系说明 | string | gcj02ll(国测局坐标)、bd09mc(百度墨卡托坐标) | bd09ll(百度经纬度坐标) | 否 |
ak | 用户申请注册的key,自v2开始参数修改为“ak”,之前版本参数为“key” 申请ak | string | 无 | 是 | |
sn | 若用户所用ak的校验方式为sn校验时该参数必须 sn生成 | string | 无 | 否 | |
output | 输出格式为json或者xml | string | json或xml | xml | 否 |
callback | 将json格式的返回值通过callback函数返回以实现jsonp功能 | string | callback=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 |
服务状态码
返回码 | 英文描述 | 定义 | 常见原因 |
---|---|---|---|
0 | ok | 正常 | 服务请求正常召回 |
1 | 服务器内部错误 | ||
2 | Parameter Invalid | 请求参数非法 | 必要参数拼写错误或漏传(如query和tag请求中均未传入) |
3 | Verify Failure | 权限校验失败 | |
4 | Quota Failure | 配额校验失败 | 服务当日调用次数已超限,请前往API控制台提升(请优先进行开发者认证) |
5 | AK Failure | ak不存在或者非法 | 未传入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,所以有很多东西还是不是很清楚,以后有机会再慢慢改。