【问题标题】:Iterate variables from two tables sqlite python从两个表sqlite python中迭代变量
【发布时间】:2018-06-11 20:47:24
【问题描述】:

我在 sqlite3 数据库中有两个表,其中包含不同对象的坐标。结构类似于 id-longtitude-latitude。让我们将它们命名为 object1_coorobject2_coor

我只需要找到object1_coor 表和object2_coor 表中每个对象之间的距离。

如何在 Python 3 中做到这一点?到目前为止,我已经阅读了很多,但没有找到这种迭代的解决方案。

我将在下面使用距离算法:

obj1_lat = radians(float(obj1_lat)))
obj1_lon = radians(float(obj1_lon)))
obj2_lat = radians(float(obj2_lat)))
obj2_lon = radians(float(obj2_lon)))

dist = 6371.01 * acos(sin(obj1_lat)*sin(obj2_lat) + cos(obj1_lat)*cos(obj2_lat)*cos(obj1_lon - obj2_lon))
print("The distance is " % dist)

【问题讨论】:

  • 如果您的坐标位于两个列表中,您将采用相同的方式:创建列表的所有唯一组合并生成每个组合的距离。
  • 但是我想在迭代过程中检查距离对我来说是否合适,如果是的话,把它放在另一个表中。你的观点听起来不错,但请你帮忙写代码,我不明白如何并行读取和迭代两个表。 sql 请求和游标中的难点
  • 你不会遍历这两个表;您将遍历单个选择查询。您可以在两个表之间进行交叉连接并只获取不同的结果;这应该会给你所有可能的组合。
  • 如果您需要将结果放入一个单独的表格中,那么您很可能需要一个本地函数来计算距离,因此您只需使用距离函数输出填充一个表格。你也可以用 Python 来做,但是有点往返。
  • 谢谢,我明白你的意思,将尝试 snd 分享结果

标签: python python-3.x sqlite iteration


【解决方案1】:

Sergey,这里有一个更结构化的代码。一般建议是尝试将您的代码分成小的、相对独立的、可测试的块。使用这种方法,您更有可能以maintainable programs 而不是spagretti 结尾。

def get_coordinates_cross_join():
    """Return a list of coordiantes"""
    # this may have namedtuples as a result
    pass    

def distance(a, b):
    """Calculate distance between points *a* and *b*."""
    pass

def insert(a, b):
    #insert a and b into database
    pass

# this can be main()    
for a, b in get_coordinates_cross_join():
    if distance(a, b) < 0.5:
        insert(a, b)

【讨论】:

【解决方案2】:

答案如下,测试了不同的变体。对我来说,在 500m 的区域内找到所有彼此靠近的商店很重要。迭代次数 1.92 亿,执行时间 246 秒。

    cur.execute('SELECT * FROM A_Coor CROSS JOIN B_Coor')
data = cur.fetchall() # read all databse

for coo in data:
    obj1_lat = radians(float(coo[1]))
    obj1_lon = radians(float(coo[2]))
    obj2_lat = radians(float(coo[5]))
    obj2_lon = radians(float(coo[6]))
    try:
        dist = 6371.01 * acos(sin(obj1_lat)*sin(obj2_lat) + cos(obj1_lat)*cos(obj2_lat)*cos(obj1_lon - obj2_lon))
        if dist < 0.5:
            print(" The distance is %.2fkm." % dist)
            near_pos = (coo[0], coo[1], coo[2], coo[3], coo[4], coo[5], coo[6], dist)
            cur.execute("INSERT INTO fivehundred_stores (pos_cli, lat_mag, lon_mag, fake_id, pka_id, lat_pka, lon_pka, distance) VALUES (?, ?, ?, ?, ?, ?, ?, ?);", near_pos)
            near_pos = []
            con.commit()
    except:
        error_comb = []
        error_comb =(coo[0], coo[4])
        print (error_comb)
        error_comb = []
        pass

【讨论】:

  • 光秃秃的除外?还有为什么不将您的读/写和距离计算功能分开。看起来有点乱。
  • 非常感谢您的评论,但我不能完全理解您,这是我在 python 上的第二个程序,如果您能告诉我如何以更流畅的方式重新编写它,那就太好了.
  • 请看我的回答
  • 嗯,好的,明白了。最好先定义函数,通过程序来使用
  • 除了将脚本拆分为函数之外,还要注意抽象级别 - 例如数据导入和导出是支持任务,您应该能够更改数据源以及将结果导出到的位置在不损害您数据转换的核心逻辑的情况下,我认为记住这一点很重要。
猜你喜欢
  • 2010-11-17
  • 2016-03-15
  • 2019-11-28
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 2016-11-11
相关资源
最近更新 更多