2013-02-27 65 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。