从两个表 sqlite python 迭代变量



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

我只需要找到表格和object2_coor表格object1_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)

Sergey,这是一个更结构化代码的场景。一般建议是尝试将代码分成小的、相对独立的、可测试的块。有了这个程序,你更有可能以可维护的程序结束,而不是一些意大利面条。

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)

答案如下,测试了不同的变体。对我来说,重要的是找到所有商店在500米的区域内彼此靠近。迭代次数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

最新更新