Joh*_*ann 9 c# sql-server geospatial sqlgeography
我想使用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;
}
Run Code Online (Sandbox Code Playgroud)
然后尝试将其转换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);
Run Code Online (Sandbox Code Playgroud)
但它总是抱怨多边形必须在一个半球上,我确信是这种情况.
我在正确的轨道上吗?有没有其他(更简单)的方法来做到这一点?
Joh*_*ann 22
好的,我自己找到了答案.诀窍是创造一个点
var point = SqlGeography.Point(latitude, longitude, 4326);
Run Code Online (Sandbox Code Playgroud)
然后围绕该点创建一个缓冲区
var poly = point.BufferWithTolerance(radiusInMeter, 0.01, true); //0.01 is to simplify the polygon to keep only a few sides
Run Code Online (Sandbox Code Playgroud)
然后你可以简单地创建一个SqlCommand并添加多边形作为参数:
var param = new SqlParameter(@"Polygon", poly);
param.UdtTypeName = "Geography";
command.Parameters.Add(param);
Run Code Online (Sandbox Code Playgroud)
希望将来能帮助别人!