Erstellen Sie einen SqlGeography-Polygonkreis aus einem Mittelpunkt und einem Radius

Ich möchte einen Kreis in einem SQL Server 2008-Geografiefeld mit c # speichern.

In c # habe ich einen Breitengrad, einen Längengrad und einen Radius, aber ich kann einfach keine Möglichkeit finden, das Polygon zu berechnen, das den Kreis darstellt und ein erstelltSqlGeography davon.

Ich habe folgende Funktion versucht, um das Polygon zu erstellen:

    private List<Coordinate> getCirclePoints(Coordinate center, int radius, int speed)  //speed 1: draws 360 sides, 2 draws 180 etc...
    {
        var centerLat = (center.Latitude * Math.PI) / 180.0;  //rad
        var centerLng = (center.Longitude * Math.PI) / 180.0; //rad
        var dist = (float)radius / 6371.0;             //d = angular distance covered on earth's surface
        var circlePoints = new List<Coordinate>();
        for (int x = 0; x <= 360; x += speed)
        {
            var brng = x * Math.PI / 180.0;         //rad
            var latitude = Math.Asin(Math.Sin(centerLat) * Math.Cos(dist) + Math.Cos(centerLat) * Math.Sin(dist) * Math.Cos(brng));
            var longitude = ((centerLng + Math.Atan2(Math.Sin(brng) * Math.Sin(dist) * Math.Cos(centerLat), Math.Cos(dist) - Math.Sin(centerLat) * Math.Sin(latitude))) * 180.0) / Math.PI;
            circlePoints.Add(new Coordinate((latitude * 180.0) / Math.PI, longitude));
        }
        return circlePoints;
    }

Und versuchen Sie dann, dies zu konvertierenList<Coordinate> zu einer syntaktisch analysierbaren Zeichenfolge:

        var s = "POLYGON((" + string.Join(",", points.ConvertAll(p => p.Longitude + " " + p.Latitude).ToArray()) + "))";
        var poly = SqlGeography.STPolyFromText(new System.Data.SqlTypes.SqlChars((SqlString)s), 4326);

Es wird jedoch immer beanstandet, dass sich das Polygon auf einer einzelnen Halbkugel befinden muss, wo dies sicher der Fall ist.

Bin ich überhaupt auf dem richtigen Weg? Gibt es eine andere (einfachere) Möglichkeit, dies zu tun?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage