Pokud plánujete provádět jakýkoli prostorový výpočet, EF 5.0 umožňuje výrazy LINQ jako:
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();
}
Pak je tu velmi dobrý důvod, proč používat geografii.
Vysvětlení prostoru v rámci Entity Framework .
Aktualizováno pomocí Vytváření vysoce výkonných prostorových databází
Jak jsem poznamenal na odpověď Noela Abrahamse :
Takže porovnání typů úložiště:
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'
Výsledek:
name rows data
Geo 20000 728 KB
LatLon 20000 560 KB
Geografický datový typ zabírá o 30 % více místa.
Navíc geografický datový typ není omezen pouze na uložení bodu, můžete také uložit LineString, CircularString, CompoundCurve, Polygon, CurvePolygon, GeometryCollection, MultiPoint, MultiLineString a MultiPolygon a další . Jakýkoli pokus o uložení i těch nejjednodušších typů geografie (jako zeměpisná šířka/délka) za bod (například instance LINESTRING(1 1, 2 2)) způsobí další řádky pro každý bod, sloupec pro řazení pro pořadí každého bodu. a další sloupec pro seskupení řádků. SQL Server má také metody pro datové typy Geography, které zahrnují výpočet Area, Boundary, Délka, Vzdálenosti a další .
Zdá se nerozumné ukládat zeměpisnou šířku a délku jako desítkové na serveru SQL.
Aktualizace 2
Pokud plánujete provádět jakékoli výpočty, jako je vzdálenost, plocha atd., je obtížné je správně vypočítat na povrchu Země. Každý typ geografie uložený na serveru SQL je také uložen s ID prostorového odkazu . Tato ID mohou být z různých sfér (země je 4326). To znamená, že výpočty v SQL Serveru budou skutečně správně počítat na povrchu Země (místo as- vrana-mouchy který by mohl být skrz povrch země).