106 lines
3.0 KiB
C#
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|