如何使用Python确定给定经纬度周围4个最近相邻点

2 投票
1 回答
1710 浏览
提问于 2025-04-17 04:25

我有一个叫做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个最近的点。我们需要记住,这4个点的经纬度必须满足一个简单的条件:
相邻点的纬度和经度与给定点的纬度和经度之间的差值必须小于或等于0.041667,无论是加还是减。
我们可以把这个值看作是从给定点出发,寻找邻近点的最大半径。

举个例子:

对于给定的点 56.02050000 13.02040000
从我的coords表中找到的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 个回答

3
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索引

注意:这个代码没有包含边界。

如果你有几百万个坐标,并且想要快速查询范围,可能需要用到SQLite的R-Tree索引

对于1000000条数据,上面的做法大约需要0.16秒,但使用rtree的函数只需要不到1毫秒。对于10000条数据,普通方法是800微秒,而基于rtree的方法只需20微秒。免责声明:这些数字是我在我的机器上运行的代码得到的结果。

撰写回答