2013-02-27 1 views
16

多分私は何かを欠いている。私は "地理"のデータ型のSQL Serverの列を持っています。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

+0

これは何度か推奨されていますが、MakeValidメソッドは.NETで使用するときはSqlGeographyタイプでは使用できないようです。何か不足していますか? – joelmdev

+0

@ jm2 Microsoft.SqlServer.Typesを参照していれば、それを利用できるはずです。 –

1

EF6を実行していない場合、提供されている解決策は問題ありません。 初期のバージョンではokですが、EF6では、このアセンブリへの参照を作成するべきではありません。 EF litleが狂ってしまいます。

+0

もっと具体的になりますか?正確に何が起こり、正しい解決策は何ですか? – grahamesd

+1

これを読んでいる誰かのために、私はまだ私の提供したソリューションをEF6で**ゼロ**の問題で使用しています。 –

1

上記のようにアセンブリへの参照を追加する必要があります。 次のポストはあなたlink助けるかもしれない、link2

8

パフォーマンスがどの重要である、よく知られたバイナリではなく、よく知られたテキストを使用する必要があります。

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

過負荷が使用してありますそれが重要な場合はSRID。千の合理的に複雑なポリゴンとの私の簡単なテストでは、バイナリベースのアプローチは、より4倍高速であるテキストベースの1:

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

ませんシリアライズ:

* 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

+1

逆の操作の場合: 'SqlGeography.STGeomFromWKB(new SqlBytes(value.AsBinary())、value.CoordinateSystemId)' –

0

は、私は実用的なソリューションとして、これを見つけました/パフォーマンスを低下させる文字列(WKT)またはバイナリ(WKB)に変換します。

それはILSpyでEntityFramework.SqlServer.dllの私の読書に基づいてEF 6.1.3、のSQLServer 2016 SP1およびMicrosoft.SqlServer.Types.14.0.314.76

+0

v10より大きいSqlGeographyを使用している場合(SQL 2008)、このメソッドは、エラー、つまり、SQL 2012以降の機能のいずれかが必要な場合は、あなたは嫌です。パフォーマンスは良いですが。 –

+0

逆の方法もないと思いますか? –

+0

逆の方法があります。今話せません。 –

1

に私のために働いている、私は最も簡単な方法を信じてSqlGeographyからDbGeographyに変換する:

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

この方法には、バイナリ変換と解析が必要ないという利点があります。内部プロバイダの値としてSqlGeographyを使用してDbGeographyを返します。