根据获取的经纬度查询用户位置的距离

在实现需求的时候难免会遇到根据经纬度要获取距离用户定位的位置的距离,今天就跟大家介绍一下怎么使用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`

大家在使用的时候直接把文字换成自己的参数就可以了

大家有什么问题可以下方评论交流

创作不易转载应注明出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值