为啥 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 ToString()?