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

时间:2017-12-07 10:20:12

标签: python random coordinates geo

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

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

显然,这种方法可以在海洋中或其周围的某处产生一个点。所以我希望能够指定一些地区(例如亚洲)甚至国家,并从该地区获得点数。

是否有任何工具/片段?

3 个答案:

答案 0 :(得分:2)

不得不做类似的事情,但想在这种情况下真正在欧洲传播。

import shapefile
from shapely.geometry import Point, shape
from numpy.random import uniform
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 = (uniform(interval_x), uniform(interval_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

答案 1 :(得分:1)

我正在回答我自己的问题,答案很简单,所以我认为它适用于大多数情况。您需要做的就是:

  1. 下载城市数据库(link,maxmind.com)。它以.gz格式加权33mb,包括3.173.959个有名称和坐标的城市。

  2. 提取.txt文件并随机播放。可以使用简单的命令sort -R worldcitiespop.txt -o shuffled_cities.txt

  3. 来完成
  4. 选择随机行并完成!这是100个随机选择的城市的可视化:

  5. enter image description here

答案 2 :(得分:1)

我有一个类似的用例,由于找不到可用的库,因此开发了这个python库:PyCristoforo。 Github链接:https://github.com/AleNegrini/PyCristoforo

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