【问题标题】: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(num{0},rect{polygon:[[x: -117.499208 y: 37.220449]]}, stmt{Stmt(SQL{SELECT 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(num{1},rect{polygon:[[x: -117.499208 y: 37.220449, x: -117.499208 y: 43.808064441203]]}, stmt{Stmt(SQL{SELECT 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)。但它实际上离那有点远。

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

【问题讨论】:

    标签: java oracle geospatial


    【解决方案1】:

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

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

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

    1. 我简化了数字以使偏移更明显
    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 所做的,它使用沿测地线或俗称大圆的距离(这是最短距离 - 相当于地球表面上的直线)。测地线仅在指定点向东;当您沿着它行进时,方向会从最近的极点改变 - 示例案例在北半球,因此它向南移动。如果你走过地球的一半圆周,你将到达赤道以南的一点,因为起点是北。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-30
        • 2011-01-08
        • 1970-01-01
        • 2011-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-05
        相关资源
        最近更新 更多