创建从圆心和半径一SqlGeography多边形圆(Create a SqlGeography po

2019-07-30 15:50发布

我想保存在SQL服务器2008地理学领域的循环,使用C#。

在C#中我有一个纬度,经度和半径,但我不能找到一种方法来计算将代表圆圈,并创建一个多边形SqlGeography从它。

我曾尝试下面的函数来创建多边形:

    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;
    }

然后尝试将其转换List<Coordinate>到一个可分析的字符串:

        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);

但它总是抱怨多边形必须是在一个半球,在那里我敢肯定,这是这种情况。

我是在所有正确的轨道上? 是否有任何其他(简单)的方式来做到这一点?

Answer 1:

OK,找到我自己的答案。 关键是要创建点

var point = SqlGeography.Point(latitude, longitude, 4326);

然后创建围绕该点的缓冲区

var poly = point.BufferWithTolerance(radiusInMeter, 0.01, true); //0.01 is to simplify the polygon to keep only a few sides

然后,你可以简单地创建SqlCommand并添加多边形作为参数:

var param = new SqlParameter(@"Polygon", poly);
param.UdtTypeName = "Geography";
command.Parameters.Add(param);

希望这将有助于有人在将来别的!



文章来源: Create a SqlGeography polygon-circle from a center and radius