使用SQL server查找最近地点的Haversine公式-vb.net
我正在从一张表格中抓取一个邮政编码。然后我可以将这个邮政编码转换为lng,lat坐标,因为我将这些坐标存储在一个表中使用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'按距离排序 我想做的是创建一
从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%正确的。好的,我接受你的观点,这肯定是正确的。不过,我确实使用添加到原始问题中的以下代码重新创建了此函数。。。谢谢