找到交叉点

时间:2010-01-14 05:23:03

标签: python performance algorithm optimization localization

考虑到有数百万个可能重叠的可变大小的边界框减去宽度为5km的情况。

使用参数findIntersections(Longitude,Latitude,Radius)创建一个快速函数,输出是这些边界框id的列表,其中每个边界框原点位于函数参数尺寸的周边内。

如何优雅地解决这个问题?

3 个答案:

答案 0 :(得分:4)

这通常使用R-tree数据结构

完成

像mysql或postgresql这样的dbs都有GIS模块,它们使用引擎盖下的r树快速检索地图上某点附近的位置。

来自http://en.wikipedia.org/wiki/R-tree

  

R树是树数据结构   类似于B树,但是被使用   用于空间访问方法,即用于   索引多维   信息;例如,(X,Y)   地理数据坐标。一个   R树常见的实际用法   可能是:“查找2中的所有博物馆   我目前的公里(1.2英里)   位置”。

     

数据结构用空格分割空间   分层嵌套,可能   重叠,最小边界   矩形(MBR,也称为   什么。边界框,即“矩形”   R树中的“R”代表)。

Priority R-Tree(PR-tree)是一种变体,其最长运行时间为:

"O((N/B)^(1-1/d)+T/B) I/Os, where N is the number of d-dimensional (hyper-)
rectangles stored in the R-tree, B is the disk block size, and T is the output
size."

在实践中,大多数现实世界的查询都会有更快的平均案例运行时间。

fyi,除了发布的其他优秀代码之外,还有一些很酷的内容,例如SpatiaLiteSQLite R-tree module

答案 1 :(得分:1)

PostGIS是postgresql的开源GIS扩展。

他们有ST_IntersectsST_Intersection个功能。

如果你感兴趣的话,你可以四处寻找,看看它是如何实现的:

http://svn.osgeo.org/postgis/trunk/postgis/

答案 2 :(得分:0)

这似乎是一种更好的更通用的方法GiST

http://en.wikipedia.org/wiki/GiST