2014-11-04 68 views
1

有一個service,給定某些標準,例如國家和城鎮,您將獲得一個定義包含搜索區域的多邊形或多面體的着名文本。Multipoligon中的點的反向方向

您可能有一個示例here

現在我試圖將這些數據插入到使用C#和EF6.1的SQL Server數據庫中。

的代碼會是這樣的:

1日採取從服務多邊形字符串,並以變量添加:

var polygon = GetPolygonFromService(country, state, town); 

,然後使用在數據庫中插入:

using(DataContext data = new DataCVontext()) 
{ 
    var location = new Location 
    { 
     Country = country, 
     State = state, 
     Town = town, 
     GeoGraphy = DbGeography.FromText(polygon) 
    }; 
    data.Locations.Add(location); 
    data.SaveChanges(); 
} 

現在,當我這樣做,我得到一個錯誤:

The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 4 ("@3"): The supplied value is not a valid instance of data type geography. Check the source data for invalid values. An example of an invalid value is data of numeric type with scale greater than precision

經過一些研究和一些測試後,我得出結論,發生這種情況是因爲多邊形定義中每個點的順序都是這樣的,即多邊形定義了外部區域而不是內部區域,所以不是試圖獲取紐約地區,除了紐約之外,它得到了地球上的其他地區。

有沒有辦法將其轉換爲正確的方向?

+0

[這個MSDN博客文章(解決方案http://blogs.msdn.com/b/edkatibah/archive/2008/08/19/working-with-invalid-data-and-the-sql-server-2008-geography-data-type-part-1b。 aspx)可能會感興趣。你可以建立一個基於它的存儲過程,並調用它來獲取你的反轉值作爲'GetPolygonFromService'的一部分。 – 2014-11-04 14:46:23

+0

我真的想解析文本並將其逆轉... – 2014-11-04 15:25:03

回答

4

編輯:我給出的上一個答案似乎並不是每次都有效。

我發現使用這個post和建議link

首先一個函數返回一個DbGeography

public static DbGeography CreatePolygon(string wktString) 
{ 
    var sqlGeography = SqlGeography.STGeomFromText(new SqlChars(wktString), 4326).MakeValid(); 

    var invertedSqlGeography = sqlGeography.ReorientObject(); 
    if (sqlGeography.STArea() > invertedSqlGeography.STArea()) 
    { 
     sqlGeography = invertedSqlGeography; 
    } 

    return DbGeography.FromText(sqlGeography.ToString()); 
} 

然後使用功能

var polygon = GetPolygonFromService(country, state, town); 

using(DataContext data = new DataCVontext()) 
{ 
    var location = new Location 
    { 
     Country = country, 
     State = state, 
     Town = town, 
     GeoGraphy = CreatePolygon(polygon) 
    }; 

    data.Locations.Add(location); 
    data.SaveChanges(); 
}