我有一个名为coords的表,其中以下各列|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进行此类查询?
对不起,代码,但是格式有问题。
最佳答案
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()
full example with rtree index
注意:此代码不包含边界。
对于非常有效的范围查询,如果有数百万个坐标,则可能需要SQLite R-Tree index。
对于1000000个条目,上述方法花费〜0.16秒,但是使用rtree的函数需要不到1ms的时间。对于10000个条目,它是800 µs,而对于基于rtree的测试数据解决方案则是20 µs。免责声明:这些数字是我在计算机上运行的已发布代码的。