Получить центральную координату из нескольких координат в SQL Server - PullRequest
0 голосов
/ 16 января 2019

Я хочу получить центральную координату из нескольких широт и долгот. Как я могу написать этот код C # в SQL-хранимой процедуре?

// 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 голосов
/ 16 января 2019

Тип данных SQL Server geography уже имеет метод EnvelopeCenter, который, я думаю, должен делать то, что вы хотите.

Таким образом, при условии, что вы можете создать geography экземпляр, содержащий все ваши очки, вы сможете сделать это напрямую.

Обратите внимание, что тип geography на самом деле представляет собой тип данных .NET, называемый SqlGeography, который был бы более естественным типом для использования в вашем коде C #, а не чем реализовать географию логики самостоятельно.

например. Вот пример SQL, просто использующий (усеченную версию) ваши первые две точки:

select geography::STGeomFromText(
   'MULTIPOINT((-2.58316 51.418798),(-2.68319 51.419035))',
   4326).EnvelopeCenter()

(Если бы вы представили свои образцы данных в виде текст , а не изображение, я бы сделал это для всех пунктов, но мне не нужна практика набора текста, спасибо)

...