吉安感知网项目-后端
linwei
2026-06-05 97133e5c65358052839115200232ea84bccfe71f
drone-service/drone-gd/src/main/java/org/sxkj/gd/utils/GdGeoAddressUtil.java
@@ -18,6 +18,7 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springblade.core.tool.utils.StringUtil;
@@ -26,7 +27,7 @@
import java.net.URI;
import java.nio.charset.StandardCharsets;
import org.springframework.web.util.UriUtils;
@Slf4j
public class GdGeoAddressUtil {
   private static final Logger logger = LoggerFactory.getLogger(GdGeoAddressUtil.class);
   private static final String TIAN_DI_TU_KEY = "9171789c872b8cfee7bba45c35a6b955";
@@ -48,15 +49,72 @@
      }
   }
   /**
    * 根据经纬度获取区县代码
    * @param longitude 经度
    * @param latitude 纬度
    * @return 区县代码(已去除156国家代码前缀)
    */
   public static String getCountyCode(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 countyCode = requestCountyCode(postStr);
         // 去除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) {
      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);
      log.info("天地图逆地理编码请求地址:{}", url);
      String response = REST_TEMPLATE.getForObject(uri, String.class);
      if (StringUtil.isBlank(response)) {
         return null;
      }
      try {
         log.info("天地图逆地理编码结果:{}", response);
         JsonNode root = OBJECT_MAPPER.readTree(response);
         String address = root.path("result").path("formatted_address").asText();
         return StringUtil.isBlank(address) ? null : address;
@@ -65,4 +123,66 @@
         return null;
      }
   }
   /**
    * 请求天地图API获取区县代码
    * @param postStr 请求参数
    * @return 区县代码
    */
   private static String requestCountyCode(String postStr) {
      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);
      String response = REST_TEMPLATE.getForObject(uri, String.class);
      if (StringUtil.isBlank(response)) {
         return null;
      }
      try {
         log.info("天地图逆地理编码结果:{}", response);
         JsonNode root = OBJECT_MAPPER.readTree(response);
         String countyCode = root.path("result").path("addressComponent").path("county_code").asText();
         return StringUtil.isBlank(countyCode) ? null : countyCode;
      } catch (Exception e) {
         logger.warn("解析天地图逆地理编码区县代码失败", e);
         return null;
      }
   }
   /**
    * 请求天地图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);
   //    System.out.println("地址:" + formattedAddress);
   //    System.out.println("区县代码:" + countyCode);
   // }
}