使用sql oracle计算地理点之间的距离
Posted
技术标签:
【中文标题】使用sql oracle计算地理点之间的距离【英文标题】:Calculate distance between geo points using sql oracle 【发布时间】:2019-08-09 11:07:42 【问题描述】:谁知道并且可以演示如何使用毕达哥拉斯定理(SQL oracle)计算距离。 表:
station_id station_geom
395 POINT(-121.906834244728 37.3608541552538)
378 POINT(-121.890799999237 37.3477445655325)
312 POINT(-121.901782 37.329732)
期望输出:
station_id_start station_id_end distance
395 378 2,23682150368419
老实说,我所做的并不是太聪明:我将列 station_geom
分成两个单独的列,然后计算车站之间的距离,例如。 SELECT sqrt(power(37.3608541552538-37.3477445655325,2)+power(-121.890799999237-(-121.906834244728),2))*108 as P_Distance
,我希望有一个简单的解决方案。谢谢
【问题讨论】:
为什么是 *108?什么是 108? 彼得·克塞纳克 - 。 “计算值以 Degress 为单位,为了将其转换为 KM,我将结果乘以 108(即地球半径 6371*pi/180)。” link 啊哈好吧..顺便说一句,我不认为你会找到更简单的解决方案,因为这个使用毕达哥拉斯定理的解决方案是一个标准,它很简单.. 记住你是在一个地球仪上,所以毕达哥拉斯将无法工作,除非你非常靠近赤道,并且距离为 1 度。赤道约111公里。但是除了数学之外,您的问题是在一个 select 语句中从两个不同的行中获取值吗? 好的,但是您使用的是 2D 投影地图。但这仍然是一个大地测量问题,而不是 oracle/sql 问题...请为您的问题使用其他标签。 【参考方案1】:正如 cmets 中所指出的,如果条件是您必须使用毕达哥拉斯定理,则您的答案已经完成。为什么你有这种情况我不知道,因为这意味着如果距离很长或者你不在赤道附近,你的答案将是一个近似值而不是一个很好的答案。
获得正确结果的简单解决方案是确保您的几何场具有正确的投影数据,然后使用内置的距离函数。 https://docs.oracle.com/database/121/SPATL/sdo_geom-sdo_distance.htm#SPATL1117
编辑:根据您的 cmets,我们可以忘记 Pythagorus 并尝试使用内置的 Oracle 空间函数(假设它们已安装)。
您首先需要将众所周知的文本 WKT 数据(即看起来像您的点的数据的名称)转换为几何对象,并告诉 Oracle 数字是经纬度。您可以使用函数 SDO_GEOMETRY 来执行此操作,如下所示:
SELECT station_id, SDO_GEOMETRY(station_geom,4326) as station_geom_oracle FROM your_table
我建议您在数据库中创建一个新表,这样您只需进行一次转换。然后,您可以根据需要使用 SDO_DISTANCE 函数计算这些几何图形之间的距离。
【讨论】:
请试着理解我的意思,我不是在问:“我需要使用毕达哥拉斯定理来计算距离吗?”,关于如何在 SQL 中实现它的问题,顺便说一句,谢谢你的链接,现在我很确定在 sql oracle 中做我想做的事情是不可能的,因为数据类型POINT
在 sql-server
中使用,在 oracle - SDO_POINT_TYPE
好吧,别慌,这不是不可能的。您所拥有的是定义为众所周知的文本(WKT)的点。您需要使用我链接的函数将它们转换为具有正确 SRID 青少年的 oracle 几何对象。稍后我会尝试使用正确的函数更新我的答案。
SDO_GEOMETRY(station_geom,4326)
不工作,返回[MDSYS.SDO_GEOMETRY]
我不确定你在说什么。你有错误吗?该函数返回一个几何对象,这就是它的目的。您需要一个几何对象才能使用距离函数。
take a look please以上是关于使用sql oracle计算地理点之间的距离的主要内容,如果未能解决你的问题,请参考以下文章