吉安感知网项目-后端
linwei
2026-06-05 97133e5c65358052839115200232ea84bccfe71f
feat(geo): 更新地理编码工具以支持街道级别定位

- 修改 getCountyCode 方法返回值描述,添加 156 国家代码前缀移除说明
- 新增 removeCountryCodePrefix 私有方法用于移除行政区划代码中的 156 国家代码前缀
- 新增 getTownCode 方法根据经纬度获取街道代码
- 新增 requestTownCode 私有方法请求天地图 API 获取街道代码
- 修改工单服务实现类使用 getTownCode 替代 getCountyCode 进行区域代码设置
2 files modified
72 ■■■■■ changed files
drone-service/drone-gd/src/main/java/org/sxkj/gd/utils/GdGeoAddressUtil.java 70 ●●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdWorkOrderServiceImpl.java 2 ●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/utils/GdGeoAddressUtil.java
@@ -53,7 +53,7 @@
     * 根据经纬度获取区县代码
     * @param longitude 经度
     * @param latitude 纬度
     * @return 区县代码
     * @return 区县代码(已去除156国家代码前缀)
     */
    public static String getCountyCode(Double longitude, Double latitude) {
        if (longitude == null || latitude == null) {
@@ -62,11 +62,46 @@
        try {
            String postStr = String.format("{'lon':%s,'lat':%s,'ver':1}", longitude, latitude);
            String countyCode = requestCountyCode(postStr);
            return StringUtil.isBlank(countyCode) ? null : countyCode;
            // 去除156国家代码前缀
            return StringUtil.isBlank(countyCode) ? null : removeCountryCodePrefix(countyCode);
        } catch (Exception e) {
            logger.warn("天地图逆地理编码获取区县代码失败", e);
            return null;
        }
    }
    /**
     * 根据经纬度获取街道代码
     * @param longitude 经度
     * @param latitude 纬度
     * @return 街道代码(已去除156国家代码前缀)
     */
    public static String getTownCode(Double longitude, Double latitude) {
        if (longitude == null || latitude == null) {
            return null;
        }
        try {
            String postStr = String.format("{'lon':%s,'lat':%s,'ver':1}", longitude, latitude);
            String townCode = requestTownCode(postStr);
            // 去除156国家代码前缀
            return StringUtil.isBlank(townCode) ? null : removeCountryCodePrefix(townCode);
        } catch (Exception e) {
            logger.warn("天地图逆地理编码获取街道代码失败", e);
            return null;
        }
    }
    /**
     * 去除行政区划代码中的156国家代码前缀
     * @param code 原始行政区划代码
     * @return 去除156前缀后的代码
     */
    private static String removeCountryCodePrefix(String code) {
        if (StringUtil.isBlank(code)) {
            return code;
        }
        // 156是中国的国家代码,去除前缀
        return code.startsWith("156") ? code.substring(3) : code;
    }
    private static String requestAddress(String postStr) {
@@ -113,6 +148,37 @@
        }
    }
    /**
     * 请求天地图API获取街道代码
     * @param postStr 请求参数
     * @return 街道代码
     */
    private static String requestTownCode(String postStr) {
        // 步骤1:构建请求URL
        String encodedPostStr = UriUtils.encodeQueryParam(postStr, StandardCharsets.UTF_8);
        String url = TIAN_DI_TU_URL + "?postStr=" + encodedPostStr + "&type=geocode&tk=" + TIAN_DI_TU_KEY;
        URI uri = URI.create(url);
        // 步骤2:发送HTTP请求
        String response = REST_TEMPLATE.getForObject(uri, String.class);
        if (StringUtil.isBlank(response)) {
            return null;
        }
        // 步骤3:解析JSON响应
        try {
            log.info("天地图逆地理编码结果:{}", response);
            JsonNode root = OBJECT_MAPPER.readTree(response);
            // 步骤4:提取街道代码
            String townCode = root.path("result").path("addressComponent").path("town_code").asText();
            return StringUtil.isBlank(townCode) ? null : townCode;
        } catch (Exception e) {
            logger.warn("解析天地图逆地理编码街道代码失败", e);
            return null;
        }
    }
    // public static void main(String[] args) {
    //     String formattedAddress = getFormattedAddress(116.39742, 39.90923);
    //     String countyCode = getCountyCode(116.39742, 39.90923);
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdWorkOrderServiceImpl.java
@@ -97,7 +97,7 @@
        if (centerCoords == null || centerCoords.length < 2) {
            return false;
        }
        String countyCode = GdGeoAddressUtil.getCountyCode(centerCoords[0], centerCoords[1]);
        String countyCode = GdGeoAddressUtil.getTownCode(centerCoords[0], centerCoords[1]);
        entity.setAreaCode(countyCode);
        // 生成工单编号
        if (StringUtils.isBlank(entity.getWorkOrderCode())) {