如何使用python在给定纬度和经度周围确定网格数据库中的4个最近相邻点
Posted
技术标签:
【中文标题】如何使用python在给定纬度和经度周围确定网格数据库中的4个最近相邻点【英文标题】:How to determine 4 nearest adjacent points in grid database around given latitude and longitude using python 【发布时间】:2011-12-08 17:05:09 【问题描述】:我有一个名为 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()
表格中的每一行存储 g r i d 的一个点的坐标,点到点的距离总是十进制 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 进行这样的查询? 抱歉,代码格式有问题。
【问题讨论】:
看这个答案***.com/a/12997900/779408 【参考方案1】: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 的函数需要不到 1 毫秒。对于 10000 个条目,测试数据的基于 rtree 的解决方案为 800 µs 与 20 µs。免责声明:这些数字适用于我发布的在我的机器上运行的代码。
【讨论】:
@J.F. Sebastian:-1 为了公平比较,没有 R-tree 索引的实验应该有一个纬度或经度索引。 @John Machin:所有的基准测试都是邪恶的。没有公平比较之类的东西,例如,从计算机语言基准游戏中阅读 how difficult it can be to make meaningful comparisons。我报告了我发布的在我的机器上生成的 代码。我没有给出明确的免责声明,因为它隐含在我发布的 any 和 every 比较中。如果您有数据证明上述数字具有误导性,请发布。 @J.F.Sebastian:如果所有的基准都是邪恶的,你为什么要发布它们?将索引表扫描与全表扫描进行比较而不提及它本质上是一种误导。 @John Machin:谢谢。在这一点上,毫无疑问,上面的非 rtree 查询不会在lat
或 lon
上使用索引,除非 sqlite 隐式创建它。以上是关于如何使用python在给定纬度和经度周围确定网格数据库中的4个最近相邻点的主要内容,如果未能解决你的问题,请参考以下文章
python:使用纬度和经度查找提供位置半径内的位置的优雅方法