using Microsoft.AspNetCore.Http;
using System.Net.Http.Json;
using System.Text.Json;
namespace OASystem.API.OAMethodLib.AMapApi
{
///
/// 高德地图API Service
///
public class GeocodeService
{
private readonly string _apiKey = "2f5a9ef15f598df3170811f50787166a"; // 高德API Key
private readonly HttpClient _httpClient;
///
/// 初始化
///
///
public GeocodeService(HttpClient httpClient)
{
_httpClient = httpClient;
}
///
/// 获取单个地址的经纬度
///
///
///
public async Task 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(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()
};
}
}
///
/// 批量获取多个地址的经纬度
///
///
///
///
public async Task> GetGeocodesAsync(IEnumerable addresses, int qpsLimit = 3)
{
var results = new List();
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; }
}
}
}