Why use the SQL Server 2008 geography data type?

前端 未结 3 901
旧巷少年郎
旧巷少年郎 2021-01-29 18:04

I am redesigning a customer database and one of the new pieces of information I would like to store along with the standard address fields (Street, City, etc.) is the geographic

3条回答
  •  深忆病人
    2021-01-29 18:38

        CREATE FUNCTION [dbo].[fn_GreatCircleDistance]
    (@Latitude1 As Decimal(38, 19), @Longitude1 As Decimal(38, 19), 
                @Latitude2 As Decimal(38, 19), @Longitude2 As Decimal(38, 19), 
                @ValuesAsDecimalDegrees As bit = 1, 
                @ResultAsMiles As bit = 0)
    RETURNS decimal(38,19)
    AS
    BEGIN
        -- Declare the return variable here
        DECLARE @ResultVar  decimal(38,19)
    
        -- Add the T-SQL statements to compute the return value here
    /*
    Credit for conversion algorithm to Chip Pearson
    Web Page: www.cpearson.com/excel/latlong.aspx
    Email: chip@cpearson.com
    Phone: (816) 214-6957 USA Central Time (-6:00 UTC)
    Between 9:00 AM and 7:00 PM
    
    Ported to Transact SQL by Paul Burrows BCIS
    */
    DECLARE  @C_RADIUS_EARTH_KM As Decimal(38, 19)
    SET @C_RADIUS_EARTH_KM = 6370.97327862
    DECLARE  @C_RADIUS_EARTH_MI As Decimal(38, 19)
    SET @C_RADIUS_EARTH_MI = 3958.73926185
    DECLARE  @C_PI As Decimal(38, 19)
    SET @C_PI =  pi()
    
    DECLARE @Lat1 As Decimal(38, 19)
    DECLARE @Lat2 As Decimal(38, 19)
    DECLARE @Long1 As Decimal(38, 19)
    DECLARE @Long2 As Decimal(38, 19)
    DECLARE @X As bigint
    DECLARE @Delta As Decimal(38, 19)
    
    If @ValuesAsDecimalDegrees = 1 
    Begin
        set @X = 1
    END
    Else
    Begin
        set @X = 24
    End 
    
    -- convert to decimal degrees
    set @Lat1 = @Latitude1 * @X
    set @Long1 = @Longitude1 * @X
    set @Lat2 = @Latitude2 * @X
    set @Long2 = @Longitude2 * @X
    
    -- convert to radians: radians = (degrees/180) * PI
    set @Lat1 = (@Lat1 / 180) * @C_PI
    set @Lat2 = (@Lat2 / 180) * @C_PI
    set @Long1 = (@Long1 / 180) * @C_PI
    set @Long2 = (@Long2 / 180) * @C_PI
    
    -- get the central spherical angle
    set @Delta = ((2 * ASin(Sqrt((power(Sin((@Lat1 - @Lat2) / 2) ,2)) + 
        Cos(@Lat1) * Cos(@Lat2) * (power(Sin((@Long1 - @Long2) / 2) ,2))))))
    
    If @ResultAsMiles = 1 
    Begin
        set @ResultVar = @Delta * @C_RADIUS_EARTH_MI
    End
    Else
    Begin
        set @ResultVar = @Delta * @C_RADIUS_EARTH_KM
    End
    
        -- Return the result of the function
        RETURN @ResultVar
    
    END
    

提交回复
热议问题