我想从多个纬度和经度获得中心坐标。如何在sql存储过程中编写此C#代码?
// Get Central Coordinate from multiple latitude and longitute
public static async Task<GeoCoordinate> GetCentralGeoCoordinate(List<GeoCoordinate> geoCoordinates)
{
if (geoCoordinates.Count == 1)
{
return geoCoordinates.Single();
}
double x = 0, y = 0, z = 0;
foreach (var geoCoordinate in geoCoordinates)
{
var latitude = geoCoordinate.Latitude * Math.PI / 180;
var longitude = geoCoordinate.Longitude * Math.PI / 180;
x += Math.Cos(latitude) * Math.Cos(longitude);
y += Math.Cos(latitude) * Math.Sin(longitude);
z += Math.Sin(latitude);
}
var total = geoCoordinates.Count;
x = x / total;
y = y / total;
z = z / total;
var centralLongitude = Math.Atan2(y, x);
var centralSquareRoot = Math.Sqrt(x * x + y * y);
var centralLatitude = Math.Atan2(z, centralSquareRoot);
return await Task.FromResult(new GeoCoordinate(centralLatitude * 180 / Math.PI, centralLongitude * 180 / Math.PI));
}
答案 0 :(得分:1)
SQL Server geography
数据类型已经有一个EnvelopeCenter
方法,我认为该方法可以完成您想要的操作。
因此,只要您可以构建包含所有点的geography
实例,您就应该能够直接执行此操作。
请注意,geography
类型实际上是一个称为SqlGeography
的.NET数据类型,在您的C#代码中使用的将是 natural 类型,而不是自己实现地理逻辑。
例如这是一些示例SQL,仅使用前两点(的截短版本):
select geography::STGeomFromText(
'MULTIPOINT((-2.58316 51.418798),(-2.68319 51.419035))',
4326).EnvelopeCenter()
(如果您将示例数据显示为 text 而不是图像,那么我会针对所有要点进行处理,但是我不需要打字练习了)