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); } } }