Prendo spunto dal mio post precedente per capire quanto sarò distante da casa mia...
Come sapete una delle novità più interessanti di SQL Server 2008 sono i nuovi tipi spaziali.
Vediamo, allora, come potrei utilizzare questo nuovo data type per rispondere alla mia domanda!
/* *** inizio script *** */
/* utilizzo tempdb */
use tempdb
go
/* creo la tabella in cui memorizzare le coordinate geografiche delle località che mi interessano */
create table map
(
idRecord tinyint primary key identity(1,1),
location geography,
name varchar(35)
)
go
/* inserisco le coordinate */
insert map (location, name)
values ( geography::STGeomFromText('POINT(45.50800 10.14502)', 4619) , 'Castel Mella (BS)' )
insert map (location, name)
values ( geography::STGeomFromText('POINT(47.67413 -122.10938)', 4619) , 'Redmond, WA' )
/* vedo i dati */
select
*,
location.ToString() as string,
location.Lat as Latitudine,
location.Long as Longitudine
from map
/* calcolo la distanza */
declare @g geography
set @g = (select location from map where name = 'Castel Mella (BS)')
select location.STDistance(@g) / 1000 as [Distanza KM]
from map
where name = 'Redmond, WA'
/* faccio pulizia */
drop table map
go
/* *** fine script *** */
La distanza è pari a 8683,39 Km.
Lo stesso calcolo, date le longitudini e le latitudini, era possibile farlo anche prima con questa (sicuramente non semplicissima) formula:
declare @lat1 float = 45.50788077512828
declare @lat2 float = 47.64359090020492
declare @lon1 float = 10.145101547241211
declare @lon2 float = -122.13053584098816
set @lat2 = radians(@lat2)
set @lon1 = radians(@lon1)
set @lat1 = radians(@lat1)
set @lon2 = radians(@lon2)
select
(2.0 * atn2(sqrt( (square(sin( (@lat1 - @lat2) /2.0))) + cos(@lat2) * cos(@lat1) * (square(sin( (@lon2 - @lon1) /2.0))) ),
sqrt(1.0- ( (square(sin( (@lat1 - @lat2) /2.0))) + cos(@lat2) * cos(@lat1) * (square(sin( (@lon2 - @lon1) /2.0))) ) )))*3956.0
* 1.609 as [Distanza Km]
Preferisco di gran lunga il nuovo tipo! :-)