如何在距离另一个地理点d范围内创建随机地理点?

4
如何获取随机地理坐标(十进制的纬度/经度),放置在一个半径为100米的圆内的任意位置?圆的中心是另一个参考地理点。
是否有实现这个功能/公式的方法?
基本上,我正在读取我的android设备的GPS输入,并需要在设备周围[在以我的设备为中心的100米半径圆内]生成随机的地理点。
请注意:没有预先存储在数据库中的地理点。我需要按照上述方式即时创建所有地理点。

我是一名新手安卓程序员 - 我阅读了一些关于最小边界矩形、地理位置等方面的文章。我能够正确地通过GPS获取用户位置,但我卡在了下一步,也就是我上面解释的内容。 - aswin akhilesh
3个回答

6

我刚刚编写了一个Ruby方法,扩展了Random来提供这个功能。

注意:所有点都位于一个矩形内,而不是一个圆形。

class Random
  def location(lat, lng, max_dist_meters)

这可以使用Random.new.location(mid_lat, mid_lng, dist)调用。它会返回一个点,这个点可能在距离中心点max_dist_meters以内的范围内。
    max_radius = Math.sqrt((max_dist_meters ** 2) / 2.0)

如果不调整max_radius,我们会得到圆外的正方形内的点(即在角落处),其中距离大于max_dist_meters。这将限制我们到圆内的正方形,这可能更符合您的要求。

    lat_offset = rand(10 ** (Math.log10(max_radius / 1.11)-5))
    lng_offset = rand(10 ** (Math.log10(max_radius / 1.11)-5))

这里提到了1.115,它们与IT技术有关。

    lat += [1,-1].sample * lat_offset
    lng += [1,-1].sample * lng_offset
    lat = [[-90, lat].max, 90].min
    lng = [[-180, lng].max, 180].min

我们可能应该在这里进行包装,而不仅仅是夹紧值,欢迎改进。

    [lat, lng]
  end
end

欢迎评论和整理!

此处有示例输出如果您将经纬度粘贴到这里,您可以清楚地看到它。


1
在一个正方形上随机选取点(即均匀随机数对),然后丢弃不在内切圆内的点。给定(x,y)对,如果一个点在你的圆内,则它在圆内。
(x - c_x)^2 + (y - c_y)^2 < r,

其中 (c_x, c_y) 是你的圆心,r 是它的半径。


我对你回答中的第一部分有疑问。我怎么才能得到那些在正方形内的点呢?这些坐标是经度/纬度吗?这就是问题所在。 - aswin akhilesh
最好的方法是在方便的区间内选择随机数,然后将它们转换为适合您地理环境的坐标。因此,如果您想要在10纬度10经度的100米范围内获取点,请从以(0,0)为中心、边长为200的正方形开始,这样您就可以在-100到100之间选择一对随机数。然后按照上述方法获取内切圆内的点。现在您已经有了半径为100的圆内的点,所以只需将(x,y)添加到(lat,long)即可得到您需要的内容。 - jimw
将lat+100,long+100添加起来并不会得到一个大约相距100米的点。它实际上会指向其他大陆的某个位置。根据我的实验,一个距离为200米的地理位置在纬度上的偏移量为+-0.000500,在经度上的偏移量为+-0.000750。 - aswin akhilesh
好的,你必须适当地缩放这些数字。这并不是特别容易,因为纬度/经度的度量单位在每个地方的线性距离都不相同。你还需要决定你想要地面上的距离还是鸟瞰视角的距离,并且需要选择适合你应用程序的地球形状的近似值。 - jimw
好的!我假设用户不会离开新西兰 - 所以必须适当地计算比例尺。非常感谢你的意见! - aswin akhilesh

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接