百度 LBS 地址转换
- LBS 简介
- LBS 案例
- 注册百度账号
- 开发文档
- 创建应用
- Java 代码
- 请求参数
- 返回参数
LBS 简介
在移动互联网时代,地理定位服务(Location-Based Service, LBS)成为了许多应用程序的重要功能之一。百度作为中国最大的互联网公司之一,推出了强大的LBS解决方案,其中之一就是百度LBS地址转换。本文将深入探讨百度LBS地址转换的原理和使用方法,帮助开发者们更好地理解和应用这项功能。
一、什么是百度LBS地址转换?
百度LBS地址转换是一项提供地理位置信息转换为具体地址的服务。它可以将经纬度坐标转化为实际的地址,从而方便开发者在地图应用、导航应用和其他位置相关的应用中使用。
二、百度LBS地址转换的原理
百度LBS地址转换基于百度的地图数据和算法,通过将经纬度坐标与百度地图中的位置信息进行匹配,从而确定具体的地址。该服务支持将单个经纬度坐标转换为地址,也支持批量转换多个坐标。
三、如何使用百度LBS地址转换
-
获取百度开放平台的密钥:在使用百度LBS地址转换之前,开发者需要在百度开放平台注册并获取相应的密钥。这个密钥将用于调用百度地图API接口。
-
调用地址转换API:开发者可以使用百度提供的地址转换API,向API接口发送请求并传入经纬度坐标。API将返回相应的地址信息,包括国家、省份、城市、街道等详细信息。
-
解析返回结果:开发者需要解析API返回的结果,获取需要的地址信息。可以根据自己的需求,选择提取特定的地址信息,如城市、街道等。
四、百度LBS地址转换的应用场景
-
地图应用:百度LBS地址转换为地图应用提供了精准的地址解析功能,使得用户能够通过输入具体的地址快速定位到目标位置。
-
导航应用:百度LBS地址转换可将经纬度坐标转化为具体地址,提供给导航应用使用。这样用户就可以通过输入目的地的经纬度坐标,快速获取导航路线。
-
配送服务:在物流配送等领域,百度LBS地址转换可以将经纬度坐标转化为实际地址,从而提供准确的配送目的地信息。
LBS 案例
注册百度账号
进入百度地图开放平台,注册账号,如果之前有百度账号,可以直接使用。
开发文档
登录之后在头部导航中依次点开【开发文档】----【服务接口】----【地理编码】
开发文档内容如下,可以挨个查看了解。
在使用准备中可以看到基础步骤,参照上下文介绍和步骤依次处理。
创建应用
应用名称可以自定义,应用类型填写服务端即可。应用服务可以根据需求自行勾选。
创建应用后可以在控制台我的应用中查看,AK 也是在我的应用中查看的。
Java 代码
官网提供了多种语言案例,这里以Java为例。核心调用 requestGetAK 方法,传递百度的服务地址和请求参数即可。参数部分最为核心的是 AK,AK 是创建应用后提供的。
/**
* 默认:
*/
package com.android.javaproject;
import org.springframework.web.util.UriUtils;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.LinkedHashMap;
import java.util.Map;
public class SearchHttpAK {
public static String URL = "https://api.map.baidu.com/geocoding/v3?";
public static String AK = "您的AK";
public static void main(String[] args) throws Exception {
SearchHttpAK snCal = new SearchHttpAK();
Map params = new LinkedHashMap<String, String>();
params.put("address", "北京市海淀区上地十街10号");
params.put("output", "json");
params.put("ak", AK);
params.put("callback", "showLocation");
snCal.requestGetAK(URL, params);
}
/**
* 默认ak
* 选择了ak,使用IP白名单校验:
* 根据您选择的AK已为您生成调用代码
* 检测到您当前的ak设置了IP白名单校验
* 您的IP白名单中的IP非公网IP,请设置为公网IP,否则将请求失败
* 请在IP地址为xxxxxxx的计算发起请求,否则将请求失败
*/
public void requestGetAK(String strUrl, Map<String, String> param) throws Exception {
if (strUrl == null || strUrl.length() <= 0 || param == null || param.size() <= 0) {
return;
}
StringBuffer queryString = new StringBuffer();
queryString.append(strUrl);
for (Map.Entry<?, ?> pair : param.entrySet()) {
queryString.append(pair.getKey() + "=");
// 第一种方式使用的 jdk 自带的转码方式 第二种方式使用的 spring 的转码方法 两种均可
// queryString.append(URLEncoder.encode((String) pair.getValue(), "UTF-8").replace("+", "%20") + "&");
queryString.append(UriUtils.encode((String) pair.getValue(), "UTF-8") + "&");
}
if (queryString.length() > 0) {
queryString.deleteCharAt(queryString.length() - 1);
}
java.net.URL url = new URL(queryString.toString());
System.out.println(queryString.toString());
URLConnection httpConnection = (HttpURLConnection) url.openConnection();
httpConnection.connect();
InputStreamReader isr = new InputStreamReader(httpConnection.getInputStream());
BufferedReader reader = new BufferedReader(isr);
StringBuffer buffer = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
reader.close();
isr.close();
System.out.println("AK: " + buffer.toString());
// 获取原字符串
String string = buffer.toString();
// 去掉多余的信息
string = string.substring(string.indexOf("(") + 1, string.lastIndexOf(")"));
// JSON 转换
JSONObject jsonObject = JSONObject.parseObject(string);
Object obj = jsonObject.get("result");
JSONObject result = (JSONObject) obj;
Object o = result.get("location");
JSONObject location = (JSONObject) o;
Object lng = location.get("lng");
Object lat = location.get("lat");
}
}
注意:buffer.toString() 输出的内容和官网的测试结果会有些出入,需要对字符串进行处理,然后转换为 JSON 对象在从中获取想要的信息。
请求参数
参数名称 | 参数含义 | 示例 | 类型 | 默认值 | 必选 |
---|---|---|---|---|---|
address | 待解析的地址。最多支持84个字节。 可以输入两种样式的值,分别是: 1、标准的结构化地址信息,如北京市海淀区上地十街十号【推荐,地址结构越完整,解析精度越高】 2、支持“路与路交叉口”描述方式,如北一环路和阜阳路的交叉路口 第二种方式并不总是有返回结果,只有当地址库中存在该地址描述时才有返回。 | 北京市海淀区上地十街10号 | string | 无 | 是 |
city | 地址所在的城市名。用于指定上述地址所在的城市,当多个城市都有上述地址时,该参数起到过滤作用,但不限制坐标召回城市。 | 北京市 | string | 无 | 否 |
ret_coordtype | 可选参数,添加后返回国测局经纬度坐标或百度米制坐标 坐标系说明 | gcj02ll(国测局坐标)、bd09mc(百度墨卡托坐标) | string | bd09ll(百度经纬度坐标) | 否 |
ak | 用户申请注册的key,自v2开始参数修改为“ak”,之前版本参数为“key”申请ak | 无 | string | 是 | |
sn | 若用户所用ak的校验方式为sn校验时该参数必须sn生成 | 无 | string | 否 | |
output | 输出格式为json或者xml | json或xml | string | xml | 否 |
callback | 将json格式的返回值通过callback函数返回以实现jsonp功能 | callback=showLocation(JavaScript函数名) | string | 无 | 否 |
extension_analys_level | 是否触发解析到最小地址结构功能 | extension_analys_level=1或true时,触发analys_level;字段返回参数; extension_analys_level=0或false时; analys_level字段不返回参数; | string | 0 | 否 |
返回参数
返回参数 | 类型 | 备注 | ||
---|---|---|---|---|
status | int | 本次API访问状态,如果成功返回0,如果失败返回其他数字。(见服务状态码) | ||
result | object | 返回的结果 | ||
location | object | 经纬度坐标 | ||
lng | float | 经度值 | ||
lat | float | 纬度值 | ||
precise | int | 位置的附加信息,是否精确查找。1为精确查找,即准确打点;0为不精确,即模糊打点。 | ||
confidence | int | 描述打点绝对精度(即坐标点的误差范围)。 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; | ||
comprehension | int | 描述地址理解程度。分值范围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%; //解析误差:地理编码服务解析地址得到的坐标位置,与地址对应的真实位置间的距离。 | ||
level | string | 可以打点到地址文本中的真实地址结构, 例如问题地址:北京市海淀区北京路百度大厦,level:“道路” 能精确理解的地址类型,包含:UNKNOWN、国家、省、城市、区县、乡镇、村庄、道路、地产小区、商务大厦、政府机构、交叉路口、商圈、生活服务、休闲娱乐、餐饮、宾馆、购物、金融、教育、医疗 、工业园区 、旅游景点 、汽车服务、火车站、长途汽车站、桥 、停车场/停车区、港口/码头、收费区/收费站、飞机场 、机场 、收费处/收费站 、加油站、绿地、门址 | ||
analys_level | string | 可以解析地址文本中的最小地址结构, 例如问题地址:北京市海淀区北京路百度大厦,analys_level:“POI”, 能精确理解的地址类型包含: 省 市 区县 乡镇 道路 门址 POI 。 |