andrew4582

Maps Calculations SQL

Jun 15th, 2011
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 4.78 KB | None | 0 0
  1.  
  2.  
  3. /****** Object:  UserDefinedFunction [dbo].[Map_CalculateDistance]    Script Date: 06/15/2011 13:13:20 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6.  
  7. SET QUOTED_IDENTIFIER ON
  8. GO
  9.  
  10.  
  11.  
  12. CREATE FUNCTION [dbo].[Map_CalculateDistance]
  13. (
  14.     @Latitude1 float,
  15.     @Longitude1 float,
  16.     @Latitude2 float,
  17.     @Longitude2 float,
  18.     @Units NVARCHAR(10)
  19. )
  20. RETURNS float
  21. AS
  22. BEGIN
  23.     SET @Latitude1 = RADIANS(@Latitude1)
  24.     SET @Longitude1 = RADIANS(@Longitude1)
  25.     SET @Latitude2 = RADIANS(@Latitude2)
  26.     SET @Longitude2 = RADIANS(@Longitude2)
  27.     DECLARE @R float, @dlon float, @dlat float, @a float, @c float
  28.  
  29.     SELECT @R = CASE
  30.         WHEN UPPER(LEFT(@Units, 1)) = 'M' THEN 3956.3
  31.         WHEN UPPER(LEFT(@Units, 1)) = 'N' THEN 3437.7
  32.         WHEN UPPER(LEFT(@Units, 1)) = 'K' THEN 6367.0
  33.     END
  34.  
  35.     SET @dlon = @Longitude2 - @Longitude1
  36.     SET @dlat = @Latitude2 - @Latitude1
  37.     SET @a = POWER(SIN(@dlat / 2.0), 2.0) +
  38.         COS(@Latitude1) * COS(@Latitude2) * POWER(SIN(@dlon / 2.0), 2.0)
  39.     SET @c = 2.0 * ATN2(SQRT(@a), SQRT(1.0 - @a))
  40.  
  41.     RETURN (@R * @c)
  42.  
  43. END
  44.  
  45.  
  46. GO
  47.  
  48. /****** Object:  UserDefinedFunction [dbo].[Map_DistanceBetweenPoints]    Script Date: 06/15/2011 13:13:20 ******/
  49. SET ANSI_NULLS ON
  50. GO
  51.  
  52. SET QUOTED_IDENTIFIER ON
  53. GO
  54.  
  55.  
  56. CREATE function [dbo].[Map_DistanceBetweenPoints]
  57. (
  58.     @Latitude1 float,
  59.     @Longitude1 float,
  60.     @Latitude2 float,
  61.     @Longitude2 float,
  62.     @Units NVARCHAR(10)
  63. )
  64. RETURNS float
  65. AS
  66. BEGIN
  67.     SET @Latitude1 = RADIANS(@Latitude1)
  68.     SET @Longitude1 = RADIANS(@Longitude1)
  69.     SET @Latitude2 = RADIANS(@Latitude2)
  70.     SET @Longitude2 = RADIANS(@Longitude2)
  71.     DECLARE @R float, @dlon float, @dlat float, @a float, @c float
  72.  
  73.     SELECT @R = CASE
  74.         WHEN UPPER(LEFT(@Units, 1)) = 'M' THEN 3956.3
  75.         WHEN UPPER(LEFT(@Units, 1)) = 'N' THEN 3437.7
  76.         WHEN UPPER(LEFT(@Units, 1)) = 'K' THEN 6367.0
  77.     END
  78.  
  79.     SET @dlon = @Longitude2 - @Longitude1
  80.     SET @dlat = @Latitude2 - @Latitude1
  81.     SET @a = POWER(SIN(@dlat / 2.0), 2.0) +
  82.         COS(@Latitude1) * COS(@Latitude2) * POWER(SIN(@dlon / 2.0), 2.0)
  83.     SET @c = 2.0 * ATN2(SQRT(@a), SQRT(1.0 - @a))
  84.  
  85.     RETURN (@R * @c)
  86.  
  87. END
  88.  
  89. GO
  90.  
  91. /****** Object:  UserDefinedFunction [dbo].[Map_LatFromDistanceBearing]    Script Date: 06/15/2011 13:13:20 ******/
  92. SET ANSI_NULLS ON
  93. GO
  94.  
  95. SET QUOTED_IDENTIFIER ON
  96. GO
  97.  
  98.  
  99. CREATE function [dbo].[Map_LatFromDistanceBearing](@lat1 float, @lon1 float, @bearing float, @distance float, @type nvarchar(10))
  100. returns float
  101. AS
  102. BEGIN
  103. declare @d float
  104. declare @lat2 float
  105. declare @lon2 float
  106. declare @brng float
  107. declare @R float
  108.  
  109. set @d = @distance
  110. set @brng= @bearing
  111.  
  112. set @lat1 = @lat1 * pi() /180
  113. set @lon1 = @lon1 * pi() / 180
  114. set @brng = @brng * pi() / 180
  115.  
  116. set @R = 6371.0
  117. if LEFT(UPPER(@type),1)='M'
  118.     set @R = 3956.0
  119.  
  120. set @d = @d/@R
  121.  
  122. set @lat2 = @lat1 + @d*cos(@brng)
  123.  
  124. declare @dPhi float
  125. declare @q float
  126. set @dPhi = log(tan(@lat2/2+pi()/4)/tan(@lat1/2+pi()/4))
  127. if @dPhi != 0
  128.     set @q = (@lat2-@lat1)/@dPhi
  129.  
  130. --IS FINITE??
  131. if (isnumeric(@q)=0)
  132.     set @q = cos(@lat1)
  133. declare @dLon float
  134. set @dLon = @d*sin(@brng)/@q
  135.  
  136. --BEYOND POLE??
  137. if (abs(@lat2) > pi()/2)
  138.     if @lat2 > 0
  139.         set @lat2 = pi() - @lat2
  140.     else
  141.         set @lat2 = -1*pi() - @lat2
  142. --set @lon2 = (@lon1+@dLon+pi())%(2*pi())-pi()
  143.  
  144. declare @a float
  145. declare @b float
  146. set @a = (@lon1+@dLon+pi())
  147. set @b = 2*pi()
  148. declare @result int
  149. set @result = @a/@b
  150. set @lon2 = @a-cast(@result as float)*@b
  151. set @lon2 = @lon2-pi()
  152. set @lat2 = 180 *@lat2 / pi()
  153. set @lon2 = 180 *@lon2 / pi()
  154. return @lat2
  155. END
  156.  
  157. GO
  158.  
  159. /****** Object:  UserDefinedFunction [dbo].[Map_LonFromDistanceBearing]    Script Date: 06/15/2011 13:13:20 ******/
  160. SET ANSI_NULLS ON
  161. GO
  162.  
  163. SET QUOTED_IDENTIFIER ON
  164. GO
  165.  
  166.  
  167. CREATE function [dbo].[Map_LonFromDistanceBearing](@lat1 float, @lon1 float, @bearing float, @distance float, @type nvarchar(10))
  168. returns float
  169. AS
  170. BEGIN
  171. declare @d float
  172. declare @lat2 float
  173. declare @lon2 float
  174. declare @brng float
  175. declare @R float
  176.  
  177. set @d = @distance
  178. set @brng= @bearing
  179.  
  180. set @lat1 = @lat1 * pi() /180
  181. set @lon1 = @lon1 * pi() / 180
  182. set @brng = @brng * pi() / 180
  183.  
  184. set @R = 6371.0
  185. if LEFT(UPPER(@type),1)='M'
  186.     set @R = 3956.0
  187.  
  188. set @d = @d/@R
  189.  
  190. set @lat2 = @lat1 + @d*cos(@brng)
  191.  
  192. declare @dPhi float
  193. declare @q float
  194. set @dPhi = log(tan(@lat2/2+pi()/4)/tan(@lat1/2+pi()/4))
  195. if @dPhi != 0
  196.     set @q = (@lat2-@lat1)/@dPhi
  197.  
  198. --IS FINITE??
  199. if (isnumeric(@q)=0)
  200.     set @q = cos(@lat1)
  201. declare @dLon float
  202. set @dLon = @d*sin(@brng)/@q
  203.  
  204. --BEYOND POLE??
  205. if (abs(@lat2) > pi()/2)
  206.     if @lat2 > 0
  207.         set @lat2 = pi() - @lat2
  208.     else
  209.         set @lat2 = -1*pi() - @lat2
  210. --set @lon2 = (@lon1+@dLon+pi())%(2*pi())-pi()
  211.  
  212. declare @a float
  213. declare @b float
  214. set @a = (@lon1+@dLon+pi())
  215. set @b = 2*pi()
  216. declare @result int
  217. set @result = @a/@b
  218. set @lon2 = @a-cast(@result as float)*@b
  219. set @lon2 = @lon2-pi()
  220. set @lat2 = 180 *@lat2 / pi()
  221. set @lon2 = 180 *@lon2 / pi()
  222. return @lon2
  223. END
  224.  
  225. GO
Advertisement
Add Comment
Please, Sign In to add comment