Om du planerar att göra någon rumslig beräkning tillåter EF 5.0 LINQ-uttryck som:
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();
}
Då finns det en mycket god anledning att använda Geografi.
Förklaring av spatial inom Entity Framework .
Uppdaterad med Skapa högpresterande rumsliga databaser
Som jag noterade på Noel Abrahams svar :
Så att jämföra lagringstyper:
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'
Resultat:
name rows data
Geo 20000 728 KB
LatLon 20000 560 KB
Geografidatatypen tar upp 30 % mer utrymme.
Dessutom är geografidatatypen inte begränsad till att bara lagra en punkt, du kan också lagra LineString, CircularString, CompoundCurve, Polygon, CurvePolygon, GeometryCollection, MultiPoint, MultiLineString och MultiPolygon med flera . Varje försök att lagra även de enklaste geografityperna (som Lat/Long) bortom en punkt (till exempel LINESTRING(1 1, 2 2)-instans) kommer att medföra ytterligare rader för varje punkt, en kolumn för sekvensering för varje punkts ordning och en annan kolumn för gruppering av linjer. SQL Server har också metoder för datatyperna Geografi som inkluderar beräkning av Area, Boundary, Längd, avstånd och mer .
Det verkar oklokt att lagra latitud och longitud som decimal i SQL Server.
Uppdatering 2
Om du planerar att göra några beräkningar som avstånd, area, etc, är det svårt att korrekt beräkna dessa över jordens yta. Varje geografityp som lagras i SQL Server lagras också med ett Spatialt referens-ID . Dessa id:n kan vara av olika sfärer (jorden är 4326). Detta innebär att beräkningarna i SQL Server faktiskt kommer att beräknas korrekt över jordens yta (istället för as- fågelflugorna som kan vara genom jordens yta).