根据十进制度位置计算仪表偏移

7he*_*ing 0 java android geolocation geospatial kotlin

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

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

例子

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

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

B--*_*ian 6

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

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

你的功能getRectangle(LatLon position, int rectWidthCm, int rectLengthCm, double rectRotation)提供所有必要的信息,你需要一个小包装函数,确定wh以及arectWidthCmrectLengthCmrectRotation与内后者[0°,360°)

该函数geo_rect()将返回arrayOf<LatLon>长度为 4 的一个,即所有四个角的坐标,从左上角开始,然后顺时针方向。我们将参考点作为P_NEP_NWP_SE,和P_SW分别。

假设

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

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

算法的基本结构

该算法的结构可以如下:

  1. 确定距离d(x,y)所有四个端点。由于我们的第一个假设,我们可以使用简单的欧几里得几何而不是复杂的球面几何毕达哥拉斯认为:d^2 = (w/2)^2 + (h/2)^2

  2. 我们还需要四个方位角,例如b_NW指向北极的向量和指向指向(x,y)点的向量之间的角度P_NW

  3. 给定前面步骤中的信息 ( x, y, d, b_NW, b_NE, b_SW, b_SE),我们现在可以按照Get lat/long 给定当前点、距离和方位来计算所有四个点的位置。这是我建议使用完善且经过测试的库的数学上的困难部分。

  4. 最后但并非最不重要的一点,让我们通过评估一些或所有点对之间的大圆距离来仔细检查计算是否顺利。比如d(P_NE,P_NW)应该近似是wd(P_NW,P_SW)应该近似是h。如果确实存在差异,请不要感到惊讶 - 这些错误是由于我们所做的假设造成的。通常情况下的普通 GPS 无论如何都不允许你确定你的位置到厘米,你需要DPGS

进一步阅读

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