Jeśli planujesz wykonywać dowolne obliczenia przestrzenne, EF 5.0 zezwala na wyrażenia LINQ, takie jak:
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();
}
W takim razie jest bardzo dobry powód, aby korzystać z geografii.
Wyjaśnienie przestrzenne w ramach Entity Framework .
Zaktualizowano za pomocą Tworzeniem przestrzennych baz danych o wysokiej wydajności
Jak zauważyłem w Odpowiedź Noela Abrahama :
Porównując typy pamięci:
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'
Wynik:
name rows data
Geo 20000 728 KB
LatLon 20000 560 KB
Typ danych geograficznych zajmuje 30% więcej miejsca.
Dodatkowo typ danych geograficznych nie ogranicza się tylko do przechowywania punktu, możesz również przechowywać Ciąg linii, Ciąg kołowy, Krzywa złożona, Wielokąt, Wielokąt krzywej, Kolekcja geometrii, MultiPoint, MultiLineString, MultiPolygon i więcej . Każda próba przechowywania nawet najprostszych typów geografii (jak szerokość/długość) poza punktem (na przykład LINESTRING(1 1, 2 2)) spowoduje nałożenie dodatkowych wierszy dla każdego punktu, kolumny do sekwencjonowania dla kolejności każdego punktu i kolejna kolumna do grupowania linii. SQL Server ma również metody dla typów danych Geography, które obejmują obliczanie Obszar, Granica, Długość, odległości i więcej .
Nierozsądne wydaje się przechowywanie szerokości i długości geograficznej w formacie dziesiętnym na serwerze SQL.
Aktualizacja 2
Jeśli planujesz wykonać jakiekolwiek obliczenia, takie jak odległość, powierzchnia itp., prawidłowe obliczenie ich na powierzchni ziemi jest trudne. Każdy typ Geography przechowywany w SQL Server jest również przechowywany z Spatial Reference ID . Te identyfikatory mogą należeć do różnych sfer (ziemia ma 4326). Oznacza to, że obliczenia w SQL Server będą faktycznie obliczane poprawnie na powierzchni ziemi (zamiast jak- wrona-leci które mogą przechodzić przez powierzchnię ziemi).