给定两个区域的经度和纬度,如何找到它们之间的距离(以米为单位)。如何在 SQL 中查询..?
Posted
技术标签:
【中文标题】给定两个区域的经度和纬度,如何找到它们之间的距离(以米为单位)。如何在 SQL 中查询..?【英文标题】:Given longitude and latitude of two areas, how to find the distance between them in meters. How to query in SQL..? 【发布时间】:2014-07-22 09:54:14 【问题描述】:我基本上有两个带有 ID 的表,Area.Longitude 和 latitude 列。我需要找出每个区域相距超过 20 米的距离差异。
表 1
##[ID] [Area] [Latitude] [Longitude]##
ID1 Area1 51.51141557 -0.138341652
ID2 Area2 51.50950278 -0.156438192
ID3 Area3 51.5071583 -0.153418937
表 2
##[ID] [Area] [Latitude] [Longitude]##
ID1 Area1 51.50819747 -0.141020749
ID2 Area2 51.50781548 -0.14294574
ID3 Area3 51.51286329 -0.14765827
我想比较表 1(区域 1)和表 2(区域 2)找出它们之间的差异(以经度和纬度给出)并以米为单位显示结果(它们之间的距离)
结果##
##[ID] [Area] [Distance apart in Meter]##
ID1 Area1 5 meter
ID2 Area2 10 meter
ID3 Area3 20 meter
我如何编写一个 sql 查询来实现这一点。请help
【问题讨论】:
[链接]***.com/questions/13747500/… 是mysql还是sql server?您将获得的答案的质量很大程度上取决于您所使用的技术的准确标记。 【参考方案1】:这是我们在项目中用于计算距离的 oracle 函数。您请相应地修改语法以适应 mysql / sql-server
create or replace
FUNCTION CALC_DISTANCE (Lat1 IN NUMBER,
Lon1 IN NUMBER,
Lat2 IN NUMBER,
Lon2 IN NUMBER) RETURN NUMBER IS
-- Convert degrees to radians
DEGTORAD NUMBER := 57.29577951;
--Radius NUMBER := 6387.7; -- For km
Radius NUMBER := 6387700 -- For metres
BEGIN
RETURN(NVL(Radius,0) * ACOS((sin(NVL(Lat1,0) / DegToRad) * SIN(NVL(Lat2,0) / DegToRad)) +
(COS(NVL(Lat1,0) / DegToRad) * COS(NVL(Lat2,0) / DegToRad) *
Cos(Nvl(Lon2,0) / Degtorad - Nvl(Lon1,0)/ Degtorad))));
END;
要使用此功能以米为单位,您可能可以使用,
SELECT
CALC_DISTANCE ('51.51141557' ,'-0.138341652',
'51.50819747', '-0.141020749') AS DISTANCE
FROM DUAL;
【讨论】:
"要使用这个函数以米为单位..." 或者只使用米作为地球半径而不是公里:Radius NUMBER := 6387700
...(虽然这个数字似乎只是一点点偏高,我会说。平均为 6371 公里。)请记住,许多数据库已经专门支持像这样的更快的计算,这些天使用某种地理扩展。最佳答案很大程度上取决于您使用的 RDBMS。
@MattGibson:答案编辑得当。感谢您的意见。以上是关于给定两个区域的经度和纬度,如何找到它们之间的距离(以米为单位)。如何在 SQL 中查询..?的主要内容,如果未能解决你的问题,请参考以下文章