我正在使用Apache Sedona运行Spark应用程序。
我正在尝试计算两个坐标之间的方位角/方位角,使用以下脚本:
import org.apache.sedona.sql.utils.SedonaSQLRegistrator
SedonaSQLRegistrator.registerAll(spark)
spark.sql("SELECT DEGREES(ST_AZIMUTH(ST_POINT(9.942731, 57.042649), ST_POINT(9.940315, 57.04348))) AS azimuth").show
导致288度:
scala> spark.sql("SELECT DEGREES(ST_AZIMUTH(ST_POINT(9.942731, 57.042649), ST_POINT(9.940315, 57.04348))) AS azimuth").show
+-----------------+
| azimuth|
+-----------------+
|288.9810116333513|
+-----------------+
问题是,当我尝试使用几个在线工具验证轴承时,比如eidogg. https://www.sunearthtools.com/tools/distance.php,它们都计算出Angular 为302度。正如所有网络工具都同意的那样,我猜Sedona计算出的Angular 是错误的。
所以,我预计结果是302度,但得到了288度。
有人知道我是否犯了错误,如何修复它,或者塞多纳的计算是否有问题吗?
版本:Scala:2.11Spark:2.4塞多纳:1.2.1-孵化jts-核心:1.19.0地质工具- Package :1.1.0-25.2
1条答案
按热度按时间xxhby3vn1#
Sedona假设欧几里得几何(即二维坐标的平面)。因此,它提供的网格方位角是坐标差的反正切(也进行了一些调整,以避免出现负结果):
ST_AZIMUTH(ST_POINT(9.942731, 57.042649), ST_POINT(9.940315, 57.04348)) == ATAN2(57.04348 - 57.042649, 9.940315 - 9.942731)
您发布的参考网站计算大地方位角(使用完美球体)。塞多纳目前不提供该功能。
要回答您的问题:
1.您可能犯的唯一错误是大地方位角和栅格方位角的比较。
1.你可以从你提供的链接实现大地测量计算。这将是混乱的,但简单明了。我可能会做它的阶段:首先为X和Y创建列,然后进行最后的计算。
1.在我看来,Sedona的计算没有任何问题。这是在编写本文时最新提交的当前计算方法:链接
此外,下面是一个参考,其中包含大地方位角和栅格方位角之间差异的一些很好的插图:https://www.e-education.psu.edu/geog862/node/1816