Utwórz okrąg wielokątny SqlGeography ze środka i promienia
Chciałbym zapisać okrąg w polu geograficznym sql-server 2008, używając c #.
W c # mam szerokość geograficzną, długość geograficzną i promień, ale po prostu nie mogę znaleźć sposobu na obliczenie wielokąta, który reprezentowałby okrąg i tworzySqlGeography
z tego.
Próbowałem zastosować funkcję tworzenia wielokąta:
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;
}
A potem spróbuj to przekonwertowaćList<Coordinate>
do parsowalnego łańcucha:
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);
Ale zawsze narzeka, że wielokąt musi znajdować się na jednej półkuli, gdzie na pewno tak jest.
Czy jestem w ogóle na dobrej drodze? Czy jest jakiś inny (prostszy) sposób, aby to zrobić?