为啥 Oracle SDO 可以投影具有北轴承但不能用东轴承的点?

Posted

技术标签:

【中文标题】为啥 Oracle SDO 可以投影具有北轴承但不能用东轴承的点?【英文标题】:Why can Oracle SDO project a point with a north bearing but not an east bearing?为什么 Oracle SDO 可以投影具有北轴承但不能用东轴承的点? 【发布时间】:2015-03-13 11:23:03 【问题描述】:

我正在使用 Oracle Spatial (SDO) 在给定的经度、纬度上沿给定的方位投影给定距离的点。我正在寻找经度,纬度的结果。当我向北投影时,这似乎按预期工作。但不是在正东投影时。

正北投影就像人们想象的那样工作。如果结果正好等于开始的经度,则为经度。

Projecting East 无法按预期工作。如果结果不等于开始的纬度,则为纬度。我不知道为什么会这样。

这是一个例子。

我将从按预期工作的案例开始。我正在处理由我的 Java 代码记录的输出。

googlefiber3log4j:05:18:02.117 userObject.placement.OrthoRectangleSettings$CompleteRectOnServer - [调试] x: -117.499208 y: 43.808064441203=addVertex(num0,rectpolygon:[[x: -117.499208 y: 37.220449]], stmtStmt(SQLSELECT SDO_UTIL.POINT_AT_BEARING(?point?,?radians?,?距离?)点 FROM DUAL) 属性:距离=731519.9982059655,点=x: -117.499208 y: 37.220449, 弧度=6.283185307179586>)

以粗体字的顺序显示计算结果、距离、我们投影的点、投影的角度。

在sqlDev中执行为:

SELECT SDO_UTIL.POINT_AT_BEARING(sdo_geom.sdo_geometry(2001, 8192, sdo_geom.sdo_point_type(-117.499208, 37.220449, NULL), NULL, NULL), 6.283185307179586,731519.9982059655) 点数;

对于 Oracle,零角是北。 6.28…角度基本上为零,基于 2 PI 弧度。

您可以看到生成的经度 -117.499208 在输入和输出上都符合预期。为了让它变得如此干净,我不得不怀疑 Oracle 并没有真正使用 trig 来执行此操作,而是将零弧度视为一种特殊情况。

现在进行下一个我看到问题的计算。这将向东而不是向北投影。投影的点是上述计算的输出。

googlefiber3log4j:05:18:29.474 userObject.placement.OrthoRectangleSettings$CompleteRectOnServer - [调试] x:-101.232232142637 y:42.6357376524045= addVertex(num1,rectpolygon:[[x: -117.499208 y: 37.220449, x: -117.499208 y: 43.808064441203]], stmtStmt(SQLSELECT SDO_UTIL.POINT_AT_BEARING(?point?,?radians?,?distance?) point FROM DUAL) 属性:距离=1325879.999986927,点=x:-117.499208 y: 43.808064441203, 弧度= 1.5707963267948966>)

在sqlDev中执行为:

选择 SDO_UTIL.POINT_AT_BEARING(sdo_geom.sdo_geometry(2001, 8192, sdo_geom.sdo_point_type(-117.499208, 43.808064441203, NULL), NULL, 空值), 1.5707963267948966,1325879.999986927) 点数;

在这种情况下,弧度为 90.0 度/东。所以我希望结果的纬度(42.6357376524045)等于开始的纬度(43.808064441203)。但它实际上离那有点远。

为什么在尝试向正东投影时,纬度会发生变化?

【问题讨论】:

【参考方案1】:

简短(且过期)的答案是“不,当将一个点向东偏移到一个新点时,纬度不应改变。”

但是,我认为您在 Oracle 的 Point_at_Bearing() 实用程序中发现了一个错误/功能。

我使用您的代码变体测试了 Oracle 11.2,我在其中做了两处更改:

    我简化了数字以使偏移更明显 我使用CONVERT_UNIT() 来获得从 90 度开始的精确弧度转换

接下来,我迭代(在输入方位上),直到得到与输入相同的输出纬度。对于俄勒冈州小山谷附近的区域,结果如下所示:

SELECT SDO_UTIL.POINT_AT_BEARING(
    sdo_geom.sdo_geometry(
        2001
        , 8192
        , sdo_geom.sdo_point_type(
            -117.5
            ,44
            , null)
        , NULL
        , NULL)
    , SDO_UTIL.CONVERT_UNIT(
        84.2316805
        , 'degree'
        ,'radian') 
    , 1325000.0) aPoint FROM DUAL;

所以,长答案是:Oracle 很可能使用非等角投影来获取偏移坐标;因此,纬度调整不正确。换句话说,Point_at_Bearing() 函数在您的纬度上的角度失真超过 5.7 度!

【讨论】:

【参考方案2】:

向东行驶意味着沿着恒向线;纬度的平行线是恒向线,因此纬度不会改变。但这不是 SDO_UTIL.POINT_AT_BEARING 所做的,它使用沿测地线或俗称大圆的距离(这是最短距离 - 相当于地球表面上的直线)。测地线仅在指定点向东;当您沿着它行进时,方向会从最近的极点改变 - 示例案例在北半球,因此它向南移动。如果你走过地球的一半圆周,你将到达赤道以南的一点,因为起点是北。

【讨论】:

以上是关于为啥 Oracle SDO 可以投影具有北轴承但不能用东轴承的点?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Spatial 问题:可以使用来自另一个 Oracle 表的查询结果填充 SDO_ORDINATE_ARRAY 吗?

oracle 的 SDO_GEOMETRY

如何使用 Oracle 的 sdo_distance

ORACLE SDO_GEOMETRY ToString()?

Oracle 空间查询, 数据类型为 sdo_geometry

转载Oracle Spatial中SDO_Geometry详细说明