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

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

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

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

创作不易转载应注明出处

ThinkPHP是一个基于PHP的开源Web开发框架,用于快速搭建企业级应用。如果你想要根据用户经纬度获取附近的人或服务,这通常涉及到地理位置服务(Geolocation)和数据库查询。 首先,你需要确保服务器支持用户的地理位置信息,这通常需要前端页面通过JavaScript获取用户经纬度数据,比如使用浏览器的Geolocation API。然后将这些经纬度发送到后端服务器。 在ThinkPHP中,你可以按照以下步骤操作: 1. **获取用户经纬度**:前端发送请求到后端,包含用户经纬度信息,例如`latitude`和`longitude`。 ```javascript // JavaScript 示例 fetch('/api/users/nearby', { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ latitude, longitude }), }) ``` 2. **处理后端**:在ThinkPHP控制器(Controller)里接收到这个请求,可以使用PHP的地理编码库(如GeoIP、GDAL等)或者第三方API(如Google Maps API)来计算距离。 ```php // PHP 示例 use Overtrue\Geohash\Geohash; class UserController extends Controller { public function nearbyUsers(Request $request) { $latitude = $request->input('latitude'); $longitude = $request->input('longitude'); // 使用Geohash计算半径内的用户 $radius = 5; // 单位通常是公里或其他自定义单位 $geohash = Geohash::fromLatLong($latitude, $longitude)->buffer($radius); $users = User::where("geohash", 'BETWEEN', [$geohash, $geohash . '#'])->get(); return $users; } } ``` 这里假设你有一个名为`User`的模型,其中存储了用户经纬度和其他相关信息,并且使用了Geohash库对地理位置进行了哈希化以便于查询
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值