为特定地区/国家生成随机坐标的轻量级工具?
Lightweight tool for generating random coordinates for specific region / country?
目前,我仅使用 random
模块生成地理位置:
from random import uniform
geo_position = (uniform(-90, 90), uniform(-180, 180))
显然,这种方法可以在海洋某处或附近产生一个点。所以我希望能够指定一些区域(例如亚洲)甚至国家并从该区域获取点。
这个有tools/snippets吗?
我在回答我自己的问题,答案很简单,所以我认为它适用于大多数情况。您需要做的就是:
下载城市数据库(link、maxmind.com)。它以 .gz 格式重 33mb,包括 3.173.959 个具有名称和坐标的城市。
提取 .txt
文件并打乱行。可以用一个简单的命令 sort -R worldcitiespop.txt -o shuffled_cities.txt
来完成
Select随机线就搞定了!这是 100 个随机选择的城市的可视化:
不得不做类似的事情,但在这种情况下希望在欧洲真正统一传播。
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)
我有一个类似的用例,由于我没有找到任何可用的库,所以我开发了这个 python 库:PyCristoforo。 Github link: https://github.com/AleNegrini/PyCristoforo
1.0.0版本仅支持欧洲国家,但我计划很快发布其他国家。
目前,我仅使用 random
模块生成地理位置:
from random import uniform
geo_position = (uniform(-90, 90), uniform(-180, 180))
显然,这种方法可以在海洋某处或附近产生一个点。所以我希望能够指定一些区域(例如亚洲)甚至国家并从该区域获取点。
这个有tools/snippets吗?
我在回答我自己的问题,答案很简单,所以我认为它适用于大多数情况。您需要做的就是:
下载城市数据库(link、maxmind.com)。它以 .gz 格式重 33mb,包括 3.173.959 个具有名称和坐标的城市。
提取
.txt
文件并打乱行。可以用一个简单的命令sort -R worldcitiespop.txt -o shuffled_cities.txt
来完成
Select随机线就搞定了!这是 100 个随机选择的城市的可视化:
不得不做类似的事情,但在这种情况下希望在欧洲真正统一传播。
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)
我有一个类似的用例,由于我没有找到任何可用的库,所以我开发了这个 python 库:PyCristoforo。 Github link: https://github.com/AleNegrini/PyCristoforo
1.0.0版本仅支持欧洲国家,但我计划很快发布其他国家。