https://www.cnblogs.com/0201zcr/p/4673924.html
工具类:
LLUtils
package com.air.space.service.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
public class LLUtils {
/**
* 返回输入地址的经纬度坐标 key lng(经度),lat(纬度)
*/
public static Map<String, String> getGeocoderLatitude(String address) {
BufferedReader in = null;
try {
Map<String,String> paramsMap = new LinkedHashMap<String, String>();
paramsMap.put("address", address);
paramsMap.put("output", "json");
paramsMap.put("ak", "tcFOTGgbPXo9NeFYTzSTpytXiOFwaKZI");
String quest = GetLatitude.toQueryString(paramsMap);
URL tirc = new URL(
"http://api.map.baidu.com/geocoder/v2/?" + quest + "&sn=" + GetLatitude.result(paramsMap));
in = new BufferedReader(new InputStreamReader(tirc.openStream(), "UTF-8"));
String res;
StringBuilder sb = new StringBuilder("");
while ((res = in.readLine()) != null) {
sb.append(res.trim());
}
String str = sb.toString();
Map<String, String> map = null;
if (StringUtils.isNotEmpty(str)) {
int lngStart = str.indexOf("lng\":");
int lngEnd = str.indexOf(",\"lat");
int latEnd = str.indexOf("},\"precise");
if (lngStart > 0 && lngEnd > 0 && latEnd > 0) {
String lng = str.substring(lngStart + 5, lngEnd);
String lat = str.substring(lngEnd + 7, latEnd);
map = new HashMap<String, String>();
map.put("lng", lng);
map.put("lat", lat);
return map;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
GetDistanceUtils
package com.air.space.service.util;
import java.math.BigDecimal;
import java.util.Map;
public class GetDistanceUtils{
/**
* Calculate latitude and longitude by an address,
* Calculate the distance between two positions by latitude and longitude
* @param place
* @return
*/
public static Double getDistance(String place1,String place2){
Map<String,String> geocoderLatitude1 = LLUtils.getGeocoderLatitude(place1);
double lat1 = Double.parseDouble(geocoderLatitude1.get("lat"));
double lng1 = Double.parseDouble(geocoderLatitude1.get("lng"));
Map<String,String> geocoderLatitude2 = LLUtils.getGeocoderLatitude(place2);
double lat2 = Double.parseDouble(geocoderLatitude2.get("lat"));
double lng2 = Double.parseDouble(geocoderLatitude2.get("lng"));
double s1 = LocationUtils.getDistance(lat1, lng1, lat2, lng2);
double distance = new BigDecimal(s1).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
return distance;
}
}
根据两个地方的地址,可以求出两地的距离:
例如 数据库中村的地方是: 金台夕照财富中心三层
你所在的位置: 国贸
根据调用GetDistanceUtils 可求得两者距离
应用:
传入的参数是:
访问地址:http://118.89.225.162:8114/air-api/space/querySpaceNoQuery
接口说明:无条件无分页业主空间列表查询
输入参数:
变量名称 | 变量命名 | 变量类型 | 是否必填 | 示例 | 说明 |
类型 | type | Integer | 是 |
| type=2 App 安卓 |
当前位置 | place | String | 否 |
|
|
@RequestMapping(value = "/querySpaceNoQuery",method = RequestMethod.POST,
produces = MediaType.APPLICATION_JSON_VALUE)
public List<Space> querySpaceNoQuery(@RequestBody SpaceQuery spaceQuery){
return this.spaceService.querySpaceNoQuery(spaceQuery);
}
public List<Space> querySpaceNoQuery(SpaceQuery spaceQuery) {
List<Space> list = this.spaceRepository.findAll();
Integer type = spaceQuery.getType();
String place = spaceQuery.getPlace();
//若type==2,app和pad请求,包含距离
if(2==type){
for (Space space : list) {
Double distance = (StringUtils.isBlank(place))?0.00:GetDistanceUtils.getDistance(place, space.getAddress());
space.setDistance(distance);
}
}
//进行排序
return this.spaceRepository.findSpaceListForSort();
}
@Query(value="SELECT * FROM table_space s where s.auth_status !='1' ORDER BY distance ASC,name ASC",nativeQuery=true)
List<Space> findSpaceListForSort();