【发布时间】:2011-11-15 05:21:06
【问题描述】:
在我的项目中,我的用户可以选择放置在给定圆形区域内的随机位置。 我有中心的经纬度和半径:如何计算给定区域内随机点的经纬度? (我使用 PHP,但任何语言的示例都适合)
【问题讨论】:
标签: geolocation position latitude-longitude
在我的项目中,我的用户可以选择放置在给定圆形区域内的随机位置。 我有中心的经纬度和半径:如何计算给定区域内随机点的经纬度? (我使用 PHP,但任何语言的示例都适合)
【问题讨论】:
标签: geolocation position latitude-longitude
您需要两个随机生成的数字。
使用矩形 (Cartesian) (x,y) 坐标来考虑这个问题对于问题空间来说有些不自然。给定一个半径,很难考虑如何直接计算落在由中心和半径定义的圆内的 (Δx,Δy) delta。
最好使用polar coordinates 来分析问题——其中维度为 (r1, Θ)。计算一个随机距离,以半径为界。计算一个随机角度,从 0 到 360 度。然后convert the (r,Θ) to Cartesian (Δx,Δy),使用简单的三角关系,笛卡尔量只是从您的圆心偏移。
Δx = r * cos(Θ)
Δy = r * sin(Θ)
那么你的新观点很简单
xnew = x + Δx
ynew = y + Δy
这适用于较小的 r,在这种情况下,地球的几何形状可以用欧几里得(平面)几何近似。
随着r变大,地球的曲率意味着欧几里得近似与实际情况不符。在这种情况下,您将需要use the formulas for geodesic distance,这会考虑到地球的 3d 曲率。这开始有意义,比方说,在 100 公里以上的距离。当然,这取决于您需要的准确度,但我假设您有相当多的回旋余地。
在 3d 几何中,您再次需要计算 2 个量 - 角度和距离。该距离再次受到您的 r 半径的限制,但在这种情况下,距离是在地球表面上测量的,并且被称为“大圆距离”。对于第一个数量,随机生成一个小于或等于您的 r 的数字。
大圆几何关系
d = R Δσ
...表示 d 是一个大圆距离,它与球体的半径和球体表面上两点所对的中心角成正比。 “圆心角”是指由三个点描述的角度,以球心为顶点,另外两点在球面上。
在你的问题中,这个 d 必须是一个由你原来的 'r' 限制的随机量。计算 a d 然后给你中心角,换句话说 Δσ ,因为地球的 R 是已知的(大约 6371.01 公里)。
这为您提供了沿大圆的绝对(随机)距离,远离原始纬度/经度。现在您需要用角度量化的方向,描述从原始点出发的 N/S/E/W 行进方向。同样,使用 0-360 度随机数,如果您愿意,其中零表示正东。
可以通过d sin(Θ)计算纬度变化,通过d cos(Θ)计算经度变化。这给出了与 r(可能是公里)相同维度的大圆距离,但您需要纬度/经度,因此您需要转换。从纬度距离到度数很容易:it's about 111.32 km per degree regardless of latitude。从纵向距离到纵向度数的转换更加复杂,因为纵向线越靠近两极越接近。因此,您需要使用更多complex formulae 来计算与所选d(远距离)和角度相对应的经度变化。请记住,您可能需要跳过 +/- 180° 障碍。 (F22 Raptor 战机的设计者忘记了这一点,their airplanes nearly crashed when attempting to cross the 180th meridian。)
由于可能在逐次逼近中累积误差,您需要检查新点是否符合您的约束条件。使用公式
Δσ = arccos( cos(Δlat) - cos(lat1)*cos(lat2)*(1 - cos(Δlong) ) .
其中Δlat是纬度的变化等。
这为您提供 Δσ ,即新旧纬度/经度点之间的中心角。验证您在此处计算的中心角是否与您之前随机选择的中心角相同。换句话说,验证计算点之间的计算 d(大圆距离)是否与您随机选择的大圆距离相同。如果计算出的 d 与您选择的 d 不同,您可以使用数值近似来提高准确性,稍微改变纬度或经度,直到它符合您的标准。
【讨论】:
dist = acos(rand1*(cos(maxdist) - 1) + 1) 我不知道为什么+1和-1在里面;在我看来,你可以放弃那些。像这样的修改后的随机数生成器可为您提供在整个圆圈区域内更均匀的点分布。
acos(rand1*(cos(maxdist) - 1) + 1) 需要修改,但我不知道该怎么做调整为0.25km - maxdist。
X + acos(rand1*(cos(maxdist - X) - 1) + 1),其中 X 是您的“最小值”@wprater
这可以简单地通过计算随机方位角(0 到 2*pi 之间)和 0 到所需最大半径之间的随机距离来完成。然后使用给定纬度/经度中心点的随机方位/范围计算新的(随机)纬度/经度。请参阅此网站上的“目标点距起点的距离和方位角”部分:http://www.movable-type.co.uk/scripts/latlong.html
注意:给出的公式期望所有角度为弧度(包括纬度/经度)。生成的纬度/经度也以弧度表示,因此您需要转换为度数。
【讨论】: