随机生成有界区域内的坐标

时间:2014-01-18 14:15:21

标签: algorithm latitude-longitude

我有一份经度和纬度列表,它们构成了一个地理区域的边界。我想在这个地理区域内生成一些随机坐标。你能用一种语言建议一些方法吗?

3 个答案:

答案 0 :(得分:6)

像任何问题一样,有很多方法可以解决它,我想到的第一件事就是

  1. 我们称这个“地理区域”为多边形。
  2. 找到多边形的边界框(简单,只需找到maxX maxY minX minY)。
  3. 在边界框x=rand()%(maxX-minX)+minX内生成随机坐标(对Y来说也是如此)
  4. 测试坐标是否在多边形内部,有许多解决方案可以解决这个问题,并且它们以任何给定的语言实现,因此您不必自己实现它。 这是C / C ++中的一个实现(很容易将其更改为任何其他语言):Point in Polygon Algorithm
  5. http://en.wikipedia.org/wiki/Point_in_polygon

    修改: 正如Jan Dvorak所说,在大面积区域使用它可能会有问题,我相信如果你的多边形接近赤道并且他的尺寸小于100公里,它就可以正常工作。

    如果你靠近180°线,你也会遇到问题,因为它旁边是-180°。

答案 1 :(得分:1)

首先,我们将地球的形状建模为球体。解决oblate spheroid的问题要困难得多。

生成random point on a sphere相对容易。

生成random point on a spherical triangle更难,但在此链接文章中进行了解释。

您需要将多边形划分为spherical triangles并根据其面积对其进行加权。然后根据权重随机选择一个球形三角形。

对于一般情况,triangulating a spherical polygon is not possible但是,对于大多数实际情况,三角测量是一项简单的任务。一种这样的算法被描述为here(算法1,第901页),其中C ++源代码可用here(搜索“用于计算构造板块几何参数的计算方法”)。

答案 2 :(得分:0)

你可以试试这个:

  1. 计算此地理区域内的所有坐标,请参阅vector<Point> points中的保存。

  2. [0, points.size())中生成随机整数,见k

  3. points[k]就是你想要的。