如何使用经度和纬度查找两点之间的距离

时间:2020-08-23 13:05:04

标签: sql sqlite

我有一个ROUTES表,其中包含SOURCE_AIRPORT和DESTINATION_AIRPORT列,并描述了飞机从一架飞机到另一架飞机要走的特定路线。

我有一个AIRPORTS表,其中包含描述机场地理位置的LATITUDE和LONGITUDE列。

我可以使用两列共享这两个表,它们在路线表中共享为SOURCE_AIRPORT_ID和DESTINATION_AIRPORT_ID,在机场表中共享为IATA(3个字母的代码,代表伦敦希思罗机场的LHR之类的机场)。

我的问题是,如何使用所有这些信息编写SQL查询,以查找例如从特定机场(如LHR)出来的最长路线?

我相信我必须将两个表合并起来,对于源机场为LHR的航线表中的每一行,请查看目标机场的纬度和经度,计算距LHR的距离,将其另存为字段,称为“距离”,然后按最高距离对数据进行排序。但是就SQL语法而言,我很茫然。

3 个答案:

答案 0 :(得分:0)

对于Mathematics Stack Exchange,这可能是一个更好的问题,但我将在此处提供一些见解。如果您不太熟悉三角函数,请确保使用以下资源https://en.m.wikipedia.org/wiki/Haversine_formula,您可以理解该实现。您正在尝试根据球体表面上两个点之间的距离来计算它们之间的距离(不是直线,您不能穿越地球)。

页面显示以下公式: https://wikimedia.org/api/rest_v1/media/math/render/svg/a65dbbde43ff45bacd2505fcf32b44fc7dcd8cc0

哪里
•φ1,φ2是点1的纬度和点2的纬度(以弧度为单位),
•λ1,λ2是点1的经度和点2的经度(以弧度为单位)。

如果数据以度为单位,则只需乘以pi / 180即可将其转换为弧度

答案 1 :(得分:0)

有一个名为大圆距离的公式可以计算两点之间的距离。您可能可以将其作为操作系统的库进行加载。忘掉haversine,我们的星球不是一个完美的领域。 如果您经常使用此值,请将其保存在{%}表中。

答案 2 :(得分:0)

就解决方法而言,我认为您大约占90%。我将添加一些其他有关潜在SQL查询的详细信息,以获取答案。因此,您需要执行2个步骤来计算距离-步骤1是创建一个包含将ROUTES表连接到AIRPORTS表的表,以获取路线上SOURCE_AIRPORT和DESTINATION_AIRPORT的纬度/经度。这可能看起来像这样:

SELECT t1.*, CONVERT(FLOAT, t2.LATITUDE) AS SOURCE_LAT, CONVERT(FLOAT, t2.LONGITUDE) AS SOURCE_LONG, CONVERT(FLOAT, t3.LATITUDE) AS DEST_LAT, CONVERT(FLOAT, t3.LONGITUDE) AS DEST_LONG, 0.00 AS DISTANCE_CALC
INTO ROUTE_CALCULATIONS 
FROM ROUTES t1 LEFT OUTER JOIN AIRPORTS t2 ON t1.SOURCE_AIRPORT_ID = t2.IATA 
               LEFT OUTER JOIN AIRPORTS t3 ON t1.DESTINATION_AIRPORT_ID = t3.IATA;

结果输出应创建一个名为ROUTE_CALCULATIONS的新表,该表由所有ROUTES列,SOURCE和DESTINATION机场的经度/纬度以及值为0的占位符DISTANCE_CALC列组成。

步骤2正在计算距离。这应该是一个相对简单的计算和更新。

UPDATE ROUTE_CALCULATIONS 
SET DISTANCE_CALC = 2 * 3961 * asin(sqrt((sin(radians((DEST_LAT- SOURCE_LAT) / 2))) ^ 2 + cos(radians(SOURCE_LAT)) * cos(radians(DEST_LAT)) * (sin(radians((DEST_LONG- SOURCE_LONG) / 2))) ^ 2))

这应该在DISTANCE_CALC表中为数据中看到的所有路线提供计算出的距离。从那里,您应该可以进行所需的任何与距离相关的路线分析。

相关问题