Si vous envisagez d'effectuer des calculs spatiaux, EF 5.0 autorise les expressions LINQ telles que :
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();
}
Alors il y a une très bonne raison d'utiliser la géographie.
Explication de l'espace dans Entity Framework .
Mise à jour avec Création de bases de données spatiales hautes performances
Comme je l'ai noté sur Réponse de Noel Abrahams :
Comparons donc les types de stockage :
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'
Résultat :
name rows data
Geo 20000 728 KB
LatLon 20000 560 KB
Le type de données géographique occupe 30 % d'espace en plus.
De plus, le type de données géographique n'est pas limité au stockage d'un point, vous pouvez également stocker LineString, CircularString, CompoundCurve, Polygon, CurvePolygon, GeometryCollection, MultiPoint, MultiLineString et MultiPolygon et plus . Toute tentative de stocker même le plus simple des types de géographie (comme Lat/Long) au-delà d'un point (par exemple LINESTRING(1 1, 2 2) instance) entraînera des lignes supplémentaires pour chaque point, une colonne pour le séquençage de l'ordre de chaque point et une autre colonne pour le regroupement des lignes. SQL Server dispose également de méthodes pour les types de données Géographie qui incluent le calcul de Area, Boundary, Longueur, distances et plus .
Il semble imprudent de stocker Latitude et Longitude en décimal dans Sql Server.
Mise à jour 2
Si vous envisagez de faire des calculs comme la distance, la superficie, etc., il est difficile de les calculer correctement sur la surface de la terre. Chaque type de géographie stocké dans SQL Server est également stocké avec un ID de référence spatiale . Ces identifiants peuvent être de différentes sphères (la terre est 4326). Cela signifie que les calculs dans SQL Server seront en fait calculés correctement sur la surface de la terre (au lieu de as- les-mouches-des-corbeau qui pourrait être à travers la surface de la terre).