2012-07-27 12 views
8

c#を使用して、SQL Server 2008地理フィールドに円を保存したいとします。中心と半径からSqlGeographyポリゴンサークルを作成する

私は緯度、経度、および半径を持っていますが、円を表すポリゴンを計算してそれから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); 

しかし、それは常に多角形をしなければなら文句私はそれが事実であると確信しています。

私はまさに正しい道にいるのですか?これを行う他の(簡単な)方法はありますか?

答えて

19

OK、自分で答えを見つけました。

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

希望:トリックは

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

が次にあなたは、単にSqlCommandを作成することができますポイントを中心にバッファを作成する時点その後

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

を作成し、パラメータとしてポリゴンを追加することです将来誰かを助けることでしょう!

+0

ありがとうございます、ありがとうございます! – EdGs

+1

これはとても役に立ちました。もう少し読んだら、.01の公差の値が33ポイントのポリゴン(標準のSQLジオサークル)になるということを追加する価値があると思った。何らかのエラーが許容される場合は、より大きな値を使用することができます。私は半径が5〜50メートルのどこかにあることを期待しているので、効率を改善するために許容値に3を使用しています。 –

+0

あなたのコメントのおかげで、私はちょうどいくつかのテストを実行し、0.08に耐性を変更しました。これは小さなアイディアの半径に対して16辺のポリゴンを与えるようです。 – Johann

関連する問題