【问题标题】:Generate random data with lat-long使用 lat-long 生成随机数据
【发布时间】:2015-07-26 14:33:46
【问题描述】:

我正在尝试生成具有特定纬度和经度范围的随机数据。下面的代码执行没有错误,也产生了输出,但不完全符合我的预期。

程序:

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()

上面的代码运行但只给出了一行(这可能是缩进问题)但这并没有给我随机的lat & long 如上所述的所需地理位置。

生成的输出:

000000000020 95.0 3.929691 1.749931

预期输出: 000000000020 95.0 19.999691 73.799931

这只会生成one 行,而我试图拥有million

【问题讨论】:

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

标签: python math random latitude-longitude


【解决方案1】:

这是我的版本:

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)))

【讨论】:

    【解决方案2】:

    我修改了@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)
    

    【讨论】:

      【解决方案3】:

      我认为这就是你想要做的。我了解您正在写入文件;为了这个例子,我在这里把它去掉了。

      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)
      

      它将 EDIT 上方发布的数据生成到名为“random_lat_lon.txt”的文件中。

      【讨论】:

      • @SitzBlogz 最后一件事:如果您的意图是 hex1 是一个唯一标识符,那么 '%012X' % random.randint(0,100) 将无法完全理解。如果您想要 12 个字符的随机字符串,请改为:'%012x' % random.randrange(16**12)。事实上,我会更新我的答案以包括这一点。
      • 我们可以让时间序列也随机生成吗?比如开始时间HH:MM:SS和结束时间HH:MM:SS?我的意思是在两个新专栏中说。
      • 我开始写东西,但后来搜索并找到了stackoverflow.com/a/553320/4663466。所以你可以做类似s = '07:00:00' e = '16:45:00' f = '%H:%M:%S'strTimeProp(s, e, f, random.random()) 的事情。例如可以给你12:39:14。如果您在将其集成到上面的函数中遇到任何问题,请将其作为一个新问题发布,我会尝试在其他人之前回答:)
      【解决方案4】:

      你需要在某个地方调用你的函数。

      通常,在 Python 中,您会执行以下操作:

      if __name__ == '__main__':
        generate_random_data()
      

      【讨论】:

      • 调用此函数后输出文件未定义错误
      • 所以..定义它。 output_file = "toto.txt" 加上 random() 函数不带参数。
      • 谢谢 .. 初步解决的问题程序已编辑,请检查一次
      猜你喜欢
      • 2021-05-13
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      相关资源
      最近更新 更多