从SQL Server中的多个坐标获取中心坐标

时间:2019-01-16 07:43:58

标签: sql-server spatial

我想从多个纬度和经度获得中心坐标。如何在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));
}

1 个答案:

答案 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 而不是图像,那么我会针对所有要点进行处理,但是我不需要打字练习了)