| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | using Microsoft.AspNetCore.Http;using System.Net.Http.Json;using System.Text.Json;namespace OASystem.API.OAMethodLib.AMapApi{    /// <summary>    /// 高德地图API Service    /// </summary>    public class GeocodeService    {        private readonly string _apiKey = "2f5a9ef15f598df3170811f50787166a"; // 高德API Key        private readonly HttpClient _httpClient;        /// <summary>        /// 初始化        /// </summary>        /// <param name="httpClient"></param>        public GeocodeService(HttpClient httpClient)        {            _httpClient = httpClient;        }        /// <summary>        /// 获取单个地址的经纬度        /// </summary>        /// <param name="address"></param>        /// <returns></returns>        public async Task<GeocodeResult> GetGeocodeAsync(string address)        {            if (string.IsNullOrEmpty(address)) return new GeocodeResult { Address = address, Status = "Failed", Info = "地址为空!" };            string url = $"https://restapi.amap.com/v3/geocode/geo?key={_apiKey}&address={Uri.EscapeDataString(address)}";            var response = await _httpClient.GetFromJsonAsync<JsonElement>(url);            if (response.GetProperty("status").GetString() == "1" && response.GetProperty("geocodes").GetArrayLength() > 0)            {                var location = response.GetProperty("geocodes")[0].GetProperty("location").GetString();                var coordinates = location.Split(',');                return new GeocodeResult                {                    Address = address,                    Longitude = double.Parse(coordinates[0]),                    Latitude = double.Parse(coordinates[1]),                    Status = "Success",                    Info = "OK"                };            }            else            {                return new GeocodeResult                {                    Address = address,                    Status = "Failed",                    Info = response.GetProperty("info").GetString()                };            }        }        /// <summary>        /// 批量获取多个地址的经纬度        /// </summary>        /// <param name="addresses"></param>        /// <param name="qpsLimit"></param>        /// <returns></returns>        public async Task<List<GeocodeResult>> GetGeocodesAsync(IEnumerable<string> addresses, int qpsLimit = 3)        {            var results = new List<GeocodeResult>();            for (int i = 0; i < addresses.Count(); i += qpsLimit)            {                // 每次处理 qpsLimit 个地址                var batch = addresses.Skip(i).Take(qpsLimit);                // 创建并启动任务                var tasks = batch.Select(GetGeocodeAsync).ToList();                var batchResults = await Task.WhenAll(tasks);                // 收集结果                results.AddRange(batchResults);                // 如果还有剩余请求,延迟一秒                if (i + qpsLimit < addresses.Count())                {                    await Task.Delay(1000);                }            }            return results;        }        public class GeocodeResult        {            public string Address { get; set; }            public double Latitude { get; set; }            public double Longitude { get; set; }            public string Status { get; set; }            public string Info { get; set; }        }    }}
 |