2012-07-27 73 views
8

我想使用c#在sql-server 2008地理字段中保存一個圓圈。從中心和半徑創建一個SqlGeography多邊形圈

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

但它總是抱怨多邊形必須是在一個半球上,我確信這是事實。

我在正確的軌道上嗎?有沒有其他(更簡單)的方法來做到這一點?

回答

19

好的,我自己找到了答案。關鍵是要建立一個點

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

希望這將有助於未來的其他人!

+0

非常感謝先生,謝謝! – EdGs 2013-04-24 20:47:07

+1

這非常有幫助,謝謝你。再讀一遍之後,我認爲值得補充的是.01的容差值將導致一個33點的多邊形(標準的SQL地理圈)。如果允許有一些錯誤,則可以使用較大的值。我期待我的半徑在5到50米之間,因此我使用3作爲公差值來提高效率。 – 2014-06-23 06:38:49

+0

感謝您的評論,我只是跑了一些測試,並將我的容差改爲0.08,這似乎給出了一個16邊多邊形的小島半徑。 – Johann 2014-06-24 08:23:06