如何生成随机LAT& LNG位于一个区域内,给定中心和半径

时间:2011-09-12 10:13:20

标签: geolocation position latitude-longitude

在我的项目中,我的用户可以选择放在给定的圆形区域内的随机位置。 我有中心的经纬度和半径:如何计算给定区域内随机点的纬度和经度? (我使用PHP,但任何语言的例子都适用)

2 个答案:

答案 0 :(得分:12)

您需要两个随机生成的数字。

使用矩形(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,它考虑到地球的三维曲率。比如,在100公里的距离之上,这开始变得有意义了。当然这取决于你需要的准确程度,但我假设你有相当多的摆动空间。

在3d几何体中,您再次需要计算2个量 - 角度和距离。距离再次受到r半径的约束,除非在这种情况下距离是在地球表面上测量的,并且被称为“大圆距离”。对于第一个数量,随机生成小于或等于r的数字。

大圆几何关系

 d =  R Δσ

...指出d,一个大圆距离,与球体的半径成正比,并且球体表面上的两个点对着中心角。 “中心角”是指由三个点描述的角度,球体的中心位于顶点,而另外两个点位于球体的表面上。

在您的问题中,此d必须是由原始“r”约束的随机数量。计算d然后给出中心角,换句话说Δσ,因为地球的R是已知的(大约6371.01 km)。

它为您提供沿着大圆的绝对(随机)距离,远离原始纬度/经度。现在您需要一个方向,通过一个角度量化,描述从原点开始的N / S / E / W行进方向。再次使用0-360度随机数,其中零表示正东,如果您愿意。


纬度变化可以d sin(Θ)计算,经度变化d cos(Θ)。这给出了与r(大概是km)相同尺寸的大圆距离,但是你需要纬度/长度,所以你需要转换。从纬度距离到度数很容易:it's about 111.32 km per degree regardless of latitude。从纵向距离到纵向度的转换更复杂,因为纵向线在靠近杆的位置彼此更靠近。因此,您需要使用更多complex formulae来计算与所选d(大距离)和角度相对应的经度变化。请记住,您可能需要跳过+/- 180°的屏障。 (F22猛禽战机的设计者忘记了这一点,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不同,您可以使用数值近似来提高精度,稍微改变纬度或经度,直到它符合您的标准。

答案 1 :(得分:0)

这可以简单地通过计算随机方位(在0和2 * pi之间)和0与您期望的最大半径之间的随机距离来完成。然后使用给定纬度/经度中心点的随机轴承/范围计算新的(随机)纬度/经度。请参阅本网站上的“目的地点给定距离和起点承载”部分:http://www.movable-type.co.uk/scripts/latlong.html

注意:给定的公式要求所有角度都为弧度(包括纬度/经度)。得到的纬度/经度也是弧度,因此您需要转换为度数。