[SQL 2008] Geography e distanze

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 *** */

image

La distanza è pari a 8683,39 Km.

image

 

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! :-)

Published venerdì 14 marzo 2008 1.17 by abenedetti

Comments

# Recent URLs tagged Latitudine - Urlrecorder

giovedì 4 settembre 2008 8.15 by Recent URLs tagged Latitudine - Urlrecorder

Pingback from  Recent URLs tagged Latitudine - Urlrecorder

# User links about "latitudine" on iLinkShare

domenica 28 settembre 2008 23.48 by User links about "latitudine" on iLinkShare

Pingback from  User links about "latitudine" on iLinkShare

# [SQL 2008] Geography

sabato 11 ottobre 2008 16.00 by Il blog di Andrea Benedetti

Se foste capitati su mio vecchio post   sul tipo geografico di SQL Server 2008, e aveste provato