计算Oracle中两个lat long点之间的距离

Calculate distance between two lat long points in Oracle

我正在尝试使用 SDO_GEOM 包计算 Oracle 中两个经纬度点之间的距离。 我在互联网上阅读的大多数解决方案都建议以下查询:

select sdo_geom.sdo_distance(
  sdo_geometry(2001, 4326, sdo_point_type(40.0, 10.0, null), null, null),
  sdo_geometry(2001, 4326, sdo_point_type(40.0, 11.0, null), null, null),
  0.01,
  'unit=KM'
) as distance
from dual;

但是,当我使用在线工具验证结果时,似乎不正确:

尝试 (40,10)、(40,11):

http://www.meridianoutpost.com/resources/etools/calculators/calculator-latitude-longitude-distance.php

知道为什么即使我在查询中使用地理坐标系 (4326) 距离计算也不正确吗?

你的问题是交换经度和纬度

这是计算中央公园和百老汇距离的例子

select sdo_geom.sdo_distance(         --  longitude,  Latitude 
  sdo_geometry(2001, 4326, sdo_point_type(-73.968285, 40.785091, null), null, null),
  sdo_geometry(2001, 4326, sdo_point_type(-73.974709, 40.790886, null), null, null),
  0.01,
  'unit=KM'
) as distance
from dual;

哪个return

0,841504644128136

您提到的 link 给出了(如果输入正确)可比较的结果

 From: (40°47'6.3276000000001"N -73°58'5.826"E) To: (40°47'27.1896"N -73°58'28.9524"E)
0.52 miles / 0.84 kilometers / 0.45 nautical miles
select sdo_geom.sdo_distance(
  sdo_geometry(2001, 4326, sdo_point_type(40.0, 10.0, null), null, null),
  sdo_geometry(2001, 4326, sdo_point_type(40.0, 11.0, null), null, null),
  0.01,
  'unit=KM'
) as distance
from dual;

DISTANCE
----------
110.611186

Oracle计算returns110.611186公里

您网站上的 returns 111.19 公里 所以相差 580 米。这种差异是因为您的在线计算器使用简单的数学假设 spherical 地球,而 Oracle 使用适当的 ellipsoidal 地球形状(WGS84 椭球体) .

您可以在 https://www.fai.org/page/world-distance-calculator 上看到差异 如果您选择 WGS84 地球模型(WGS84 椭球体),那么您会得到与 Oracle (110.611186562098) 相同的结果。如果您将其更改为 FAI Sphere,那么您将得到 111.19492643325476,与您的比较器相同。

正确的距离是 110.611 公里。在 580 m 之外计算它是否重要取决于您的应用程序。如果您测量的距离很短(例如一公里或更短),则误差可以忽略不计。但对于长距离来说,它可能很重要。在这里它意味着错过目标 1/2 公里!

它确实显示了使用正确的地球模型进行这些计算的重要性。

编辑: Oracle 表示(以及几乎所有 GIS 工具)是经度、纬度。如果你交换数字,那么你会得到非常不同的结果。