我正在尝试使用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(
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 计算返回110.611186 公里
您网站上的一个返回111.19 公里,因此相差580 米。这种差异是因为您的在线计算器使用简单的数学假设地球球形,而 Oracle 使用地球的正确椭圆体形状(WGS84 椭球体(。
您可以在 https://www.fai.org/page/world-distance-calculator 上看到差异 如果选择 WGS84 地球模型(WGS84椭球体(,则得到与 Oracle (110.611186562098( 相同的结果。如果将其更改为FAI Sphere,则得到 111.19492643325476,与您的比较器相同。
正确的距离是 110.611 公里。在 580 m 关闭的情况下计算它是否重要取决于您的应用程序。如果您测量短距离(如一公里或更短的距离(,则误差可以忽略不计。但对于长距离来说,这可能很重要。在这里,这意味着错过目标 1/2 公里!
它确实显示了使用正确的地球模型进行这些计算的重要性。
编辑:甲骨文表示(以及几乎所有的GIS工具(是经度,纬度。如果你交换数字,那么你会得到非常不同的结果。
您的问题是交换经度和纬度
这是计算中央公园和百老汇距离的示例
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;
返回
0,841504644128136
您提到的链接给出了(提供正确的输入(可比较的结果
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