SQL Serverに図形データを含むデータを登録し、「EntityFramework6」を利用して
図形データを抽出し、抽出したデータから空間演算メソッドを利用したところ例外が発生しました。
原因を探るべく、色々調査してみました。
本処理では、ある図形の位置から該当する大字の図形を抽出する処理です。
1回目
EntityFrameworkから取得したDbGeometryから空間演算メソッド(Intersects())を呼び出しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public string GetShozaichi(DbGeometry point) { var shozaichi = ""; if (point != null) { var ooazas = this.GetOoazas(); foreach (var ooaza in ooazas) { if (ooaza.Geometry.Intersects(point)) { shozaichi = $"{ooaza.OoazaName}付近"; break; } } } return shozaichi; } |
結果は、値が入っているにもかかわらず空間演算メソッドで例外が発生しました。
Intersects以外のメソッドを呼びましたが、どれも例外が発生しています。
2回目
DbGeometryは使えそうにないので、あきらめて、EntityFrameworkから取得したDbGeometryのProviderValueというプロパティがあり
SqlGeometry型の値が入っているので、この値を使って、同じように空間演算メソッド(SqlGeometry.STIntersects())を利用しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public string GetShozaichi(DbGeometry point) { var shozaichi = ""; if (point != null) { var ooazas = this.GetOoazas(); foreach (var ooaza in ooazas) { var ooazaGeom = (SqlGeometry)ooaza.Geometry.ProviderValue; var pointGeom = (SqlGeometry)point.ProviderValue; if (ooazaGeom.STIntersects(pointGeom)) { shozaichi = $"{ooaza.OoazaName}付近"; break; } } } return shozaichi; } |
結果は、例外は発生しませんが、空間演算メソッドが正常に動いていません。
3回目
EntityFrameworkから取得したDbGeometryからバイナリデータを取得し、
バイナリデータからSqlGeometryを生成し、同じように空間演算メソッド(SqlGeometry.STIntersects())を利用しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public string GetShozaichi(DbGeometry point) { var shozaichi = ""; if (point != null) { var ooazas = this.GetOoazas(); foreach (var ooaza in ooazas) { var ooazaGeom2 = SqlGeometry.STGeomFromWKB(new SqlBytes(ooaza.Geometry.AsBinary()), 3857); var pointGeom2 = SqlGeometry.STGeomFromWKB(new SqlBytes(point.AsBinary()), 3857); if (ooazaGeom2.STIntersects(pointGeom2)) { shozaichi = $"{ooaza.OoazaName}付近"; break; } } } return shozaichi; } |
結果は、例外も発生せず、空間演算メソッドが正常に動きました。
確認のため、JTS Test Builderを使って双方の図形の位置情報を確認したところ
結果が一致しているいることを確認しました。