空間計算を行う予定がある場合、EF 5.0 では次のような LINQ 式を使用できます。
private Facility GetNearestFacilityToJobsite(DbGeography jobsite) { var q1 = from f in context.Facilities let distance = f.Geocode.Distance(jobsite) where distance < 500 * 1609.344 orderby distance select f; return q1.FirstOrDefault(); }
プレ>次に、地理を使用する十分な理由があります。
高性能空間データベースの作成 で更新
Noel Abrahams Answer で指摘したように :
ストレージ タイプの比較:
CREATE TABLE dbo.Geo ( geo geography ) GO CREATE TABLE dbo.LatLng ( lat decimal(15, 12), lng decimal(15, 12) ) GO INSERT dbo.Geo SELECT geography::Point(12.3456789012345, 12.3456789012345, 4326) UNION ALL SELECT geography::Point(87.6543210987654, 87.6543210987654, 4326) GO 10000 INSERT dbo.LatLng SELECT 12.3456789012345, 12.3456789012345 UNION SELECT 87.6543210987654, 87.6543210987654 GO 10000 EXEC sp_spaceused 'dbo.Geo' EXEC sp_spaceused 'dbo.LatLng'
プレ>結果:
name rows data Geo 20000 728 KB LatLon 20000 560 KB
プレ>geography データ型は 30% 多くのスペースを占有します。
さらに、geography データタイプはポイントの保存だけに限定されず、 も保存できます。 LineString、CircularString、CompoundCurve、Polygon、CurvePolygon、GeometryCollection、MultiPoint、MultiLineString、MultiPolygon など .最も単純な Geography タイプ (Lat/Long など) を Point を超えて格納しようとすると (LINESTRING(1 1, 2 2) インスタンスなど)、各ポイントに追加の行が発生し、各ポイントの順序を順序付けするための列が発生します。行をグループ化するための別の列。 SQL Server には、面積、境界、長さ、距離など .
Sql Server で緯度と経度を 10 進数として格納するのは賢明ではないようです。
アップデート 2
距離や面積などの計算を計画している場合、地球の表面でこれらを適切に計算することは困難です。 SQL Server に保存されている各地理タイプは、空間参照 ID と共に保存されます .これらの ID は、さまざまな球体 (地球は 4326) のものにすることができます。これは、SQL Server での計算が実際に地球の表面上で正しく計算されることを意味します (代わりに as-カラスハエ 地球の表面を通過する可能性があります)。