tuiwucarrer/Admin.NET/Admin.NET.Core/Service/Common/LocationService.cs

106 lines
3.0 KiB
C#

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
{
/// <summary>
/// 根据经纬度获取城市
/// </summary>
[ApiDescriptionSettings(Order = 101)]
[AllowAnonymous]
public class LocationService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository<SysRegion> _region;
public LocationService(SqlSugarRepository<SysRegion> reginService)
{
this._region = reginService;
}
/// <summary>
/// Haversine公式计算距离
/// </summary>
/// <param name="lat1"></param>
/// <param name="lon1"></param>
/// <param name="lat2"></param>
/// <param name="lon2"></param>
/// <returns></returns>
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<CityData> _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;
}
/// <summary>
/// 根据经纬度获取城市
/// </summary>
/// <param name="lng"></param>
/// <param name="lat"></param>
/// <returns></returns>
[HttpGet("getcity")]
public dynamic GetCity([FromQuery] double lng, [FromQuery] double lat)
{
var citylist = this._region.AsQueryable().Where(e => e.Level == 1).ToList();
List<CityData> cities = citylist.Select(s => new CityData()
{
Latitude = s.Lat,
Longitude = s.Lng,
CityName = s.Name,
LocationCode = s.Code
}).ToList();
return FindNearestCity(cities, lat, lng);
}
}
}