我有一个以小数点为单位的位置(x.xxxxxxx 和 y.yyyyyyy)。我需要在它周围画一个矩形。矩形的中心与位置匹配。矩形的尺寸以米为单位,旋转范围为0-360度。
问题:我需要在它周围画一个矩形,矩形的中心与位置相匹配。如何计算矩形的四个角,并将结果返回为四个小数度值?像 arrayOf<LatLon> getRectangle(LatLon position, int rectWidthCm, int rectLengthCm, double rectRotation)
.
例子
注:项目设置是一个支持Kotlin和google地图图的Android应用程序。我对这个问题的现代方法很感兴趣。关于精度损失,它最多应该在厘米之内。
我知道你正在寻找一个函数 geo_rect(x,y,w,h,a)
具有以下参数
x
为经度,根据 WGS84y
是纬度w
是长方形的宽度,单位为米h
是矩形的高度,单位为米a
是指矩形从上到下的角度。w
是水平的(意思是正好指向西向东)。我建议允许数值范围在 开放式区间 (-90°,90°),因为这使得数学要么理解。 你的函数 getRectangle(LatLon position, int rectWidthCm, int rectLengthCm, double rectRotation)
传递所有需要的信息,你需要一个小的包装函数来确定 w
, h
和 a
从 rectWidthCm
, rectLengthCm
和 rectRotation
后者在 [0°,360°)
.
该功能 geo_rect()
将返回一个 arrayOf<LatLon>
长度为四,即四个角的坐标,从左上方开始,然后顺时针方向。我们将这些点称为 P_NE
,P_NW
,P_SE
和 P_SW
分别。
为了使事情在数学上可行,我们做了一些假设。
w ~ h << r
与 r = 6378 km
为地球的半径。该算法可结构如下。
确定距离 d
从 (x,y)
到所有四个端点。由于我们的第一个假设,我们可以使用简单的 欧几里得几何学 而非错综复杂 球面几何学. 毕达哥拉斯 持有。d^2 = (w/2)^2 + (h/2)^2
.
我们还需要四个 轴承例如 b_NW
指向北极的矢量与指向下列地点的矢量之间的角度为 (x,y)
指向 P_NW
.
鉴于信息(x
,y
,d
,b_NW
, b_NE
, b_SW
, b_SE
),现在我们可以按照前面的步骤进行 获取给定的当前点、距离和方位的latlong。 来计算所有四个点的位置。这是数学上最难的部分,我建议使用一个成熟的、经过测试的库。
最后但并非最不重要的是,让我们通过评估计算是否顺利来双重检查 大圆周距离 一些或所有的点对之间。例如 d(P_NE,P_NW)
大约应是 w
, d(P_NW,P_SW)
大约应是 h
. 如果有实际的差异,请不要感到惊讶--这个误差是由于我们所做的假设。在通常情况下,普通的GPS无论如何都不能让你确定你的位置到厘米,你将需要在你的位置上进行测量。DPGS 为的。
在 https:/www.movable-type.co.ukscriptslatlong-vectors.html 你可以在网上进行实验,根据距离起点(在我们的例子中:矩形的中心)的距离和方位来确定一个大圆的目标点。
旧的,但令人惊讶的记录和良好的测试工具箱,一般地理应用的是 https:/www.generic-mapping-tools.org - 你可能想看看命令 gmtvector
.
如果你正在寻找java的实现,我找到了e.g.