Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Perché usare il tipo di dati geografico di SQL Server 2008?

Se prevedi di eseguire qualsiasi calcolo spaziale, EF 5.0 consente espressioni LINQ come:

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();
}

Poi c'è un ottimo motivo per usare Geography.

Spiegazione dello spazio all'interno di Entity Framework .

Aggiornato con Creazione di database spaziali ad alte prestazioni

Come ho notato su Noel Abrahams Answer :

Quindi confrontando i tipi di archiviazione:

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'

Risultato:

name    rows    data     
Geo     20000   728 KB   
LatLon  20000   560 KB

Il tipo di dati geografico occupa il 30% di spazio in più.

Inoltre, il tipo di dati geografico non si limita alla sola memorizzazione di un punto, ma puoi anche archiviare LineString, CircularString, CompoundCurve, Polygon, CurvePolygon, GeometryCollection, MultiPoint, MultiLineString e MultiPolygon e altro . Qualsiasi tentativo di memorizzare anche il più semplice dei tipi di geografia (come Lat/Long) oltre un punto (ad esempio LINESTRING(1 1, 2 2) istanza) comporterà righe aggiuntive per ogni punto, una colonna per la sequenza per l'ordine di ogni punto e un'altra colonna per il raggruppamento delle righe. SQL Server dispone anche di metodi per i tipi di dati Geography che includono il calcolo di Area, Boundary, Lunghezza, Distanze e altro .

Non sembra saggio memorizzare latitudine e longitudine come decimali in SQL Server.

Aggiornamento 2

Se hai intenzione di fare calcoli come distanza, area, ecc, calcolarli correttamente sulla superficie della terra è difficile. Ciascun tipo di geografia archiviato in SQL Server viene inoltre archiviato con un ID di riferimento spaziale . Questi ID possono essere di sfere diverse (la terra è 4326). Ciò significa che i calcoli in SQL Server verranno effettivamente calcolati correttamente sulla superficie terrestre (invece di as- le mosche del corvo che potrebbe essere attraverso la superficie della terra).