Ако планирате да правите някакво пространствено изчисление, 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();
}
Тогава има много добра причина да използвате география.
Обяснение на пространственото в рамките на Entity Framework .
Актуализирано с Създаване на високопроизводителни пространствени бази данни
Както отбелязах в 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
Географският тип данни заема 30% повече място.
Освен това типът данни за география не се ограничава само до съхраняване на точка, можете също да съхранявате LineString, CircularString, CompoundCurve, Polygon, CurvePolygon, GeometryCollection, MultiPoint, MultiLineString и MultiPolygon и други . Всеки опит за съхраняване дори на най-простите географски типове (като ширина/дължина) извън точка (например LINESTRING(1 1, 2 2) екземпляр) ще доведе до допълнителни редове за всяка точка, колона за последователност за реда на всяка точка и друга колона за групиране на редове. SQL Server също има методи за типовете данни Geography, които включват изчисляване на Area, Boundary, Дължина, разстояния и други .
Изглежда неразумно да се съхраняват географска ширина и дължина като десетични числа в Sql сървър.
Актуализация 2
Ако планирате да правите изчисления като разстояние, площ и т.н., правилното им изчисляване върху повърхността на земята е трудно. Всеки тип география, съхраняван в SQL Server, също се съхранява с Идентификационен номер за пространствена препратка . Тези идентификатори могат да бъдат от различни сфери (земята е 4326). Това означава, че изчисленията в SQL Server всъщност ще изчислят правилно върху повърхността на земята (вместо as- враните-летят което може да бъде през повърхността на земята).