美文网首页
java Mysql 根据经纬度实时计算地址位置距离

java Mysql 根据经纬度实时计算地址位置距离

作者: IT祖师爷 | 来源:发表于2022-05-10 10:54 被阅读0次

     数据库地址表设计

    通用的区域街道地址表tz_sys_area

    字段名称类型备注

    area_idbigint区域 ID

    area_namevarchar(32)区域名称

    parent_idbigint所属父区域 ID

    levelint层级

    typechar区域类型 0 国家 1 省份直辖市 2 地市 3 区县

    area_namevarchar(32)区域名称

    parent_idbigint所属父区域 ID

    levelint层级

    后台也可以做修改

    四级区域地址数据来源我在网上找的 json 文件然后按照格式倒入到的数据库,需要的可以关注我的公众号猿小叔

    门店地址表tz_address

    需求实现

    这里计算距离就需要用到经纬度

    需要使用高德地图 api 接口地理/逆地理编码获取地址经纬度并保存

    /**

        * 地理/逆地理编码 (java项目大全 fhadmin.cn)

        * https://lbs.amap.com/api/webservice/guide/api/georegeo

        *

        * @return

        */

        public String addressToLongitude(String address) {

            String longitude = "";

            String urlString = "?key={key}&address={address}&output=JSON";

            String response = restTemplate.getForObject(ApiAction.API_GEOREGO_TEST + urlString, String.class, apiKey, address);

            if (StrUtil.isEmpty(response)) {

                return null;

            }

            JSONObject jsonObject = JSON.parseObject(response);

            String code = jsonObject.getString("infocode");

            if (code.equals("10000")) {

                JSONArray jsonArray = jsonObject.getJSONArray("geocodes");

                JSONObject jsonObject1 = (JSONObject) jsonArray.get(0);

                longitude = jsonObject1.get("location").toString();

            } else {

                return null;

            }

            return longitude;

        }

    private Address setlngAndLat(Address address) {

            String addr = address.getProvince() + address.getCity() + address.getArea() + address.getAddr();

            String longitude = gaoDeService.addressToLongitude(addr);

            if (StrUtil.isBlank(longitude)) {

                throw new BusinessException("地址经纬度识别识别");

            }

            String lat = longitude.split(",")[1];

            String lng = longitude.split(",")[0];

            address.setLat(lat);

            address.setLng(lng);

            return address;

        }

    MySQL 根据经纬度计算地址距离当前位置

    SELECT

                  (

                          6371 * acos(

                                      cos(radians(#{lat}))

                                      * cos(radians(lat))

                                      * cos(radians(lng) - radians(#{lng}))

                                  + sin(radians(#{lat}))

                                          * sin(radians(lat))

                          )

                      ) AS distance

            FROM tz_user_addr where addr_id=#{storeAddrId}

    相关文章

      网友评论

          本文标题:java Mysql 根据经纬度实时计算地址位置距离

          本文链接:https://www.haomeiwen.com/subject/epllurtx.html