Как определить 4 ближайших соседних точки в базе данных сетки вокруг заданной широты и долготы, используя python - PullRequest
2 голосов
/ 16 октября 2011

У меня есть таблица с координатами со следующими столбцами |name|lat|lon|und|

import sqlite3
database = sqlite3.connect('geoida.db')
cursor = database.cursor()
cursor.execute("select lat, lon, und  from coords")
results = cursor.fetchall()

каждая строка в таблице хранит координаты одной точки сетки и расстоянияот точки к точке всегда в десятичном виде 0,041667 , что равно 2,5 ''.
Чего я хотел бы добиться, так это найти 4 ближайших соседних точки вокруг заданной широты и долготы в десятичном виде.Мы должны помнить, что широта и долгота этих четырех точек должны заполнять довольно простое условие:
превышение между широтой, долготой соседней точки и широтой, долгота
данной точки должна быть меньше / равна 0,041667 на +или -
, или мы можем трактовать это значение как максимальный радиус, делящий искомые соседние точки от заданной.

, например:

для данной точки 56.02050000 13.02040000
4 ближайших соседних точкивзяты из моей таблицы координат:

56.000000   13.000000
56.000000   13.041667
56.041667   13.000000
56.041667   13.041667

Данные точки хранятся в другой базе данных, где C1 - широта, а C2 - долгота

database = sqlite3.connect('F.tsj')
cursor = database.cursor()
cursor.execute("select C1, C2 from tblSoPoints")
results = cursor.fetchall()

Как я могу поставить такой запросиспользуя python?
Извините за код, но что-то не так с форматированием.

1 Ответ

2 голосов
/ 16 октября 2011
def find_adjacent_coords(db, lat, lon, step=0.041667):
    """Find coords that are in a +/- step range of lat, lon."""
    #XXX disregard values near +/- 90 latitude, +/- 180 longitude
    coords_range = lat-step, lat+step, lon-step, lon+step
    return db.execute("""select lat, lon from coords where 
lat > ? and lat < ? and
lon > ? and lon < ?""", coords_range).fetchall()

полный пример с индексом rtree

Примечание: этот код не включает границы.

Для очень эффективных запросов диапазона, если существуют миллионы координат, вам может понадобиться Индекс R-дерева SQLite .

Для 1000000 записей вышеуказанный подход занимает ~ 0,16 секунды, но функция, которая использует rtree, требует менее 1 мс. Для 10000 записей это 800 мкс против 20 мкс для rtree-решения для данных теста. ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Цифры указаны для кода , который я разместил на своем компьютере.

...