在实现需求的时候难免会遇到根据经纬度要获取距离用户定位的位置的距离,今天就跟大家介绍一下怎么使用sql语句获取到距离用户定位位置的距离。
要获取用户位置跟店铺的距离需要一些必要参数,第一,必须要获取到用户定位的经纬度,第二必须要有你要查询距离店铺的经纬度这样就可以实现查看距离的需求了。
这边用户定位使用的是高德的定位接口
String result = null;
try {
// String resp = httpClient.open(AMAP_LOCATION_URL).get(map);
// 拼接请求高德的url
String url = "http://restapi.amap.com/v3/geocode/regeo?location=" + location + "&extensions=all&output=JSON&key=" + gaodemapkey;
// 请求高德接口
result = sendHttpGet(url);
JSONObject resultJOSN = JSONObject.parseObject(result);
System.out.println("高德接口返回原始数据:"+resultJOSN);
// result = JSON.parseObject(resp);
JSONObject regeocode = resultJOSN.getJSONObject("regeocode");
if (regeocode != null) {
JSONObject addressComponent = regeocode.getJSONObject("addressComponent");
JSONObject streetNumber = addressComponent.getJSONObject("streetNumber");
String address = regeocode.getString("formatted_address");
if (address != null) {
locationVO.setAddress(address);
}
if (streetNumber != null) {
String city = addressComponent.getString("city");
String country = addressComponent.getString("country");
String province = addressComponent.getString("province");
String area = addressComponent.getString("district");
String areacode = addressComponent.getString("adcode");
locationVO.setCity(city);
locationVO.setCountry(country);
locationVO.setProvince(province);
locationVO.setArea(area);
locationVO.setAreacode(areacode);
if (StringUtils.isBlank(city) || city.contains("[]")) {
city = addressComponent.getString("province");
}
// locationVO.setLocationName(city + addressComponent.getString("district") + address);
}
}
} catch (Exception e) {
System.out.print("locate exception"+e);
}
高德开放平台地址: https://lbs.amap.com/
也可以根据地址查询经纬度 这个我们在用户填写店铺的一些地址的时候可以根据这个接口获取他填地址的经纬度,我们把这个经纬度存到数据库。
/**
* 根据地址查询经纬度
*
* @param address
* @param
* @return
*/
public static JSONObject getLngAndLat(String address) {
JSONObject positionObj = new JSONObject();
try {
// 拼接请求高德的url
String url = "http://restapi.amap.com/v3/geocode/geo?address=" + address +"市人民政府"+ "&output=JSON&key=" + gaodemapkey;
// 请求高德接口
String result = sendHttpGet(url);
JSONObject resultJOSN = JSONObject.parseObject(result);
System.out.println("高德接口返回原始数据:");
System.out.println(resultJOSN);
JSONArray geocodesArray = resultJOSN.getJSONArray("geocodes");
if (geocodesArray.size() > 0) {
String position = geocodesArray.getJSONObject(0).getString("location");
String[] lngAndLat = position.split(",");
String longitude = lngAndLat[0];
String latitude = lngAndLat[1];
positionObj.put("longitude", longitude);
positionObj.put("latitude", latitude);
positionObj.put("country", geocodesArray.getJSONObject(0).getString("country"));
positionObj.put("province", geocodesArray.getJSONObject(0).getString("province"));
positionObj.put("city", geocodesArray.getJSONObject(0).getString("city"));
positionObj.put("district", geocodesArray.getJSONObject(0).getString("district"));
}
geocodesArray.getJSONObject(0).getString("location");
} catch (Exception e) {
e.printStackTrace();
}
return positionObj;
下面就是具体SQL语句
SELECT
id,views,videourl,market_address,market_name,shopCount,
(
6371 * acos (
cos ( radians( 前端传的纬度) ) * cos( radians(数据库的纬度 ) ) * cos( radians( 数据库的经度) - radians(
前端传的经度 ) ) + sin ( radians( 前端传的纬度 ) ) * sin( radians( 数据库的纬度) )
)
)
AS
distance
FROM `teble`
大家在使用的时候直接把文字换成自己的参数就可以了