Haversine formula using SQL server to find closest venue - vb.net

后端 未结 2 2003
孤城傲影
孤城傲影 2021-01-03 10:23

I am grabbing a postcode from a form. I can then convert this postcode to lng,lat coordinates as I have these stored in a table.

SELECT lng, lat from postcodeL

相关标签:
2条回答
  • 2021-01-03 10:32

    I think you'd do best putting it in a UDF and using that in your query:

    SELECT v.lat, v.lng, v.name, p.lat, p.lng, p.postcode, udf_Haversine(v.lat, v.lng, p.lat, p.lng) AS distance FROM venuepostcodes v, postcodeLngLat p WHERE p.outcode = 'CB6' ORDER BY distance
    
    create function dbo.udf_Haversine(@lat1 float, @long1 float, @lat2 float, @long2 float) returns float begin
            declare @dlon float, @dlat float, @rlat1 float, @rlat2 float, @rlong1 float, @rlong2 float, @a float, @c float, @R float, @d float, @DtoR float
    
            select @DtoR = 0.017453293
            select @R = 3937 --3976
    
            select 
                @rlat1 = @lat1 * @DtoR,
                @rlong1 = @long1 * @DtoR,
                @rlat2 = @lat2 * @DtoR,
                @rlong2 = @long2 * @DtoR
    
            select 
                @dlon = @rlong1 - @rlong2,
                @dlat = @rlat1 - @rlat2
    
            select @a = power(sin(@dlat/2), 2) + cos(@rlat1) * cos(@rlat2) * power(sin(@dlon/2), 2)
            select @c = 2 * atn2(sqrt(@a), sqrt(1-@a))
            select @d = @R * @c
    
            return @d 
        end
    
    0 讨论(0)
  • 2021-01-03 10:49

    Alternatively uou could also use SQL Server 2008 geography datatypes. If you currently store the longitude/latitide as varchar() in the DB, you will have to store them as geograpghy datatype and then use a function like STIntersects() to get the distance.

    0 讨论(0)
提交回复
热议问题