使用经纬度生成随机数据

9
我正在尝试生成特定纬度和经度范围内的随机数据。以下代码执行时没有错误并且有输出,但不完全符合我的预期。
程序:
import random
import sys
import math

latitude = 19.99
longitude = 73.78
output_file = 'filename'

def generate_random_data():
    with open(output_file, 'w') as output:
        hex1 = '%012X' % random.randint(0,100)
        flt = float(random.randint(0,100))
        latitude = math.acos(random.random() * 2 - 1)
        longitude = random.random() * math.pi * 2

        output.write('%s %.1f %.6f %.6f \n' % (hex1.lower(), flt, longitude, latitude))

if __name__ == '__main__':
    generate_random_data()

上述代码运行正常,但只给出了一行(这可能是缩进问题),但它没有按照所需的地理位置提供随机的latlong
生成的输出为: 000000000020 95.0 3.929691 1.749931 期望的输出是: 000000000020 95.0 19.999691 73.799931 而且这只生成了一行,而我正在尝试得到百万行

1
随机生成看起来没问题 - 可能导致问题的是"output_file"从未被定义(函数也从未被调用)。 - mprat
1
@Scott,程序已经进行了编辑,因为它显示了你提出的错误。 - user3964336
1
@Scott col [0]col [1]是正确的,但是col [2]col [3]是错误的,分别为4.4846701.712346。我试图在给定的latlong范围内生成,分别为19.9973.78,并且我只得到了一行。 我更改了output.write的缩进。 - user3964336
2
如果您在帖子中创建一些预期输出(纬度和经度范围、行数等),这可能会有所帮助。 - Scott
2
为什么不使用专门的软件包来生成虚假数据,这样您就可以专注于其他更重要的部分。我建议使用Faker - Boggio
显示剩余4条评论
4个回答

11

我认为这就是你想要做的事情。我理解你正在写入文件,我在这里只是为了这个例子而将其去掉。

import random
import sys
import math

latitude = 19.99
longitude = 73.78

def generate_random_data(lat, lon, num_rows):
    for _ in xrange(num_rows):
        hex1 = '%012x' % random.randrange(16**12) # 12 char random string
        flt = float(random.randint(0,100))
        dec_lat = random.random()/100
        dec_lon = random.random()/100
        print '%s %.1f %.6f %.6f \n' % (hex1.lower(), flt, lon+dec_lon, lat+dec_lat)

generate_random_data(latitude, longitude, 5)

打印:

31d831302b7f 99.0 73.789561 19.997404 
c6ef41c70ebb 0.0 73.780732 19.994279 
4bc2df5388e3 77.0 73.785531 19.994191 
e7648f673475 40.0 73.786610 19.993679 
a11502c744a6 32.0 73.784650 19.997702 

编辑:因此,您的函数包括写入文件将如下所示。

import random
import sys
import math

latitude = 19.99
longitude = 73.78
file_n = 'random_lat_lon.txt'

def generate_random_data(lat, lon, num_rows, file_name):
    with open(file_name, 'w') as output:
        for _ in xrange(num_rows):
            hex1 = '%012x' % random.randrange(16**12)                
            flt = float(random.randint(0,100))
            dec_lat = random.random()/100
            dec_lon = random.random()/100
            output.write('%s %.1f %.6f %.6f \n' % (hex1.lower(), flt, lon+dec_lon, lat+dec_lat))

generate_random_data(latitude, longitude, 5, file_n)

将以上编辑后的数据生成到名为'random_lat_lon.txt'的文件中。


1
@SitzBlogz 最后一件事:如果您的意图是让 hex1 成为唯一标识符,那么使用 '%012X' % random.randint(0,100) 并不能实现。如果您想要生成 12 个字符的随机字符串,请改用以下代码:'%012x' % random.randrange(16**12)。实际上,我会更新我的答案并包含这个建议。 - Scott
我们可以随机生成时间序列吗?比如开始时间 HH:MM:SS 和结束时间 HH:MM:SS?我的意思是在两个新的列中。 - user3964336
2
我开始写了一些东西,但是搜索后发现https://dev59.com/WXRB5IYBdhLWcg3wro6B#553320。所以你可以做类似于`s = '07:00:00' e = '16:45:00' f = '%H:%M:%S'strTimeProp(s, e, f, random.random())的事情。例如,这可能会给你12:39:14`。如果您在将其集成到上面的函数中遇到任何问题,请将其作为新问题发布,我会尝试在其他人之前回答 :) - Scott

2
你需要在某个地方调用你的函数。
通常,在Python中,你需要做如下操作:
if __name__ == '__main__':
  generate_random_data()

1
在调用此函数后,出现了“Output_file未定义”的错误。 - user3964336
所以..定义它。output_file = "toto.txt" 另外,random()函数不接受任何参数。 - David Dahan
1
谢谢,初始问题已解决,程序已编辑,请检查一下。 - user3964336

1
我修改了@Scott的回答,以创建CSV文件而不是txt文件:
import random
import sys
import math

latitude = 0.794501
longitude = -0.752568
file_n = 'random_lat_lon.csv'

def generate_random_data(lat, lon, num_rows, file_name):
    with open(file_name, 'w') as output:
        for _ in xrange(num_rows):
            hex1 = '%012x' % random.randrange(16**12)                
            flt = float(random.randint(0,100))
            dec_lat = random.random()/100
            dec_lon = random.random()/100
            output.write('%s,%.1f,%.6f,%.6f \n' % (hex1.lower(), flt, lon+dec_lon, lat+dec_lat))

generate_random_data(latitude, longitude, 600, file_n)

0

这是我使用NumPy的版本:

import numpy as np

def random_lat_lon(n=1, lat_min=-90., lat_max=90., lon_min=-180., lon_max=180.):
    """
    this code produces an array with pairs lat, lon
    """
    lat = np.random.uniform(lat_min, lat_max, n)
    lon = np.random.uniform(lon_min, lon_max, n)

    return np.array(tuple(zip(lat, lon)))

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