当前位置: 首页 > 面试题库 >

Haversine公式使用SQL Server查找最接近的场所-vb.net

宇文鸣
2023-03-14
问题内容

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

SELECT lng, lat from postcodeLngLat WHERE postcode = 'CV1'

我还有另一张桌子,上面存放着一些场馆的家具。

SELECT v.lat, v.lng, v.name, p.lat, p.lng, p.postcode, 'HAVERSINE' AS distance FROM venuepostcodes v, postcodeLngLat p WHERE p.outcode = 'CB6' ORDER BY distance

我要尝试做的是创建一个数据网格,该数据网格显示每个场所与邮政编码(在本例中为CV1)之间的距离。我知道Haversine公式应该可以达到我想要达到的目的,但是我不知道该从哪里开始将其合并到查询中。我认为公式需要转到我'HAVERSINE'在上面的查询中输入的位置。

有任何想法吗?

编辑

SELECT o.outcode AS lead_postcode, v.venue_name, 6371.0E * ( 2.0E *asin(case when 1.0E < (sqrt(square(sin(((RADIANS(CAST(o.lat AS FLOAT)))-(RADIANS(CAST(v.lat AS FLOAT))))/2.0E)) + (cos(RADIANS(CAST(v.lat AS FLOAT))) * cos(RADIANS(CAST(o.lat AS FLOAT))) * square(sin(((RADIANS(CAST(o.lng AS FLOAT)))-(RADIANS(CAST(v.lng AS FLOAT))))/2.0E))))) then 1.0E else (sqrt(square(sin(((RADIANS(CAST(o.lat AS FLOAT)))-(RADIANS(CAST(v.lat AS FLOAT))))/2.0E)) + (cos(RADIANS(CAST(v.lat AS FLOAT))) * cos(RADIANS(CAST(o.lat AS FLOAT))) * square(sin(((RADIANS(CAST(o.lng AS FLOAT)))-(RADIANS(CAST(v.lng AS FLOAT))))/2.0E))))) end )) AS distance FROM venuepostcodes v, outcodepostcodes o WHERE o.outcode = 'CB6' ORDER BY distance


问题答案:

我认为您最好将其放入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


 类似资料:
  • 问题内容: 我正在尝试使用Haversine距离公式但是我无法使用它,请参见以下代码 错误是: 我知道这是因为它需要执行以下操作: 但是,当我将此放在函数下方时,它仍然返回相同的错误消息。如何使用助手方法?还是有其他方法可以对此进行编码?谢谢! 问题答案: 此代码有效:

  • 问题内容: 我正在寻找一种借助Elasticsearch查找最近价格/数量的可能性。问题是我没有范围。我要实现的是,结果按最近距离排序。根据示例搜索查询,我的索引包含3个具有以下价格(数字)的文档:45、27、32 给定数字与我的搜索值29的“距离”为45-29 = 16 | 27-29 = -2 | 32-29 = 3,所以我希望搜索结果是按“距离”评分的,该数字距离给定价格不远。 搜索查询示例

  • 问题内容: 我想将此公式与php一起使用。我有一个保存了纬度和经度值的数据库。 我想在输入中具有一定的经度和纬度值的情况下,找到从该点到数据库中每个点的所有距离(以km为单位)。为此,我在googlemaps api上使用了公式: 当然在php中使用该值,我用radians替换了。值37,-122是我的input值,而lat,lng是我在数据库中的值。 下面是我的代码。问题是出了点问题,但我不明白

  • 问题内容: 给定一个类的集合,找到最近的公共超类的最佳方法是什么? 例如,鉴于以下情况: 我期望以下内容(并非详尽无遗): 我想我最终可以解决这个问题,但是肯定有人已经解决了诸如类型推断中的问题。谁能指出我的算法,或者更好的是一些现有的实用程序代码? ETA: 我了解反射API。我正在寻找的算法(或这种算法的实现)。 ETA: 我知道这是DAG。谢谢。你很聪明 ETA: 关于拓扑排序(有关EJP的

  • 我来问一个我觉得以前没有人问过的问题,可能会得到一些有趣的答案:) 我目前正在研究一些Java代码,其目标是: 接收

  • 问题内容: 我试图找到没有jquery的具有特定标签名称的最接近的元素。当我单击a时,我想访问该表的。有什么建议吗?我读过有关偏移量的信息,但并不太了解。我应该只使用: 假设已经设置了单击元素 问题答案: 参加聚会的时间很少(非常),但是仍然如此。这应该做的伎俩: