首先:
- 通过高德开放者平台http://lbs.amap.com/,注册一个开发者账号,获得一个KEY(调用接口时需要使用该KEY)
注册完成后如下图,在我的应用里面创建,key的名称自己取,key值自动生成 - 阅读高德web 服务API接口的文档高德API接口文档概述 距离测量在 高德API路径规划里
https://lbs.amap.com/api/webservice/guide/api/direction
然后: 贴代码吧
这里有直接通过经纬度获取距离的
也有输入一个地址获取距离的
请求参数里面有一个type(API接口里有介绍)
0:直线距离
1:驾车导航距离(仅支持国内坐标)。
必须指出,当为1时会考虑路况,故在不同时间请求返回结果可能不同。
此策略和驾车路径规划接口的 strategy=4策略基本一致,策略为“ 躲避拥堵的路线,但是可能会存在绕路的情况,耗时可能较长 ”
若需要实现高德地图客户端效果,可以考虑使用驾车路径规划接口
3:步行规划距离(仅支持5km之间的距离)
这里采用的是type=1,即驾车导航距离
import com.google.gson.Gson;
import net.sf.json.JSONArray;
import net.sf.json.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.util.List;
import java.util.Map;
public class NewGetDistance {
private static final String key = "你申请的key";
public static void main(String[] args){
//111111根据经纬度查询距离的
//注意:高德最多取小数点后六位 //格式: 经度,纬度
String origin = "108.960747"+","+"34.266451";//陕西省西安市新城区
String destination = "117.150738"+","+"39.138203";//天津市南开区
String distance = distance(origin, destination);
System.out.println(distance);
//222222根据地址查询距离的
String start = "陕西省西安市新城区";
String end = "天津市南开区";
String startLonLat = getLonLat(start);//获取到开始地址的经纬度
String endLonLat = getLonLat(end);//获取到达地址的经纬度
String distan = distance(startLonLat,endLonLat);
System.out.println(distan);
}
/**
* 高德地图WebAPI : 行驶距离测量
*/
public static String distance(String origins,String destination) {
int type = 1;//type=1,即驾车导航距离
String url = "http://restapi.amap.com/v3/distance?"
+ "origins="+origins
+"&destination="+destination
+"&type="+type
+"&key="+ key;
//这里用的Gson,也可以用下面的JSON,都试了一下
Gson gson = new Gson();
Map map = new Gson().fromJson(getLoadJson(url),Map.class);
List list=(List)map.get("results");
Map<String,String> map1 = (Map) list.get(0);
String distance = map1.get("distance");
System.out.println(distance);
// JSONObject jsonobject = JSONObject.fromObject(loadJson(url));
// System.out.println(jsonobject.toString());
// JSONArray resultsArray = jsonobject.getJSONArray("results");
// JSONObject distanceObject = resultsArray.getJSONObject(0);
// String resdistance = distanceObject.getString("distance");
return distance;
}
/**
* Java http 请求 获取结果
*/
public static String getLoadJson (String url) {
StringBuilder json = new StringBuilder();
try {
//下面那条URL请求返回结果无中文,可不转换编码格式
URL urlObject = new URL(url);
URLConnection uc = urlObject.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
String inputLine = null;
while ( (inputLine = in.readLine()) != null) {
json.append(inputLine);
}
in.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return json.toString();
}
/**
* 根据给的地址获得经纬度信息
* @param address
* @return
*/
private static String getLonLat(String address){
//返回输入地址address的经纬度信息, 格式是 经度,纬度
String queryUrl = "http://restapi.amap.com/v3/geocode/geo?key="+key+"&address="+address;
String queryResult = getLoadJson(queryUrl); //高德接口返回的是JSON格式的字符串
//这里也可以用Gson接
//JSONObject是Map,可以通过key访问值
//JSONArray是List,可以通过索引访问值
JSONObject jo = new JSONObject().fromObject(queryResult);
JSONArray ja = jo.getJSONArray("geocodes");
return new JSONObject().fromObject(ja.getString(0)).get("location").toString();
}
}
注意:这里的
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
这两个包的依赖,注意版本号
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
Gson还是很好用的,Gson对象有toJson和fromJson两个方法,toJson是对象转字符串,fromJson是字符串转对象。附上Gson的使用
记录自己写的过程