根据小数点位置计算仪表偏移量。

问题描述 投票:-2回答:1

我有一个以小数点为单位的位置(x.xxxxxxx 和 y.yyyyyyy)。我需要在它周围画一个矩形。矩形的中心与位置匹配。矩形的尺寸以米为单位,旋转范围为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和google地图图的Android应用程序。我对这个问题的现代方法很感兴趣。关于精度损失,它最多应该在厘米之内。

java android kotlin geolocation geospatial
1个回答
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) 传递所有需要的信息,你需要一个小的包装函数来确定 w, harectWidthCm, rectLengthCmrectRotation后者在 [0°,360°).

该功能 geo_rect() 将返回一个 arrayOf<LatLon> 长度为四,即四个角的坐标,从左上方开始,然后顺时针方向。我们将这些点称为 P_NE,P_NW,P_SEP_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),现在我们可以按照前面的步骤进行 获取给定的当前点、距离和方位的latlong。 来计算所有四个点的位置。这是数学上最难的部分,我建议使用一个成熟的、经过测试的库。

  4. 最后但并非最不重要的是,让我们通过评估计算是否顺利来双重检查 大圆周距离 一些或所有的点对之间。例如 d(P_NE,P_NW) 大约应是 w, d(P_NW,P_SW) 大约应是 h. 如果有实际的差异,请不要感到惊讶--这个误差是由于我们所做的假设。在通常情况下,普通的GPS无论如何都不能让你确定你的位置到厘米,你将需要在你的位置上进行测量。DPGS 为的。

进一步阅读

如果你正在寻找java的实现,我找到了e.g.

© www.soinside.com 2019 - 2024. All rights reserved.