From 6aa9a7213348fac5e5299a60f04689f11113aab4 Mon Sep 17 00:00:00 2001 From: "LIONCITYS\\lioncity" <18026623439@163.com> Date: Thu, 10 Sep 2020 12:12:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=8E=B7=E5=8F=96=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E6=8E=A5=E5=8F=A3,=E8=A1=A5=E5=85=85=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/co/yixiang/utils/LocationUtils.java | 45 ------- .../utils/location/GetTencentLocationVO.java | 113 ++++++++++++++++++ .../yixiang/utils/location/LocationUtils.java | 66 ++++++++++ .../impl/YxSystemStoreServiceImpl.java | 2 +- .../shop/rest/SystemStoreController.java | 12 +- 5 files changed, 184 insertions(+), 54 deletions(-) delete mode 100644 yshop-common/src/main/java/co/yixiang/utils/LocationUtils.java create mode 100644 yshop-common/src/main/java/co/yixiang/utils/location/GetTencentLocationVO.java create mode 100644 yshop-common/src/main/java/co/yixiang/utils/location/LocationUtils.java diff --git a/yshop-common/src/main/java/co/yixiang/utils/LocationUtils.java b/yshop-common/src/main/java/co/yixiang/utils/LocationUtils.java deleted file mode 100644 index c91c70b2..00000000 --- a/yshop-common/src/main/java/co/yixiang/utils/LocationUtils.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (C) 2018-2020 - * All rights reserved, Designed By www.yixiang.co - - */ -package co.yixiang.utils; - -import cn.hutool.core.util.NumberUtil; - -/** - * @ClassName LocationUtils - * @Author hupeng <610796224@qq.com> - * @Date 2020/3/24 - **/ -public class LocationUtils { - private static double EARTH_RADIUS = 6378.137; - - private static double rad(double d) { - return d * Math.PI / 180.0; - } - - /** - * 通过经纬度获取距离(单位:千米) - * @param lat1 - * @param lng1 - * @param lat2 - * @param lng2 - * @return - */ - public static double getDistance(double lat1, double lng1, double lat2, - double lng2) { - double radLat1 = rad(lat1); - double radLat2 = rad(lat2); - double a = radLat1 - radLat2; - double b = rad(lng1) - rad(lng2); - double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) - + Math.cos(radLat1) * Math.cos(radLat2) - * Math.pow(Math.sin(b / 2), 2))); - s = s * EARTH_RADIUS; - s = Math.round(s * 10000d) / 10000d; - //s = s*1000; - return NumberUtil.round(s,2).doubleValue(); - //return s; - } -} diff --git a/yshop-common/src/main/java/co/yixiang/utils/location/GetTencentLocationVO.java b/yshop-common/src/main/java/co/yixiang/utils/location/GetTencentLocationVO.java new file mode 100644 index 00000000..da49de54 --- /dev/null +++ b/yshop-common/src/main/java/co/yixiang/utils/location/GetTencentLocationVO.java @@ -0,0 +1,113 @@ +package co.yixiang.utils.location; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author :LionCity + * @date :Created in 2020-09-10 11:39 + * @description: + * @modified By: + * @version: + */ +@Data +@ApiModel(value="腾讯地图返回对象") +public class GetTencentLocationVO implements Serializable { + + /** + * result : {"level":2,"similarity":0.8,"ad_info":{"adcode":"441302"},"reliability":1,"location":{"lng":114.38257,"lat":23.08464},"deviation":1000,"title":"惠城区","address_components":{"province":"广东省","city":"惠州市","street":"","district":"惠城区","street_number":""}} + * message : query ok + * status : 0 + */ + @ApiModelProperty(value = "地址解析结果") + private ResultBean result; + @ApiModelProperty(value = "状态说明") + private String message; + @ApiModelProperty(value = "状态码,0为正常") + private int status; + + @Data + @ApiModel(value="地址解析结果") + public static class ResultBean { + /** + * level : 2 + * similarity : 0.8 + * ad_info : {"adcode":"441302"} + * reliability : 1 + * location : {"lng":114.38257,"lat":23.08464} + * deviation : 1000 + * title : 惠城区 + * address_components : {"province":"广东省","city":"惠州市","street":"","district":"惠城区","street_number":""} + */ + + @ApiModelProperty(value = "解析到的坐标") + private LocationBean location; + @ApiModelProperty(value = "解析精度级别,分为11个级别,一般>=9即可采用(定位到点,精度较高) 也可根据实际业务需求自行调整") + private int level; + @ApiModelProperty(value = "即将下线,由reliability代替") + private double similarity; + + @ApiModelProperty(value = "行政区划信息") + private AdInfoBean ad_info; + @ApiModelProperty(value = "可信度参考") + private int reliability; + @ApiModelProperty(value = "即将下线,由level代替") + private int deviation; + @ApiModelProperty(value = "区信息") + private String title; + @ApiModelProperty(value = "行政区划信息") + private AddressComponentsBean address_components; + + + @Data + @ApiModel(value="行政区划信息") + public static class AdInfoBean { + /** + * adcode : 441302 + */ + @ApiModelProperty(value = "行政区划代码") + private String adcode; + + } + @Data + @ApiModel(value="解析到的坐标") + public static class LocationBean { + /** + * lng : 114.38257 + * lat : 23.08464 + */ + + @ApiModelProperty(value = "经度") + private double lng; + + @ApiModelProperty(value = "纬度") + private double lat; + + + } + @Data + @ApiModel(value="解析后的地址部件") + public static class AddressComponentsBean { + /** + * province : 广东省 + * city : 惠州市 + * street : + * district : 惠城区 + * street_number : + */ + @ApiModelProperty(value = "省") + private String province; + @ApiModelProperty(value = "市") + private String city; + @ApiModelProperty(value = "街道,可能为空字串") + private String street; + @ApiModelProperty(value = "区,可能为空字串") + private String district; + @ApiModelProperty(value = "门牌,可能为空字串") + private String street_number; + } + } +} diff --git a/yshop-common/src/main/java/co/yixiang/utils/location/LocationUtils.java b/yshop-common/src/main/java/co/yixiang/utils/location/LocationUtils.java new file mode 100644 index 00000000..778eac91 --- /dev/null +++ b/yshop-common/src/main/java/co/yixiang/utils/location/LocationUtils.java @@ -0,0 +1,66 @@ +package co.yixiang.utils.location; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import co.yixiang.constant.ShopKeyUtils; +import co.yixiang.exception.BadRequestException; +import co.yixiang.utils.RedisUtil; +import com.alibaba.fastjson.JSONObject; + +/** + * 具体查看 https://lbs.qq.com/service/webService/webServiceGuide/webServiceGeocoder + * @author :LionCity + * @date :Created in 2020-09-10 11:46 + * @description: + * @modified By: + * @version: + */ +public class LocationUtils { + + private static double EARTH_RADIUS = 6378.137; + + private static double rad(double d) { + return d * Math.PI / 180.0; + } + + /** + * 腾讯地图地址解析 + */ + private static final String QQ_MAP_URL = "https://apis.map.qq.com/ws/geocoder/v1/"; + + + /** + * 通过经纬度获取距离(单位:千米) + * + * @param lat1 + * @param lng1 + * @param lat2 + * @param lng2 + * @return + */ + public static double getDistance(double lat1, double lng1, double lat2, + double lng2) { + double radLat1 = rad(lat1); + double radLat2 = rad(lat2); + double a = radLat1 - radLat2; + double b = rad(lng1) - rad(lng2); + double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + + Math.cos(radLat1) * Math.cos(radLat2) + * Math.pow(Math.sin(b / 2), 2))); + s = s * EARTH_RADIUS; + s = Math.round(s * 10000d) / 10000d; + //s = s*1000; + return NumberUtil.round(s, 2).doubleValue(); + //return s; + } + + + public static GetTencentLocationVO getLocation(String addr) { + String key = RedisUtil.get(ShopKeyUtils.getTengXunMapKey()); + if (StrUtil.isBlank(key)) throw new BadRequestException("请先配置腾讯地图key"); + String url = StrUtil.format("?address={}&key={}", addr, key); + String json = HttpUtil.get(QQ_MAP_URL + url); + return JSONObject.parseObject(json, GetTencentLocationVO.class); + } +} diff --git a/yshop-mall/src/main/java/co/yixiang/modules/shop/service/impl/YxSystemStoreServiceImpl.java b/yshop-mall/src/main/java/co/yixiang/modules/shop/service/impl/YxSystemStoreServiceImpl.java index 06e5344d..8e958aa3 100644 --- a/yshop-mall/src/main/java/co/yixiang/modules/shop/service/impl/YxSystemStoreServiceImpl.java +++ b/yshop-mall/src/main/java/co/yixiang/modules/shop/service/impl/YxSystemStoreServiceImpl.java @@ -21,9 +21,9 @@ import co.yixiang.modules.shop.service.dto.YxSystemStoreDto; import co.yixiang.modules.shop.service.dto.YxSystemStoreQueryCriteria; import co.yixiang.modules.shop.service.mapper.SystemStoreMapper; import co.yixiang.utils.FileUtil; -import co.yixiang.utils.LocationUtils; import co.yixiang.utils.RedisUtil; import co.yixiang.utils.ShopKeyUtils; +import co.yixiang.utils.location.LocationUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.pagehelper.PageInfo; diff --git a/yshop-shop/src/main/java/co/yixiang/modules/shop/rest/SystemStoreController.java b/yshop-shop/src/main/java/co/yixiang/modules/shop/rest/SystemStoreController.java index a5ec0d2f..d46e69d8 100644 --- a/yshop-shop/src/main/java/co/yixiang/modules/shop/rest/SystemStoreController.java +++ b/yshop-shop/src/main/java/co/yixiang/modules/shop/rest/SystemStoreController.java @@ -19,6 +19,8 @@ import co.yixiang.modules.shop.service.dto.YxSystemStoreDto; import co.yixiang.modules.shop.service.dto.YxSystemStoreQueryCriteria; import co.yixiang.utils.RedisUtil; import co.yixiang.utils.ShopKeyUtils; +import co.yixiang.utils.location.GetTencentLocationVO; +import co.yixiang.utils.location.LocationUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; @@ -86,16 +88,10 @@ public class SystemStoreController { @Log("获取经纬度") @ApiOperation("获取经纬度") @PreAuthorize("@el.check('yxSystemStore:getl')") - public ResponseEntity create(@Validated @RequestBody String jsonStr){ - String key = RedisUtil.get(ShopKeyUtils.getTengXunMapKey()); - if(StrUtil.isBlank(key)) { - throw new BadRequestException("请先配置腾讯地图key"); - } + public ResponseEntity create(@Validated @RequestBody String jsonStr) { JSONObject jsonObject = JSON.parseObject(jsonStr); String addr = jsonObject.getString("addr"); - String url = StrUtil.format("?address={}&key={}",addr,key); - String json = HttpUtil.get(ShopConstants.QQ_MAP_URL+url); - return new ResponseEntity<>(JSONUtil.parseObj(json),HttpStatus.CREATED); + return new ResponseEntity<>(LocationUtils.getLocation(addr), HttpStatus.CREATED); } @ForbidSubmit