Hvis du planlægger at foretage en rumlig beregning, tillader EF 5.0 LINQ-udtryk 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();
}
Så er der en rigtig god grund til at bruge Geografi.
Forklaring af rumlig inden for Entity Framework .
Opdateret med Oprettelse af højtydende rumlige databaser
Som jeg bemærkede på Noel Abrahams Answer :
Så sammenligning af lagertyper:
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 fylder 30 % mere.
Derudover er geografidatatypen ikke begrænset til kun at gemme et punkt, du kan også gemme LineString, CircularString, CompoundCurve, Polygon, CurvePolygon, GeometryCollection, MultiPoint, MultiLineString og MultiPolygon og mere . Ethvert forsøg på at gemme selv de simpleste geografityper (som Lat/Long) ud over et punkt (for eksempel LINESTRING(1 1, 2 2)-forekomst) vil medføre yderligere rækker for hvert punkt, en kolonne til sekventering for rækkefølgen af hvert punkt og en anden kolonne til gruppering af linjer. SQL Server har også metoder til datatyperne Geografi, som omfatter beregning af Area, Boundary, Længde, afstande og mere .
Det virker uklogt at gemme breddegrad og længdegrad som decimal i SQL Server.
Opdatering 2
Hvis du planlægger at lave nogle beregninger som afstand, areal osv., er det svært at beregne disse korrekt over jordens overflade. Hver Geografi-type, der er gemt i SQL Server, er også gemt med et Spatial Reference ID . Disse id'er kan være af forskellige sfærer (jorden er 4326). Det betyder, at beregningerne i SQL Server faktisk vil beregne korrekt over jordens overflade (i stedet for as- fuglefuglene som kunne være gennem jordens overflade).