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

Ottieni punti spaziali nel raggio usando NHibernate Spatial

ciò accade a causa della differenza tra il tipo di dati geografico e il tipo di dati geometrico.

Spiegato meglio con un esempio.

declare @point1 as geography
declare @point2 as geography

set @point1 = geography::STGeomFromText('POINT (7 1)', 4326)
set @point2 = geography::STGeomFromText('POINT (7 3)', 4326)
select @point1.STDistance(@point2)

declare @point3 as geometry
declare @point4 as geometry

set @point3 = geometry::STGeomFromText('POINT (7 1)', 4326)
set @point4 = geometry::STGeomFromText('POINT (7 3)', 4326)
select @point3.STDistance(@point4)

Se lo esegui direttamente in SQL Server Management Studio, ottieni 221151.479533501 nel primo risultato e 2 nel secondo.

Ciò è fondamentalmente dovuto al fatto che nel tipo di dati geografici l'unità viene scelta in base allo SRID fornito. Nel tuo caso, essendo 4326, è in metri. Quindi, stai chiedendo la distanza, in metri, tra le coordinate (lon:7; lat:1) e (lon:7; lat:3). Si ritorna a circa 221 Km.

Quando si utilizza il tipo di geometria (secondo esempio), è una proiezione planare in cui la distanza funziona come ci si aspetterebbe, restituendo così 2.

Per quanto riguarda il tuo codice NH Spatial, sembra ok. Basta fornire il parametro maxDistance in metri e dovresti essere a posto.