using Microsoft.CodeAnalysis.CSharp.Syntax;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Admin.NET.Core.Service
{
///
/// 根据经纬度获取城市
///
[ApiDescriptionSettings(Order = 101)]
[AllowAnonymous]
public class LocationService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository _region;
public LocationService(SqlSugarRepository reginService)
{
this._region = reginService;
}
///
/// Haversine公式计算距离
///
///
///
///
///
///
private double CalculateDistance(double lat1, double lon1, double lat2, double lon2)
{
const double R = 6371; // 地球半径,单位:千米
double dLat = (lat2 - lat1) * (Math.PI / 180);
double dLon = (lon2 - lon1) * (Math.PI / 180);
double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
Math.Cos(lat1 * (Math.PI / 180)) * Math.Cos(lat2 * (Math.PI / 180)) *
Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
return R * c;
}
// 根据传入的经纬度查找最近的城市
[NonAction]
private CityData FindNearestCity(List _cityDataList, double targetLatitude, double targetLongitude)
{
if (_cityDataList.Count == 0)
{
return new CityData() { };
}
double minDistance = double.MaxValue;
var nearestCity = new CityData();
foreach (var cityData in _cityDataList)
{
double distance = CalculateDistance(targetLatitude, targetLongitude, cityData.Latitude, cityData.Longitude);
if (distance < minDistance)
{
minDistance = distance;
nearestCity = cityData;
}
}
return nearestCity;
}
///
/// 根据经纬度获取城市
///
///
///
///
[HttpGet("getcity")]
public dynamic GetCity([FromQuery] double lng, [FromQuery] double lat)
{
var citylist = this._region.AsQueryable().Where(e => e.Level == 1).ToList();
List cities = citylist.Select(s => new CityData()
{
Latitude = s.Lat,
Longitude = s.Lng,
CityName = s.Name,
LocationCode = s.Code
}).ToList();
return FindNearestCity(cities, lat, lng);
}
}
}