2013-02-27 113 views
16

也許我錯過了一些東西。我有一個「Geography」數據類型的sql服務器列。sql地理到dbgeography?

我想在我的C#代碼中使用DbGeography類型。任何方式來從sql的地理轉換或轉換爲dbgeography?

回答

24

對不起,遲到的迴應 - 但看到這個,而尋找別的東西。

只要做到以下幾點:

SqlGeography theGeography; 
int srid = 4326; // or alternative 

DbGeography newGeography = DbGeography.FromText(theGeography.ToString(), srid); 

扭轉這種局面:

DbGeography theGeography; 
SqlGeography newGeography = SqlGeography.Parse(theGeography.AsText()).MakeValid(); 

希望幫助!

+0

我實際上在另一個項目,這再次回來了,所以謝謝,正是我在找什麼。 – radpin 2013-09-09 20:34:49

+0

我見過這個建議幾次,但在.NET中使用時,MakeValid方法在SqlGeography類型上似乎不可用。我錯過了什麼嗎? – joelmdev 2013-10-11 13:10:56

+0

@ jm2如果你已經引用了Microsoft.SqlServer.Types,它應該對你有用。 – 2013-10-11 16:21:46

1

如果您沒有運行EF6,提供的解決方案似乎可以。 早期版本可以,但是使用EF6,我們不應該引用這個程序集。 它使EF litle變得瘋狂。

+0

你能更具體嗎?究竟發生了什麼以及什麼是正確的解決方案? – grahamesd 2014-06-13 21:29:17

+1

對於其他讀者來說,我仍然使用我提供的帶有零**問題的EF6解決方案。 – 2014-06-14 19:32:24

1

如上所述,您必須添加對組件的引用。 以下後可能會幫助你linklink2

8

當性能是任何意義,衆所周知的二進制應該用來代替知名文本:

var newGeography = DbGeography.FromBinary(theGeography.STAsBinary().Value); 

有使用過載一個SRID,如果這很重要的話。在我與1000個相當複雜的多邊形簡單的測試,基於二進制的方法比快4倍的基於文本的一個:

* Binary-based conversion 
Run 1: 1948 
Run 2: 1944 
Run 3: 1959 
Run 4: 1979 
Run 5: 1988 
Average: 1963.6 

* Text-based conversion 
Run 1: 8527 
Run 2: 8553 
Run 3: 8596 
Run 4: 8535 
Run 5: 8496 
Average: 8541.4 
+0

了不起的更新,很好的方式來提高性能。 – radpin 2015-03-22 23:01:24

+1

對於反向操作:'SqlGeography.STGeomFromWKB(new SqlBytes(value.AsBinary()),value.CoordinateSystemId)' – 2015-03-23 09:22:19

0

,我發現這是一個有效的解決方案:

int coordSys = DbGeography.DefaultCoordinateSystemId; // 4326; 
SqlGeography g = SqlGeography.Point(lat, lon, coordSys); 
return DbSpatialServices.Default.GeographyFromProviderValue(g); 

沒有序列化/轉換爲可以殺死性能的字符串(WKT)或二進制(WKB)。

這是爲我工作的EF 6.1.3,SqlServer的2016 SP1和Microsoft.SqlServer.Types.14.0.314.76

+0

我會補充說,如果你使用的SqlGeography大於v10(SQL 2008),那麼這個方法會拋出一個錯誤,這意味着如果你需要SQL 2012及以上版本的任何功能,那麼你就搞砸了。雖然性能不錯。 – 2017-04-09 06:39:40

+0

我會假設沒有反向方法嗎? – 2017-04-09 06:44:56

+0

應該有一個相反的方法。目前無法分辨。 – 2017-04-10 17:05:47

1

基於對ILSpy我EntityFramework.SqlServer.dll的閱讀,相信最快的方法從SqlGeography轉換到DbGeography是:

var dbGeo = System.Data.Entity.SqlServer.SqlSpatialServices.Default.GeographyFromProviderValue(sqlGeo); 

此方法的優點是不需要進行二進制轉換和解析。它只是使用SqlGeography作爲內部提供者值返回一個DbGeography。