使用SQL server查找最近地点的Haversine公式-vb.net

使用SQL server查找最近地点的Haversine公式-vb.net,sql,sql-server,haversine,Sql,Sql Server,Haversine,我正在从一张表格中抓取一个邮政编码。然后我可以将这个邮政编码转换为lng,lat坐标,因为我将这些坐标存储在一个表中 从postcodeLngLat中选择lng、lat,其中postcode='CV1' 我还有另一张桌子,上面存放着一些场地的液化天然气和lat 选择v.lat、v.lng、v.name、p.lat、p.lng、p.postcode“HAVERSINE”作为与Venue邮政编码v、postcodeLngLat p的距离,其中p.outcode='CB6'按距离排序 我想做的是创建一

我正在从一张表格中抓取一个邮政编码。然后我可以将这个邮政编码转换为lng,lat坐标,因为我将这些坐标存储在一个表中

从postcodeLngLat中选择lng、lat,其中postcode='CV1'

我还有另一张桌子,上面存放着一些场地的液化天然气和lat

选择v.lat、v.lng、v.name、p.lat、p.lng、p.postcode“HAVERSINE”作为与Venue邮政编码v、postcodeLngLat p的距离,其中p.outcode='CB6'按距离排序

我想做的是创建一个数据网格,显示每个场馆与邮政编码之间的距离(本例中为CV1)。我知道哈弗森公式应该达到我想要达到的效果,但我不知道应该从哪里开始将它纳入我的查询中。我认为这个公式需要用到我在上面的查询中放置的
'HAVERSINE'

有什么想法吗

编辑


选择o.outcode作为lead_邮政编码,v.venue_名称,6371.0E*(2.0E*asin(1.0E时的情况)<(sqrt(sin)((弧度(铸造(o.lat AS FLOAT))-(弧度(铸造(v.lat AS FLOAT)))/2.0E+(cos(弧度(铸造(铸造(v.lat AS FLOAT))))*cos(铸造(铸造(o.lat AS FLOAT))*sin))方形(sin)((弧度(铸造(铸造(o.lng AS FLOAT)))/2.0E))弧度)然后1.0E其他(平方(正弦)(弧度(铸造(铸造(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)弧度(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(铸造)(,outcodepostcodes o其中o.outcode='CB6'按距离排序

我认为您最好将其放入UDF并在查询中使用:

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

或者,uou也可以使用SQL Server 2008地理数据类型。如果当前将经度/纬度作为varchar()存储在数据库中,则必须将其存储为Geography数据类型,然后使用类似StinerSects()的函数来获取距离。

是否可以将其插入.net页面上的.vb文件中,还是需要将该函数放在其他位置?-加上“float”位是关于什么的?这里写的函数是一个SQL Server用户定义的函数。您可以将其转换为vb,但随后必须将所有数据带回“客户端”进行计算。使用SQL UDF,您可以选择最接近的前10个,并且只将这10个的数据发送到“client”@Tom-我想David是说在SQL Server中创建一个函数。自定义项->用户定义的功能。()另外,我刚刚注意到@R附近的评论,可能想验证那里的哈弗森公式是100%正确的。好的,我接受你的观点,这肯定是正确的。不过,我确实使用添加到原始问题中的以下代码重新创建了此函数。。。谢谢