如何使用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。我报告了我发布的在我的机器上生成的 代码。我没有给出明确的免责声明,因为它隐含在我发布的 anyevery 比较中。如果您有数据证明上述数字具有误导性,请发布。 @J.F.Sebastian:如果所有的基准都是邪恶的,你为什么要发布它们?将索引表扫描与全表扫描进行比较而不提及它本质上是一种误导。 @John Machin:谢谢。在这一点上,毫无疑问,上面的非 rtree 查询不会在 latlon 上使用索引,除非 sqlite 隐式创建它。

以上是关于如何使用python在给定纬度和经度周围确定网格数据库中的4个最近相邻点的主要内容,如果未能解决你的问题,请参考以下文章

地理网格搜索算法

如何找到给定纬度/长度以北x km的纬度/经度?

python:使用纬度和经度查找提供位置半径内的位置的优雅方法

如何获取给定纬度和经度的状态(没有地图显示并且需要存储)?

给定初始纬度 lng,距离和方位角,在 php 中查找纬度经度点

如何计算半径内的最大和最小纬度和经度值?