计算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):
知道为什么即使我在查询中使用地理坐标系 (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 工具)是经度、纬度。如果你交换数字,那么你会得到非常不同的结果。
我正在尝试使用 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):
知道为什么即使我在查询中使用地理坐标系 (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 工具)是经度、纬度。如果你交换数字,那么你会得到非常不同的结果。