在 SQL Server 中使用纬度和经度查找两点之间的距离

Posted

技术标签:

【中文标题】在 SQL Server 中使用纬度和经度查找两点之间的距离【英文标题】:Find distance between two points using latitude and longitude in SQL Server 【发布时间】:2021-09-16 11:55:50 【问题描述】:

我一直在看这个问题,只是想知道这是否可以在 SQL Server 中完成。

Find distance between two points using latitude and longitude in mysql

这是 SQL Fiddle 中的完整答案:http://sqlfiddle.com/#!9/21e06/412/0

(英里使用 69.0 而不是 111.1111)

它按照我想要的方式工作。

我只需要它在 SQL Server Management Studio v18 中工作

更新:抱歉这个懒惰的问题

CREATE TABLE #city
    (id int, city int, Latitude float, Longitude float)
;
    
INSERT INTO #city
    (id, city, Latitude, Longitude)
VALUES
    (1, 3, 34.44444, 84.3434),
    (2, 4, 42.4666667, 1.4666667),
    (3, 5, 32.534167, 66.078056),
    (4, 6, 36.948889, 66.328611),
    (5, 7, 35.088056, 69.046389),
    (6, 8, 36.083056, 69.0525),
    (7, 9, 31.015833, 61.860278)
;


SELECT a.city AS from_city, b.city AS to_city, 
   --111.1111 *
   -- DEGREES(ACOS(LEAST(1.0, COS(RADIANS(a.Latitude))
   --      * COS(RADIANS(b.Latitude))
   --      * COS(RADIANS(a.Longitude) - RADIANS(b.Longitude))
   --      + SIN(RADIANS(a.Latitude))
   --      * SIN(RADIANS(b.Latitude))))) AS distance_in_km
   SQRT(POWER(69.1 * ( a.Latitude - b.Latitude),  
2) + POWER(69.1 * ( b.Longitude  
- a.Latitude )  
* COS(a.Latitude / 57.3), 2))  
  FROM #city AS a
  JOIN #city AS b ON a.id <> b.id
 WHERE a.city = 3 AND b.city = 7

 DECLARE @sourceLatitude FLOAT = 31.015833;  
DECLARE @sourceLongitude FLOAT = 61.860278;  
DECLARE @destinationLatitude FLOAT = 32.534167;  
DECLARE @destinationLongitude FLOAT = 66.078056;  
DECLARE @Location FLOAT  
SET @Location = SQRT(POWER(69.1 * ( @destinationLatitude - @sourceLatitude),  
2) + POWER(69.1 * ( @sourceLongitude  
- @destinationLongitude )  
* COS(@destinationLatitude / 57.3), 2))  
PRINT @Location 

两种方法我都试过了 第一种方式 LEAST 在 SSMS 中不起作用 第二种方法是在我尝试最后一段代码以及在我的 sql 中运行它时给出不同的答案

【问题讨论】:

SQL Server Management Studio 是用于连接 SQL Server 的客户端。对于距离计算,请查看空间类型 docs.microsoft.com/en-us/sql/t-sql/spatial-geography/… 以上内容适用于任何支持您正在使用的 SQL Server 版本以及该版本支持空间数据的 SSMS。 SSMS 18 支持 SQL Server 2008-2019,当然 2012+ 都支持空间查询。但是,我不记得 SQL Server 2008 已经完全不受支持了 2 年多了,所以你不应该使用它。 TL;DR:以上内容可能已经在 SSMS18 中有效。 (我看不到 SQL,因为您将其发布在站点外,而不是在您的问题中,并且我无法访问该站点。) @DougCoats 你知道“我没有费心研究”不是一个有效的关闭理由,对吧?这(通常)是拒绝投票的理由,但不是关闭的理由。 @larnu 好的,自从我上次阅读指南以来,指南发生了很大变化。他们过去比较僵硬。所以我的坏 我不认为它曾经是一个接近投票的理由,@DougCoats。 Meta Stack Overflow 上的某个地方可能有关于它的问题。 【参考方案1】:
drop table #city
CREATE TABLE #city
    (id int, city int, Latitude float, Longitude float)
;
    
INSERT INTO #city
    (id, city, Latitude, Longitude)
VALUES
    (1, 3, 34.44444, 84.3434),
    (2, 4, 42.4666667, 1.4666667),
    (3, 5, 32.534167, 66.078056),
    (4, 6, 36.948889, 66.328611),
    (5, 7, 35.088056, 69.046389),
    (6, 8, 36.083056, 69.0525),
    (7, 9, 31.015833, 61.860278)
;


SELECT a.city AS from_city, b.city AS to_city, 
   SQRT(POWER(69.0 * ( a.Latitude - b.Latitude),2) 
   + POWER(69.0 * ( b.Longitude  - a.Longitude )  
   * COS(a.Latitude / 57.3), 2))  as Miles
  FROM #city AS a
  JOIN #city AS b ON a.id <> b.id
 WHERE a.city = 3 AND b.city = 7drop table #city
CREATE TABLE #city
    (id int, city int, Latitude float, Longitude float)
;
    
INSERT INTO #city
    (id, city, Latitude, Longitude)
VALUES
    (1, 3, 34.44444, 84.3434),
    (2, 4, 42.4666667, 1.4666667),
    (3, 5, 32.534167, 66.078056),
    (4, 6, 36.948889, 66.328611),
    (5, 7, 35.088056, 69.046389),
    (6, 8, 36.083056, 69.0525),
    (7, 9, 31.015833, 61.860278)
;


SELECT a.city AS from_city, b.city AS to_city, 
   SQRT(POWER(69.0 * ( a.Latitude - b.Latitude),2) 
   + POWER(69.0 * ( b.Longitude  - a.Longitude )  
   * COS(a.Latitude / 57.3), 2))  as Miles
  FROM #city AS a
  JOIN #city AS b ON a.id <> b.id
 WHERE a.city = 3 AND b.city = 7

让它工作,哈哈,谢谢 Doug 和 lanru

【讨论】:

以上是关于在 SQL Server 中使用纬度和经度查找两点之间的距离的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中查找多边形内/最近的纬度/经度

sql server2008根据经纬度计算两点之间的距离

使用纬度和经度返回 SQL Server 2008 中两个位置之间的距离

用于查找使用纬度和经度之间的距离的Sql返回错误的距离

查找两个经度纬度之间的距离-Mysql

在 SQL Server 数据库中平均纬度/经度