From 03ed8f258fe521e8e378a5dd963993d6b9c3f504 Mon Sep 17 00:00:00 2001 From: wangyu <823267011@qq.com> Date: Tue, 2 Jun 2026 09:51:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=9B=9E=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FadAppLocationController.java | 17 +----- .../service/IFadAppLocationService.java | 15 +++-- .../impl/FadAppLocationServiceImpl.java | 55 +++++++------------ 3 files changed, 29 insertions(+), 58 deletions(-) diff --git a/fad-app/src/main/java/com/ruoyi/fadapp/controller/FadAppLocationController.java b/fad-app/src/main/java/com/ruoyi/fadapp/controller/FadAppLocationController.java index 31b1994..921985c 100644 --- a/fad-app/src/main/java/com/ruoyi/fadapp/controller/FadAppLocationController.java +++ b/fad-app/src/main/java/com/ruoyi/fadapp/controller/FadAppLocationController.java @@ -24,25 +24,14 @@ public class FadAppLocationController { private final IFadAppLocationService locationService; /** - * 兼容老接口:返回单一城市/区县字符串。 - * 用 Map 包一层避开 R.ok(String) 把字符串塞到 msg 的重载冲突。 + * 根据经纬度获取地址(精确到区/县)。 + *

用 Map 包一层避开 R.ok(String) 把字符串塞到 msg 字段的重载冲突。 */ @GetMapping("/city") public R> getCity(@RequestParam Double latitude, @RequestParam Double longitude) { - String city = locationService.getCityByLocation(latitude, longitude); Map data = new HashMap<>(); - data.put("city", city); + data.put("city", locationService.getCityByLocation(latitude, longitude)); return R.ok(data); } - - /** - * 精确到区县的结构化地址。 - * 返回:province / city / district / township / adcode / address。 - */ - @GetMapping("/detail") - public R> getDetail(@RequestParam Double latitude, - @RequestParam Double longitude) { - return R.ok(locationService.getDetailedLocation(latitude, longitude)); - } } diff --git a/fad-app/src/main/java/com/ruoyi/fadapp/service/IFadAppLocationService.java b/fad-app/src/main/java/com/ruoyi/fadapp/service/IFadAppLocationService.java index dadf7d6..bcf6689 100644 --- a/fad-app/src/main/java/com/ruoyi/fadapp/service/IFadAppLocationService.java +++ b/fad-app/src/main/java/com/ruoyi/fadapp/service/IFadAppLocationService.java @@ -1,18 +1,17 @@ package com.ruoyi.fadapp.service; -import java.util.Map; - /** * FAD APP 定位服务接口 */ public interface IFadAppLocationService { - /** 老接口:返回单一最精准的可读地址(兼容用),优先 district。 */ - String getCityByLocation(Double latitude, Double longitude); - /** - * 结构化逆地理编码。 - * 返回字段:province / city / district / township / adcode / address。 + * 根据经纬度返回最精准的地址(精确到区/县)。 + * 例如 "烟台市芝罘区"、"北京市朝阳区",直辖市可能只有 "朝阳区"。 + * + * @param latitude 纬度 + * @param longitude 经度 + * @return 地址字符串,失败返回 "" */ - Map getDetailedLocation(Double latitude, Double longitude); + String getCityByLocation(Double latitude, Double longitude); } diff --git a/fad-app/src/main/java/com/ruoyi/fadapp/service/impl/FadAppLocationServiceImpl.java b/fad-app/src/main/java/com/ruoyi/fadapp/service/impl/FadAppLocationServiceImpl.java index 0c07493..c6ce9cf 100644 --- a/fad-app/src/main/java/com/ruoyi/fadapp/service/impl/FadAppLocationServiceImpl.java +++ b/fad-app/src/main/java/com/ruoyi/fadapp/service/impl/FadAppLocationServiceImpl.java @@ -8,7 +8,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @@ -28,32 +27,15 @@ public class FadAppLocationServiceImpl implements IFadAppLocationService { private String amapKey; /** - * 兼容老接口:只取一个尽量精准的可读地址字符串。 - * 优先级:district → city → province。 + * 根据经纬度返回最精准的可读地址:优先到区/县。 + * 返回示例:"烟台市芝罘区" / "北京市朝阳区" / "山东省"(兜底)。 */ @Override public String getCityByLocation(Double latitude, Double longitude) { - Map d = getDetailedLocation(latitude, longitude); - if (d == null) return ""; - Object dist = d.get("district"); - if (dist != null && !dist.toString().isEmpty()) return dist.toString(); - Object city = d.get("city"); - if (city != null && !city.toString().isEmpty()) return city.toString(); - Object prov = d.get("province"); - return prov == null ? "" : prov.toString(); - } - - /** - * 返回结构化地址:province / city / district / address(完整) / adcode。 - * 失败时返回空 Map。 - */ - @Override - public Map getDetailedLocation(Double latitude, Double longitude) { - Map empty = new HashMap<>(); - if (latitude == null || longitude == null) return empty; + if (latitude == null || longitude == null) return ""; if (!org.springframework.util.StringUtils.hasText(amapKey)) { log.warn("高德地图 key 未配置"); - return empty; + return ""; } try { @@ -72,32 +54,33 @@ public class FadAppLocationServiceImpl implements IFadAppLocationService { JSONObject response = restTemplate.getForObject(url.toString(), JSONObject.class); if (response == null || !"1".equals(response.getString("status"))) { log.warn("高德逆地理编码失败: {}", response); - return empty; + return ""; } JSONObject regeocode = response.getJSONObject("regeocode"); - if (regeocode == null) return empty; - String formatted = regeocode.getString("formatted_address"); + if (regeocode == null) return ""; JSONObject ac = regeocode.getJSONObject("addressComponent"); - if (ac == null) return empty; + if (ac == null) return ""; - Map out = new LinkedHashMap<>(); - out.put("province", _str(ac, "province")); - out.put("city", _str(ac, "city")); - out.put("district", _str(ac, "district")); - out.put("township", _str(ac, "township")); - out.put("adcode", _str(ac, "adcode")); - out.put("address", formatted == null ? "" : formatted); - return out; + // 优先到区县级别 + String district = _str(ac, "district"); + String city = _str(ac, "city"); + String province = _str(ac, "province"); + if (!district.isEmpty()) { + // 直辖市 city 为空时只显示区,否则拼"市+区" + return city.isEmpty() ? district : (city + district); + } + if (!city.isEmpty()) return city; + return province; } catch (Exception e) { log.warn("根据经纬度获取地址失败, lat={}, lng={}, err={}", latitude, longitude, e.getMessage()); - return empty; + return ""; } } + /** 高德对部分字段(直辖市的 city、无下级的乡镇)返回 [],统一收敛成 "" */ private String _str(JSONObject o, String key) { Object v = o.get(key); if (v == null) return ""; - // 高德对部分字段(如 city 是直辖市时)会返回空数组 [] if (v instanceof java.util.List && ((java.util.List) v).isEmpty()) return ""; return v.toString(); }