【问题标题】:Calculate meter offset based on decimal degree position根据十进制度数位置计算仪表偏移
【发布时间】:2020-08-27 00:33:58
【问题描述】:

我有一个十进制度数的位置(x.xxxxxxxx 和 y.yyyyyyyy)。我需要在它周围画一个矩形。矩形的中心与位置匹配。矩形的尺寸以米为单位,旋转范围为 0-360 度。

问题 如何计算矩形的四个角并将结果作为四个十进制度值返回?喜欢arrayOf<LatLon> getRectangle(LatLon position, int rectWidthCm, int rectLengthCm, double rectRotation)

示例

  1. 我有一个以LatLon 格式给出的位置,它有两个两个值:纬度和经度。我们会假设这个位置是准确的。
  2. 主要任务是根据Google Maps chart中的这个位置绘制一个矩形。矩形可以有任何尺寸,但让我们在本例中使用这些尺寸:宽度 = 0.9 米,长度 = 1.2 米。也可以给出任何标题,所以让我们使用这个标题:45. 0 是北,顺时针旋转(东 = 90,南 = 180,西 = 270)。当矩形指向北方时,它具有南北方向的长度。最后,矩形中心应该等于给定的位置。

注意:项目设置是一个支持 Kotlin 的 Android 应用程序和一个谷歌地图。我对解决这个问题的现代方法很感兴趣。关于精度损失,它最多应该在厘米以内。

【问题讨论】:

  • 好吧,我真的不知道如何开始。我当然有这两个坐标 - 但从那里开始,没有任何线索。
  • @B--rian 我不太确定地图日期问题。该位置是从 GPS 设备(如手机或平板电脑中的设备)接收的。

标签: java android kotlin geolocation geospatial


【解决方案1】:

我了解到您正在寻找具有以下参数的函数geo_rect(x,y,w,h,a)

  • x 是根据WGS84 的经度
  • y 是纬度
  • w 是矩形的宽度,以米为单位
  • h 是矩形的高度,以米为单位
  • a 是矩形从w 转为水平的角度(意味着正好从西指向东)。我建议允许在 open interval (-90°,90°) 范围内的值,因为这使得数学要么理解。

您的函数getRectangle(LatLon position, int rectWidthCm, int rectLengthCm, double rectRotation) 传递所有需要的信息,您需要一个小的包装函数,它从rectWidthCmrectLengthCmrectRotation 中确定wha,后者在[0°,360°)内。

函数geo_rect() 将返回一个长度为四的arrayOf<LatLon>,即所有四个角的坐标,从左上角开始,然后顺时针方向。我们将这些点分别称为P_NEP_NWP_SEP_SW

假设

为了让事情在数学上可行,我们做了一些假设

  1. 我们假设我们可以使用矩形是一个平面的近似值,如果w ~ h << rr = 6378 km 是地球的半径,这是可以的。
  2. 我们进一步假设地球是一个理想的球体,而不是一个椭球体,甚至更颠簸。有关该问题的可访问文章,请参见例如Zachary C. Eilon's blog

算法的基本结构

算法结构如下:

  1. 确定d(x,y) 到所有四个端点的距离。由于我们的第一个假设,我们可以使用简单的Euclidian geometry 而不是复杂的Spherical geometryPythagoras 持有:d^2 = (w/2)^2 + (h/2)^2

  2. 我们还需要四个bearings,例如b_NW 表示指向北极的矢量与从(x,y) 指向P_NW 的矢量之间的角度。

  3. 鉴于前面步骤中的信息 (x,y,d,b_NW,b_NE,b_SW,b_SE),我们现在可以按照 Get lat/long given current point, distance and bearing计算所有四个点的位置。这是我建议使用完善且经过测试的库的数学难题。

  4. 最后但同样重要的是,让我们通过在部分或所有点对之间评估 Great circle distances 来仔细检查计算是否顺利。例如d(P_NE,P_NW) 应该大约是wd(P_NW,P_SW) 应该大约是h。如果确实存在差异,请不要感到惊讶——这些错误是由于我们所做的假设造成的。通常情况下的普通 GPS 无论如何都无法确定您的位置,直到厘米,您需要DPGS

进一步阅读

如果您正在寻找 java 实现,我发现例如

【讨论】:

  • 谢谢。假设是正确的,但存在一个问题:基本结构点 1。如果我估计您必须添加例如每米 0.0001 - 它仅在位于同一区域时才有效,如果您进一步向北或向南移动,常数将随着坐标系在全球范围内改变维度而有所不同。
  • 你是说你需要放弃本地平面假设吗?好吧,那么您必须使用完整的球面几何形状... 确切地 是什么意思“位于同一区域”?您想接受xy 的哪个范围?我建议小于 5 公里的东西应该没问题。
  • 将矩形作为局部平面很好,因为它永远不会大于 3 乘以 3 米。但是,在赤道和两极换算成十进制度的一米是不一样的。使用库可能是一个很好的例子。也可能更容易将位置转换为 UTM 位置,获得四个点并转换回 LatLon。
  • @7heViking 我重组了算法,将第一步一分为二,希望现在更清楚了。
  • @7theViking。请让我知道你在想什么。我确实更新了我的答案,但我还没有收到你的回复是否对你有帮助。
猜你喜欢
  • 2018-08-27
  • 2021-01-04
  • 1970-01-01
  • 2020-06-30
  • 2014-11-18
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
相关资源
最近更新 更多