Итерация переменных из двух таблиц sqlite python - PullRequest
0 голосов
/ 11 июня 2018

У меня есть две таблицы в базе данных sqlite3 с координатами для разных объектов.Структурированный как id-долгота-широта.Давайте назовем их object1_coor и object2_coor.

Мне просто нужно найти расстояние между каждым объектом в object1_coor таблице и object2_coor таблице.

Как я могу это сделать в Python3?На данный момент я много читал, но не нашел решения для такой итерации.

Я буду использовать для алгоритма расстояния ниже:

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)

Ответы [ 2 ]

0 голосов
/ 15 июня 2018

Сергей, вот скелет для более структурированного кода.Общий совет - попытаться разделить ваш код на небольшие, относительно независимые, тестируемые блоки.При таком подходе вы, скорее всего, закончите с поддерживаемыми программами , а не с некоторыми 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)
0 голосов
/ 12 июня 2018

ответ ниже, опробованы разные варианты.Для меня было важно найти все магазины близко друг к другу на площади 500м. Количество итераций 192 миллиона, время выполнения 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
...