前言
要调用百度地图API,步骤操作如下
- 注册并创建一个API密钥。您可以在百度地图API控制台上创建您的密钥。
- 选择要使用的API服务。百度地图API提供了多种服务,包括地图展示、路线规划、地点搜索、实时交通等。您可以在百度地图API控制台上查看所有可用的服务。
- 在调用API时,将API密钥添加到请求中。
官网:百度地图开放平台 | 百度地图API SDK
1、了解地图开放平台
可以看到开发文档支持多种类型,前端到后台等等。百度地图API提供了多种服务,包括地图展示、路线规划、地点搜索、鹰眼轨迹,定位,实时交通等。
2、创建百度地图AK
2.1、控制台→应用管理→我的应用→创建应用
2.2、创建应用名字
为什么高级是灰色选不了,是因为高级服务是需要付费的。
2.4、IP白名单设置
2.5、查看AK
3、JAVA调用百度地图
3.1、地点检索
3.1.1、调用百度Api
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.text.DecimalFormat;
import java.util.Map;public class BaiduApiController {public static void main(String[] args) {String ak = "自己AK";String address = "天津之眼摩天轮";
// String httpUrl = "http://api.map.baidu.com/geocoding/v3/?address="+address+ ak;String httpUrl = "http://api.map.baidu.com/geocoding/v3/?address="+address+"&output=json&ak=" + ak;StringBuilder json = new StringBuilder();try {URL url = new URL(httpUrl);URLConnection urlConnection = url.openConnection();BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));String inputLine = null;while ((inputLine = in.readLine()) != null) {json.append(inputLine);}in.close();} catch (MalformedURLException e) {} catch (IOException e) {}System.out.println(json.toString());String data = json.toString();if (data != null && !"".equals(data)) {Map map = JSON.parseObject(data, Map.class);if ("0".equals(map.getOrDefault("status", "500").toString())) {Map childMap = (Map) map.get("result");Map posMap = (Map) childMap.get("location");double lng = Double.parseDouble(posMap.getOrDefault("lng", "0").toString()); // 经度double lat = Double.parseDouble(posMap.getOrDefault("lat", "0").toString()); // 纬度DecimalFormat df = new DecimalFormat("#.######");String lngStr = df.format(lng);String latStr = df.format(lat);String result = lngStr + "," + latStr;System.out.println("坐标"+result);}}}
}
3.1.2、查看结果
3.1.3、验证
3.2、计算两点之间距离
3.2.1、调用百度Api
mport com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.text.DecimalFormat;
import java.util.Map;/*** 百度地图操作工具类*/
public class BaiduApiUtils {public static void main(String[] args) {String origin = getCoordinate("天津之眼摩天轮");String destination = getCoordinate("北京市百度大厦");Double distance = getDistance(origin, destination);System.out.println("订单距离:" + distance + "米");Integer time = getTime(origin, destination);System.out.println("线路耗时" + time + "秒");}private static String AK = "自己AK";/*** 调用百度地图地理编码服务接口,根据地址获取坐标(经度、纬度)** @param address* @return*/public static String getCoordinate(String address) {String httpUrl = "http://api.map.baidu.com/geocoding/v3/?address=" + address + "&output=json&ak=" + AK;String json = loadJSON(httpUrl);Map map = JSON.parseObject(json, Map.class);String status = map.get("status").toString();if (status.equals("0")) {//返回结果成功,能够正常解析地址信息Map result = (Map) map.get("result");Map location = (Map) result.get("location");String lng = location.get("lng").toString();String lat = location.get("lat").toString();DecimalFormat df = new DecimalFormat("#.######");String lngStr = df.format(Double.parseDouble(lng));String latStr = df.format(Double.parseDouble(lat));String r = latStr + "," + lngStr;return r;}return null;}/*** 调用百度地图驾车路线规划服务接口,根据寄件人地址和收件人地址坐标计算订单距离** @param origin* @param destination* @return*/public static Double getDistance(String origin, String destination) {String httpUrl = "http://api.map.baidu.com/directionlite/v1/driving?origin="+ origin + "&destination="+ destination + "&ak=" + AK;String json = loadJSON(httpUrl);Map map = JSON.parseObject(json, Map.class);if ("0".equals(map.getOrDefault("status", "500").toString())) {Map childMap = (Map) map.get("result");JSONArray jsonArray = (JSONArray) childMap.get("routes");JSONObject jsonObject = (JSONObject) jsonArray.get(0);double distance = Double.parseDouble(jsonObject.get("distance") == null ? "0" : jsonObject.get("distance").toString());return distance;}return null;}/*** 调用百度地图驾车路线规划服务接口,根据寄件人地址和收件人地址坐标计算订单距离** @param origin* @param destination* @return*/public static Integer getTime(String origin, String destination) {String httpUrl = "http://api.map.baidu.com/directionlite/v1/driving?origin="+ origin + "&destination="+ destination + "&ak=" + AK;String json = loadJSON(httpUrl);Map map = JSON.parseObject(json, Map.class);if ("0".equals(map.getOrDefault("status", "500").toString())) {Map childMap = (Map) map.get("result");JSONArray jsonArray = (JSONArray) childMap.get("routes");JSONObject jsonObject = (JSONObject) jsonArray.get(0);int time = Integer.parseInt(jsonObject.get("duration") == null ? "0" : jsonObject.get("duration").toString());return time;}return null;}/*** 调用服务接口,返回百度地图服务端的结果** @param httpUrl* @return*/public static String loadJSON(String httpUrl) {StringBuilder json = new StringBuilder();try {URL url = new URL(httpUrl);URLConnection urlConnection = url.openConnection();BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));String inputLine = null;while ((inputLine = in.readLine()) != null) {json.append(inputLine);}in.close();} catch (MalformedURLException e) {} catch (IOException e) {}System.out.println(json.toString());return json.toString();}
}
3.2.2、查看结果
3.3、地点输入提示
3.3.1、调用百度Api
/*** 选择了ak或使用IP白名单校验:*/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/place/v2/suggestion?";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("query", "天安门");params.put("region", "北京");params.put("city_limit", "true");params.put("output", "json");params.put("ak", AK);snCal.requestGetAK(URL, params);}/*** 默认ak* 选择了ak,使用IP白名单校验:* 根据您选择的AK以为您生成调用代码* 检测到您当前的ak设置了IP白名单校验* 您的IP白名单中的IP非公网IP,请设置为公网IP,否则将请求失败* 请在IP地址为0.0.0.0/0 外网IP的计算发起请求,否则将请求失败*/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() + "=");queryString.append(URLEncoder.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());}
}
3.3.2、查看结果
4、接口说明
4.1、接口文档说明
- 开发文档有很多案例类型,可根据项目业务需求进行选择性调用。
4.2、请求参数
- 有些参数是必填就比如开发者密钥AK ,这个参数没有都请求不到数据。
字段名称 | 字段含义 | 字段类型 | 必填 | 备注 |
---|---|---|---|---|
ak | 开发者密钥,AK申请 | string | 是 | |
origin | 起点 | double,double | 是 | 起点经纬度,格式为:纬度,经度;小数点后不超过6位,40.056878,116.30815 |
destination | 终点 | double,double | 是 | 终点经纬度,格式为:纬度,经度;小数点后不超过6位,40.056878,116.30815 |
origin_uid | 起点uid,POI 的 uid(在已知起点POI 的 uid 情况下,请尽量填写uid,将提升路线规划的准确性) | string | 否 | |
destination_uid | 终点uid,POI 的 uid(在已知终点POI 的 uid 情况下,请尽量填写uid,将提升路线规划的准确性) | string | 否 | |
riding_type | 骑行类型 | string | 否 | 默认0 |
coord_type | 输入坐标类型 | string | 否 | 默认bd09ll |
ret_coordtype | 输出坐标类型 | string | 否 | 返回值的坐标类型,默认为百度经纬度坐标:bd09ll |
sn | 用户的权限签名,当AK设置为SN校验时,该参数必填SN计算方法 | string | 否 | |
timestamp | 时间戳,与SN配合使用 | string | SN存在时必填 | |
steps_info | 是否下发step详情 | int | 否 |
4.3、返回参数
- 返回的状态 ,错误码等等都写的非常详细。
字段名称 | 字段含义 | 备注 | |||
---|---|---|---|---|---|
status | 状态码 | 0:成功 1:服务内部错误 2:参数无效 7:无返回结果 | |||
message | 状态码对应的信息 | ||||
result | 返回的结果 | ||||
origin | |||||
lng | 起点经度 | ||||
lat | 起点纬度 | ||||
destination | |||||
lng | 终点经度 | ||||
lat | 终点纬度 | ||||
routes | 返回的方案集 | ||||
distance | 方案距离,单位:米 | ||||
duration | 线路耗时,单位:秒 | ||||
steps | 路线分段 | ||||
direction | 进入道路的角度 | 枚举值,返回值在0-11之间的一个值,共12个枚举值,以30度递进,即每个值代表角度范围为30度;其中返回"0"代表345度到15度,以此类推,返回"11"代表315度到345度";分别代表的含义是:0-[345°-15°];1-[15°-45°];2-[45°-75°];3-[75°-105°];4-[105°-135°];5-[135°-165°];6-[165°-195°];7-[195°-225°];8-[225°-255°];9-[255°-285°];10-[285°-315°];11-[315°-345°] | |||
turn_type | 行驶转向方向 | 如“直行”、“左前方转弯” | |||
distance | 路段距离 | 单位:米 | |||
duration | 路段耗时 | 单位:秒 | |||
name | 道路名称 | 如:“信息路” 若道路未明或百度地图未采集到该道路名称,则返回“无名路“ | |||
instruction | 路段描述 | ||||
start_location | |||||
lng | 分段起点经度 | ||||
lat | 分段起点纬度 | ||||
end_location | |||||
lng | 分段终点经度 | ||||
lat | 分段终点纬度 | ||||
path | 分段坐标 |
4.4、示例代码(支持多种语言)
总之,根据自己的业务需求去选择地图的种类,以上只是介绍服务端, 感兴趣的可以去试一下。