【问题标题】:Create a SqlGeography polygon-circle from a center and radius从中心和半径创建一个 SqlGeography 多边形圆
【发布时间】:2012-07-27 13:38:03
【问题描述】:

我想使用 c# 在 sql-server 2008 地理字段中保存一个圆圈。

在 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&lt;Coordinate&gt; 转换为可解析的字符串:

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

但它总是抱怨多边形必须在一个半球上,我敢肯定是这样。

我是否走在正确的轨道上?有没有其他(更简单的)方法可以做到这一点?

【问题讨论】:

标签: c# sql-server geospatial sqlgeography


【解决方案1】:

好的,我自己找到了答案。诀窍是创建一个点

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

希望将来能对其他人有所帮助!

【讨论】:

  • 这很有帮助,谢谢。在阅读了更多内容之后,我认为值得添加 .01 容差值将产生 33 点多边形(标准 sql 地理圆)。如果允许一些错误,则可以使用更大的值。我希望我的半径在 5 到 50 米之间,因此我使用 3 作为容差值来提高效率。
  • 感谢您的评论,我刚刚进行了一些测试并将容差更改为 0.08,这似乎为小半径提供了 16 边多边形。
  • 从 0.09(对于 100 米或更小的半径)它给出了一个 8 边或更少的多边形,这对我来说不够好
  • 我对这种方法的唯一问题是..如何将“以米为单位的半径”转换为“经纬度”单位。纬度、经度使用不同的比例尺,两者都与半径不同。
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 2021-07-26
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多