【问题标题】:How to generate random LAT & LNG inside an area, given the center and the radius给定中心和半径,如何在区域内生成随机 LAT 和 LNG
【发布时间】:2011-11-15 05:21:06
【问题描述】:

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

【问题讨论】:

    标签: geolocation position latitude-longitude


    【解决方案1】:

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

    使用矩形 (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 不同,您可以使用数值近似来提高准确性,稍微改变纬度或经度,直到它符合您的标准。

    【讨论】:

    • 感谢您的优秀解释 :) 我想知道这个(更复杂的)算法geomidpoint.com/random/calculation.html 是否与测地距离有关(我不需要...我们正在谈论给定城市周围的区域,所以我进入了 100KM 的限制)。然而,令我困惑的是第 6 点,他谈到了随机数的“分布”。这真的是一个问题吗?
    • 这可能是一个问题。如果您选择一个半径内的随机数 n,其分布完全随机,则更接近圆心的位置将比更远的位置“更频繁地”选择。这样想:想象一个半径为 r 的圆。现在想象另一个圆,以同一点为中心,半径为 r/2。第一个圆圈的面积是第二个圆圈面积的 4 倍。如果随机选择可以像选择 r/2..r 之间的数字一样频繁地选择 0..r/2 之间的数字,那么有一半的时间它会选择该区域 1/4 内的点。跨度>
    • 不过,更正很容易应用。您只需要一个随机数生成器来补偿这种影响。他甚至提供它。 dist = acos(rand1*(cos(maxdist) - 1) + 1) 我不知道为什么+1和-1在里面;在我看来,你可以放弃那些。像这样的修改后的随机数生成器可为您提供在整个圆圈区域内更均匀的点分布。
    • @Cheeso 假设我想将随机起点调整为最小值,而不是从 0 开始。我意识到这个等式 acos(rand1*(cos(maxdist) - 1) + 1) 需要修改,但我不知道该怎么做调整为0.25km - maxdist
    • 我认为,但不确定,答案是X + acos(rand1*(cos(maxdist - X) - 1) + 1),其中 X 是您的“最小值”@wprater
    【解决方案2】:

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

    注意:给出的公式期望所有角度为弧度(包括纬度/经度)。生成的纬度/经度也以弧度表示,因此您需要转换为度数。

    【讨论】:

    • 我可能误读了这个问题。您想要一个点的随机纬度/经度,还是用户选择了一个随机点,您需要确定“点击”点的纬度/经度?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多