美国随机坐标的生成(使用最大城市数据集)
Generation of random coordinates in the USA (with the use of the biggest cities dataset)
早上好,
对于我的项目,我需要以纬度和经度对的形式生成随机坐标,其中生成的坐标需要在美国边界内,理想情况下,坐标出现的概率更高在美国最大的城市附近生成。我有一个 CSV 数据集,其中包含这些城市及其人口的坐标。
总而言之,我希望我的坐标在大城市附近以更高的概率生成,但有时我也希望它们在农村地区生成。
我正在使用 Python,Python 的所有库都可以使用。我可以做的一种选择是在围绕美国的矩形中生成随机坐标,但不知何故我还需要考虑城市数据集。
给定:一个 CSV 数据集,其中包含美国城市及其人口的坐标。
查找:经纬度对形式的随机坐标,其中生成的坐标需要在美国境内,理想情况下,坐标生成在最大城市附近的概率更高在美国
这是一个方法。
- 将城市数据的csv文件读入pandas数据框
- 对数据帧进行采样以获得一组随机城市
- 随机 select 此样本中的城市列表,用于城市纬度、经度。
- 随机select第二个城市列表,select这些城市一次2个,并计算与每个城市等距的点作为农村点。
以下代码说明了这种方法:
import pandas as pd
import random as rnd
from collections import namedtuple
cities = r'DataFiles/uscities.csv'
Point = namedtuple('Point','lat, lng')
def pickRandomPoints(city_file: str, city_count: int, rural_count: int) -> list():
"""Return a list of lat, lng tuples that is city_count + rural_count long"""
qty = 5*(city_count+ rural_count)
rslt = []
city_df = pd.read_csv(cities)[['city', 'lat', 'lng', 'population']].sample(qty)
city_list = rnd.choices(list(city_df['city']), k= city_count)
# Add city lat & lngs
for city in city_list:
pt = Point(city_df[ city_df['city'] == city]['lat'].values[0],
city_df[ city_df['city'] == city]['lng'].values[0])
rslt.append((city_df[ city_df['city'] == city]['lat'].values[0],city_df[ city_df['city'] == city]['lng'].values[0]))
rural_list = rnd.choices(list(city_df['city']), k=2*rural_count)
for rp in range(1, len(rural_list)):
pta = Point(city_df[ city_df['city'] == rural_list[rp-1]]['lat'].values[0],
city_df[ city_df['city'] == rural_list[rp-1]]['lng'].values[0])
ptb = Point(city_df[ city_df['city'] == rural_list[rp]]['lat'].values[0],
city_df[ city_df['city'] == rural_list[rp]]['lng'].values[0])
newpt = Point(round(pta.lat + (ptb.lat - pta.lat)/2, 4), round(pta.lng + (pta.lng - ptb.lng)/2,4))
rslt.append((newpt.lat, newpt.lng))
return rslt
例如运行这段代码如下:
pickRandomPoints(cities, 10, 5)
产量:
[(40.4968, -77.7283),
(35.1639, -78.7371),
(37.7941, -95.15),
(33.1481, -88.1757),
(41.9555, -88.5292),
(48.5707, -110.0862),
(37.7668, -108.9071),
(37.3042, -113.6658),
(40.8358, -81.0649),
(35.4671, -78.1613),
(35.744, -122.0233),
(39.924, -103.4567),
(43.4704, -102.7324),
(44.4596, -71.6226),
(43.488, -131.5072),
(40.0874, -95.6023),
(37.5124, -59.5604),
(40.6303, -91.1167),
(36.0781, -142.8842)]
早上好,
对于我的项目,我需要以纬度和经度对的形式生成随机坐标,其中生成的坐标需要在美国边界内,理想情况下,坐标出现的概率更高在美国最大的城市附近生成。我有一个 CSV 数据集,其中包含这些城市及其人口的坐标。
总而言之,我希望我的坐标在大城市附近以更高的概率生成,但有时我也希望它们在农村地区生成。
我正在使用 Python,Python 的所有库都可以使用。我可以做的一种选择是在围绕美国的矩形中生成随机坐标,但不知何故我还需要考虑城市数据集。
给定:一个 CSV 数据集,其中包含美国城市及其人口的坐标。
查找:经纬度对形式的随机坐标,其中生成的坐标需要在美国境内,理想情况下,坐标生成在最大城市附近的概率更高在美国
这是一个方法。
- 将城市数据的csv文件读入pandas数据框
- 对数据帧进行采样以获得一组随机城市
- 随机 select 此样本中的城市列表,用于城市纬度、经度。
- 随机select第二个城市列表,select这些城市一次2个,并计算与每个城市等距的点作为农村点。
以下代码说明了这种方法:
import pandas as pd
import random as rnd
from collections import namedtuple
cities = r'DataFiles/uscities.csv'
Point = namedtuple('Point','lat, lng')
def pickRandomPoints(city_file: str, city_count: int, rural_count: int) -> list():
"""Return a list of lat, lng tuples that is city_count + rural_count long"""
qty = 5*(city_count+ rural_count)
rslt = []
city_df = pd.read_csv(cities)[['city', 'lat', 'lng', 'population']].sample(qty)
city_list = rnd.choices(list(city_df['city']), k= city_count)
# Add city lat & lngs
for city in city_list:
pt = Point(city_df[ city_df['city'] == city]['lat'].values[0],
city_df[ city_df['city'] == city]['lng'].values[0])
rslt.append((city_df[ city_df['city'] == city]['lat'].values[0],city_df[ city_df['city'] == city]['lng'].values[0]))
rural_list = rnd.choices(list(city_df['city']), k=2*rural_count)
for rp in range(1, len(rural_list)):
pta = Point(city_df[ city_df['city'] == rural_list[rp-1]]['lat'].values[0],
city_df[ city_df['city'] == rural_list[rp-1]]['lng'].values[0])
ptb = Point(city_df[ city_df['city'] == rural_list[rp]]['lat'].values[0],
city_df[ city_df['city'] == rural_list[rp]]['lng'].values[0])
newpt = Point(round(pta.lat + (ptb.lat - pta.lat)/2, 4), round(pta.lng + (pta.lng - ptb.lng)/2,4))
rslt.append((newpt.lat, newpt.lng))
return rslt
例如运行这段代码如下:
pickRandomPoints(cities, 10, 5)
产量:
[(40.4968, -77.7283),
(35.1639, -78.7371),
(37.7941, -95.15),
(33.1481, -88.1757),
(41.9555, -88.5292),
(48.5707, -110.0862),
(37.7668, -108.9071),
(37.3042, -113.6658),
(40.8358, -81.0649),
(35.4671, -78.1613),
(35.744, -122.0233),
(39.924, -103.4567),
(43.4704, -102.7324),
(44.4596, -71.6226),
(43.488, -131.5072),
(40.0874, -95.6023),
(37.5124, -59.5604),
(40.6303, -91.1167),
(36.0781, -142.8842)]