在一个区域(国家/城市)内生成随机纬度经度数值

9

如何获取数千个地理坐标(经度/纬度),并使其仍然在特定的国家内随机生成?

这是我正在开发的应用程序中需要测试数据。我更喜欢将其以JSON格式提供。


请说明您生成随机地理坐标点的目的。 - prophet1906
@prophet1906 我已经编辑过了,目的是... - Xsmael
可能是Google Maps API - 在美国生成随机坐标的重复问题。 - prophet1906
2个回答

11

我开发了一个库可以完成这个任务:PyCristoforo。你可以通过pip轻松安装它:pip install pycristoforo。它唯一需要的输入变量是国家名称(或国家代码)和您想要的点数。

请访问我的Github了解更多详细信息。

目前,在PyPi上有两个主要版本:

版本1

  • 从国家多边形形状开始,首先获取其周围的矩形,然后获取纬度和经度的最小/最大值。
# getting min, max lat/lng
min_lng = get_min_lng(shape)
min_lat = get_min_lat(shape)
max_lng = get_max_lng(shape)
max_lat = get_max_lat(shape)

图片描述

  • 在其中,随机坐标以均匀方式生成
# generate random float between [min_lng, max_lng)
val1 = numpy_random.uniform(min_lng, max_lng)
# generate random float between [min_lat, max_lat)
val2 = numpy_random.uniform(min_lat, max_lat)

输入图像描述

  • 最终,只有国家形状内部的点被保留下来,外部的点被丢弃。然后生成新的点直到达到用户期望的数量。
# random point generation
while counter != points:
  if random_point.within(shape):
    ...
    list_of_points.append(ran_point)
    counter += 1

在此输入图片描述

版本2 由于废弃点更少,因此版本2的速度提高了20%:

该算法的第一部分实现了拒绝采样方法(如此处所述:https://codereview.stackexchange.com/questions/69833/generate-sample-coordinates-inside-a-polygon)。这个解决方案的硬性约束是它仅适用于凸多边形。 从下面的图片中可以看到,一些点可能会在国家形状之外生成。

在此输入图片描述

要纠正它,然后检查所有点是否位于国家形状内。对于每个在国家外的点,都将生成一个新点。

在此输入图片描述

希望这足够清晰。有关详细信息,请查看代码和github存储库。


1
这真的很有帮助。我刚刚使用它基于位置创建了一个随机Twitter用户名生成器。https://github.com/asimokby/random-twitter-handles_generator 祝你好运! - Asim Okby

2
  1. 从OpenstreetMap下载国家多边形或者使用Google KML或免费GIS工具(如QGIS)自己绘制。将KML导入QGIS并导出为CSV,只保留纬度和经度坐标,最终得到一组WGS84坐标系下的点列表。

  2. 确定国家多边形的最小值和最大值,这将在国家周围创建一个矩形边界框,左下角为minLong、minLat。

  3. 创建一个随机的经度值,范围在minLongitude和maxLongitude之间,并创建一个随机的纬度值。

  4. 检查步骤1中的随机纬度和经度是否在多边形内,如果是,则使用此值并继续进行第3步。

这样可以在国家(多边形)区域内获得随机坐标的均匀分布。

注意:对于跨越数据极限从-180经度跳跃到180的国家,步骤4可能不起作用(容易)。但这通常不是限制。

编辑:为了使任务更加简单,只需使用国家内部的一个矩形部分,您可以手动使用Google Maps或Earth获取该国家的坐标,并从第3步开始。这样,您将不会获得靠近国家边界的点,但是这样更容易。


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