From 53857f42f777e2b9753b8f00cce1a60ce3dcb8fd Mon Sep 17 00:00:00 2001
From: Riku <risaku@163.com>
Date: 星期三, 15 十月 2025 22:42:29 +0800
Subject: [PATCH] 2025.10.15 修改高德地图地理逆编码结果,让地理位置信息更加详细

---
 src/main/kotlin/com/flightfeather/uav/common/net/AMapService.kt |  113 +++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 87 insertions(+), 26 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/common/net/AMapService.kt b/src/main/kotlin/com/flightfeather/uav/common/net/AMapService.kt
index a9c5497..2740da2 100644
--- a/src/main/kotlin/com/flightfeather/uav/common/net/AMapService.kt
+++ b/src/main/kotlin/com/flightfeather/uav/common/net/AMapService.kt
@@ -1,19 +1,20 @@
 package com.flightfeather.uav.common.net
 
 import com.flightfeather.uav.common.exception.BizException
-import com.google.gson.Gson
 import com.google.gson.JsonElement
 import com.google.gson.JsonObject
 import com.google.gson.JsonParser
-import java.nio.charset.Charset
+import org.apache.http.util.EntityUtils
+import java.net.URLEncoder
 
 /**
  * 楂樺痉鍦板浘Web鏈嶅姟API
+ * Date: 2024/07/14
  */
 object AMapService {
 
     private const val TAG = "AMapService"
-    private const val KEY = "520c5e5cf44c7793104e500cbf0ed711"
+    private const val KEY = "b36a93bac8950d3d7c6c06f21133de51"
 
     private val httpMethod = HttpMethod("restapi.amap.com", 443, true)
 
@@ -26,22 +27,80 @@
         val adcode: String,
         val township: String,
         val towncode: String,
-        val street: String,
+        val address: String,
+        val streetNumber: String,
+        val roadinter: String,
     )
+
+    data class AMapDirection(
+        // 璺嚎绫诲瀷锛宒riving: 椹捐溅锛�
+        val type: String,
+        // 璧风偣缁忕含搴�
+        val origin: Pair<Double, Double>,
+        // 缁堢偣缁忕含搴�
+        val destination: Pair<Double, Double>,
+        // 閫斿緞璺嚎缁忕含搴︼紙涓嶅寘鎷捣鐐圭粓鐐癸級
+        val paths: List<Pair<Double, Double>>,
+        // 鏂规璺濈锛屽崟浣嶏細绫�
+        val distance: String
+    )
+
+    /**
+     * 椹捐溅璺嚎瑙勫垝
+     */
+    fun directionDriving(origin: Pair<Double, Double>, destination: Pair<Double, Double>): AMapDirection {
+        val res = httpMethod.get(
+            "/v5/direction/driving", listOf(
+                "key" to KEY,
+                "origin" to "${origin.first},${origin.second}",
+                "destination" to "${destination.first},${destination.second}",
+                "show_fields" to "polyline"
+            )
+        )
+        val obj = handleRes(res)
+        try {
+            val count = obj["count"].asString.toIntOrNull()
+            if (count != null && count > 0) {
+                val path = obj["route"].asJsonObject["paths"].asJsonArray.get(0).asJsonObject
+                val finalPaths = mutableListOf<Pair<Double, Double>>()
+                path["steps"].asJsonArray.forEach {
+                    finalPaths.addAll(
+                        it.asJsonObject["polyline"].asString.split(";").map { str ->
+                            val strArr = str.split(",")
+                            strArr[0].toDouble() to strArr[1].toDouble()
+                        }
+                    )
+                }
+                return AMapDirection("driving", origin, destination, finalPaths, path["distance"].asString)
+            } else {
+                throw BizException("楂樺痉API椹捐溅璺嚎瑙勫垝澶辫触锛屾病鏈夋壘鍒板彲琛岀殑璺嚎")
+            }
+        } catch (e: Exception) {
+            throw BizException("楂樺痉API椹捐溅璺嚎瑙勫垝閿欒锛�${e.message}")
+        }
+    }
 
     /**
      * 鍦扮悊閫嗙紪鐮�
      * @param location 鍧愭爣鐐�
      * @return 鎵�鍦ㄨ閬�
      */
-    fun reGeo(location:Pair<Double, Double>):AMapAddress {
-        val res = httpMethod.get("/v3/geocode/regeo", listOf(
-            "key" to KEY,
-            "location" to "${location.first},${location.second}"
-        ))
+    fun reGeo(location: Pair<Double, Double>): AMapAddress {
+        val res = httpMethod.get(
+            "/v3/geocode/regeo", listOf(
+                "key" to KEY,
+                "location" to "${location.first},${location.second}",
+                "extensions" to "all"
+            )
+        )
         val obj = handleRes(res)
         try {
-            val a = obj["regeocode"].asJsonObject["addressComponent"].asJsonObject
+            val regeocode = obj["regeocode"].asJsonObject
+            val a = regeocode["addressComponent"].asJsonObject
+            val streetNumber = a["streetNumber"].asJsonObject
+            val roads = regeocode["roads"].asJsonArray
+            val roadinters = regeocode["roadinters"].asJsonArray
+            val roadinter = if (roadinters.size() > 0) roadinters.get(0).asJsonObject else null
             return AMapAddress(
                 a["country"].asString,
                 a["province"].asString,
@@ -51,10 +110,14 @@
                 a["adcode"].asString,
                 a["township"].asString,
                 a["towncode"].asString,
-                a["streetNumber"].asJsonObject["street"].asString,
+                regeocode["formatted_address"].asString,
+                streetNumber["street"].asString + streetNumber["number"].asString
+                        + streetNumber["direction"].asString + streetNumber["distance"].asDouble.toInt() + "绫�",
+                if(roadinter == null) "" else roadinter.get("first_name")?.asString +"鍜�" + roadinter.get("second_name")?.asString + "浜ゅ弶鍙�"
+                        + roadinter.get("direction")?.asString + roadinter.get("distance")?.asDouble?.toInt() + "绫�",
             )
         } catch (e: Exception) {
-            throw BizException("楂樺痉API鍧愭爣杞崲閿欒锛�${e.message}")
+            throw BizException("楂樺痉API鍧愭爣杞崲閿欒锛�${e.message}", e.cause)
         }
     }
 
@@ -63,12 +126,15 @@
      * @param locations 鍘熷鍧愭爣
      * @param coordsys 鍘熷潗鏍囩郴锛屽彲閫夊�硷細gps;mapbar;baidu;autonavi(涓嶈繘琛岃浆鎹�)
      */
-    fun coordinateConvert(locations: List<Pair<Double, Double>>, coordsys:String="gps"): List<Pair<Double, Double>> {
-        val res = httpMethod.get("/v3/assistant/coordinate/convert", listOf(
-            "key" to KEY,
-            "locations" to locations.joinToString("|") { "${it.first},${it.second}" },
-            "coordsys" to coordsys
-        ))
+    fun coordinateConvert(locations: List<Pair<Double, Double>>, coordsys: String = "gps"): List<Pair<Double, Double>> {
+        val locationsStr = URLEncoder.encode(locations.joinToString("|") { "${it.first},${it.second}" }, "UTF-8")
+        val res = httpMethod.get(
+            "/v3/assistant/coordinate/convert", listOf(
+                "key" to KEY,
+                "locations" to locationsStr,
+                "coordsys" to coordsys
+            )
+        )
         val obj = handleRes(res)
         try {
             return obj["locations"].asString.split(";").map {
@@ -80,18 +146,13 @@
         }
     }
 
-    private fun handleRes(res: HttpMethod.MyResponse):JsonObject {
+    private fun handleRes(res: HttpMethod.MyResponse): JsonObject {
         if (res.success) {
-//            val str = if (res.m.responseCharSet == "utf-8") {
-//                res.m.responseBodyAsString
-//            } else {
-//                String(res.m.responseBody, Charset.forName("utf-8"))
-//            }
-            val str = res.m.responseBodyAsString
+            val str = EntityUtils.toString(res.m.entity)
             val json = JsonParser.parseString(str)
             return resCheck(json)
         } else {
-            throw BizException("楂樺痉API缃戣矾閾炬帴閿欒锛岀姸鎬佺爜锛�${res.m.statusCode}")
+            throw BizException("楂樺痉API缃戣矾閾炬帴閿欒锛岀姸鎬佺爜锛�${res.m.statusLine.statusCode}")
         }
     }
 

--
Gitblit v1.9.3