sql - 使用sql oracle计算地理点之间的距离
问题描述
谁知道并可以演示如何使用毕达哥拉斯定理(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
,我确实希望有一个简单的解决方案。谢谢
解决方案
正如评论中所指出的,如果条件是您必须使用毕达哥拉斯定理,您的答案已经完成。为什么你有这种情况我不知道,因为这意味着如果距离很长或者你不在赤道附近,你的答案将是一个近似值而不是一个很好的答案。
获得正确结果的简单解决方案是确保您的几何场具有正确的投影数据,然后使用内置的距离函数。 https://docs.oracle.com/database/121/SPATL/sdo_geom-sdo_distance.htm#SPATL1117
编辑:根据您的评论,我们可以忘记毕达哥拉斯并尝试使用内置的 Oracle 空间函数(假设它们已安装)。
您首先需要将众所周知的文本 WKT 数据(即看起来像您的点的数据的名称)转换为几何对象,并告诉 Oracle 数字是经纬度。您可以使用函数 SDO_GEOMETRY 执行此操作,如下所示:
SELECT station_id, SDO_GEOMETRY(station_geom,4326) as station_geom_oracle FROM your_table
我建议您在数据库中创建一个新表,这样您只需进行一次转换。然后,您可以根据需要使用 SDO_DISTANCE 函数计算这些几何图形之间的距离。
推荐阅读
- python - python pandas:用特殊字符替换另一个str列中的str值
- gcc - libtool:无法识别的选项“-g”
- python - 如何在我的电脑上安装 pygame zero?我收到错误,找不到其他方法
- javascript - bcrypt 哈希输出的长度是多少?
- c# - 为什么c# utf8-json 需要将obj序列化为utf8 byte[] 然后utf8.getstring?这样做有什么好处呢?
- javascript - 使用由 ajax 查询填充的数组填充 Select2 选择框
- reactjs - 如何在 aws lambda serverless 或 S3 中部署 React 应用程序
- python - 如何使用 xml.etree.ElementTree 漂亮地编写 .xml 文件
- json - 你能帮我解决 Alamofire 响应中的 Codable 错误吗?
- scala - Spark:在不使用“.*”星号运算符的情况下将 StructType 列拆分为多个列