gpt4 book ai didi

c# - 从中心和半径创建一个 SqlGeography 多边形圆

转载 作者:太空狗 更新时间:2023-10-29 17:33:22 24 4
gpt4 key购买 nike

我想使用 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<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);

但它总是提示多边形必须在一个半球上,我确信是这种情况。

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

最佳答案

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

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

希望这对将来的其他人有帮助!

关于c# - 从中心和半径创建一个 SqlGeography 多边形圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11688922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com