Se prevedi di eseguire qualsiasi calcolo spaziale, EF 5.0 consente espressioni LINQ come:
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();
}
Poi c'è un ottimo motivo per usare Geography.
Spiegazione dello spazio all'interno di Entity Framework .
Aggiornato con Creazione di database spaziali ad alte prestazioni
Come ho notato su Noel Abrahams Answer :
Quindi confrontando i tipi di archiviazione:
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'
Risultato:
name rows data
Geo 20000 728 KB
LatLon 20000 560 KB
Il tipo di dati geografico occupa il 30% di spazio in più.
Inoltre, il tipo di dati geografico non si limita alla sola memorizzazione di un punto, ma puoi anche archiviare LineString, CircularString, CompoundCurve, Polygon, CurvePolygon, GeometryCollection, MultiPoint, MultiLineString e MultiPolygon e altro . Qualsiasi tentativo di memorizzare anche il più semplice dei tipi di geografia (come Lat/Long) oltre un punto (ad esempio LINESTRING(1 1, 2 2) istanza) comporterà righe aggiuntive per ogni punto, una colonna per la sequenza per l'ordine di ogni punto e un'altra colonna per il raggruppamento delle righe. SQL Server dispone anche di metodi per i tipi di dati Geography che includono il calcolo di Area, Boundary, Lunghezza, Distanze e altro .
Non sembra saggio memorizzare latitudine e longitudine come decimali in SQL Server.
Aggiornamento 2
Se hai intenzione di fare calcoli come distanza, area, ecc, calcolarli correttamente sulla superficie della terra è difficile. Ciascun tipo di geografia archiviato in SQL Server viene inoltre archiviato con un ID di riferimento spaziale . Questi ID possono essere di sfere diverse (la terra è 4326). Ciò significa che i calcoli in SQL Server verranno effettivamente calcolati correttamente sulla superficie terrestre (invece di as- le mosche del corvo che potrebbe essere attraverso la superficie della terra).