其实本质上还是利用高德地图API进行经纬度和地址的互转。
/**
* 根据经纬度转地址
* @param points
* @return
* @throws IOException
*/
public static String pointsToLocationsAll(String points) {
//将GPS坐标转化为高德地图坐标的URL后再去请求位置信息
try {
points = URLEncoder.encode(points,"UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e.getMessage());
}
String convertUrl =
"https://restapi.amap.com/v3/assistant/coordinate/convert?locations="+points+"&coordsys=gps&key="+amapKey;
//GPS坐标转为高德地图坐标
String s = HttpUtil.get(convertUrl);
JSONObject jsonObject = JSON.parseObject(s);
String status = (String) jsonObject.get("status");
if(Objects.equals(status,"0")){
throw new RuntimeException("远程调用经纬度转化出错");
}
String locations = (String) jsonObject.get("locations");
String formattedAmapPoints = null;
try {
formattedAmapPoints = URLEncoder.encode(locations.replaceAll(";", "|"), "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e.getMessage());
}
String locationUrl = "https://restapi.amap.com/v3/geocode/regeo?output=json&location="+formattedAmapPoints+"&key="+amapKey+"&radius=1000&batch=true";
String s1 = HttpUtil.get(locationUrl);
//获取转地址后的结果
JSONObject parseObject = JSON.parseObject(s1);
String status1 = (String) parseObject.get("status");
if(Objects.equals(status1,"0")){
throw new RuntimeException("根据经纬度获取具体地址出错");
}
JSONArray regeocodes = parseObject.getJSONArray("regeocodes");
String formattedAddress = "";
for (Object regeocode : regeocodes) {
JSONObject object = (JSONObject) regeocode;
formattedAddress = (String)object.get("formatted_address");
}
log.info("经纬度【{}】转化为具体地点【{}】",points,formattedAddress);
return formattedAddress;
}
/**
* 地址转经纬度
* @param position
* @return
* @throws IOException
*/
public static String locationToPoints(String position) {
if(position==null || position.equals("")){
throw new RuntimeException("位置地名不能为空");
}
String convertUrl = "https://restapi.amap.com/v3/geocode/geo?address="+position+"&output=JSON&key="+amapKey;
String s = HttpUtil.get(convertUrl);
JSONObject jsonObject = JSON.parseObject(s);
String status = (String) jsonObject.get("status");
if(Objects.equals(status,"0")){
throw new RuntimeException("根据地名获取经纬度出错");
}
JSONArray geocodes = jsonObject.getJSONArray("geocodes");
String points = "";
for (Object regeocode : geocodes) {
JSONObject object = (JSONObject) regeocode;
points = (String)object.get("location");
}
return points;
}
amapKey
为高德地图API申请的key.