轻量级工具用于生成特定地区/国家的随机坐标?

5

目前,我只使用random模块生成地理位置:

from random import uniform
geo_position =  (uniform(-90, 90), uniform(-180, 180))

显然,这种方法可能会在海洋某处或附近产生一个点。因此,我希望能够指定一些区域(例如亚洲)甚至是国家,并从该地区获取该点。

是否有任何工具/代码片段可实现此功能?


你是在生成具有均匀分布的球面上的随机位置吗?!? - Stéphane
@Stéphane 是的。这是错误的方式吗? - Sergey Potekhin
假设你要在冰岛随机生成一个位置,你想用它做什么? - Bill Bell
3个回答

4

我有一个类似的用例,因为没有找到可用的库,所以开发了这个Python库:PyCristoforo。Github链接:https://github.com/AleNegrini/PyCristoforo

版本1.0.0仅支持欧洲国家,但我计划很快发布其他国家的版本。


厉害。它能被修改以获取比如说n个在印度洋或北极洋的随机坐标吗? - Pixel_Bear
1
由于时间不足,我目前无法继续维护该项目。但是,您可以fork它 :) - anegrini

4

我曾经也需要做类似的事情,但这次希望在欧洲范围内真正实现统一分布。

import shapefile
from shapely.geometry import Point, shape
import numpy as np
from collections import Counter 

shp = shapefile.Reader('shapefiles/TM_WORLD_BORDERS-0.3.shp')
# Adjust for your case:
EU3 = ['ARM', 'BIH', 'BIH', 'CYP', 'DNK', 'IRL', 'AUT', 'EST', 'CZE', 'FIN' 
      , 'FRA', 'DEU', 'GRC', 'HRV', 'HUN', 'ISL', 'ITA', 'LTU', 'LVA', 'BLR'
      , 'MLT', 'BEL', 'AND', 'GIB', 'LUX', 'MCO', 'NLD', 'NOR', 'POL', 'PRT'
      , 'ROU', 'MDA', 'ESP', 'CHE', 'GBR', 'SRB', 'SWE', 'ALB', 'MKD', 'MNE'
      , 'SVK', 'SVN'] # 'TUR'
EU = [(boundary, record) for boundary, record in 
             zip(shp.shapes(), shp.records()) if record[2] in EU3]

# Adjust the borders 
count = Counter()  # small optimisation to check for big shapes first
def sample(shapes, min_x=-11, max_x=26, min_y=37, max_y=71):
    while True:
        point = (np.random.uniform(min_x, max_X), np.random.uniform(min_y, max_y)) 
        for boundary, record in sorted(shapes, key=lambda x: -count[x[1][2]]):
            if Point(point).within(shape(boundary)): 
                count[record[2]] += 1
                return point 

这将为您提供所需的样本。 下面是来自欧洲的5000点样本的图表。 要获取一个样本,请使用
sample(EU)

Showcase


请问您能否编辑一下您的代码,说明一下'interval_x'和'interval_y'的含义是什么? - Vandan Revanur
改变了这行代码 :) - Roelant
你能否也加上绘制这5000个点的代码呢?我在图例显示错误的国家方面遇到了麻烦。如果您能添加绘制这5000个点的代码,那将非常有帮助。 - Vandan Revanur

1
我正在回答自己的问题,答案非常简单,所以我认为它在大多数情况下都有效。您需要做的就是:
  1. 下载城市数据库(link,maxmind.com)。它以.gz格式重达33MB,包括3,173,959个城市及其名称和坐标。

  2. 提取.txt文件并随机排序行。可以使用简单的命令sort -R worldcitiespop.txt -o shuffled_cities.txt来完成。

  3. 选择随机行,完成!以下是100个随机选定城市的可视化:

enter image description here


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