2010-01-14 76 views
2

给定一个场景,其中有数百万个可能重叠的边界框,其大小可变,宽度小于5km。查找交叉点

使用参数findIntersections(Longitude,Latitude,Radius)创建一个快速函数,输出是边界框id的列表,其中每个边界框原点位于函数参数维度的外围。

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

回答

4

这是通过使用一个R-tree数据结构

DBS像MySQL或PostgreSQL正常完成具有使用R树引擎盖下快速检索一个一定距离以内的位置在地图上的一个点GIS模块。

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

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

的数据结构分割空间 分级嵌套的,并且可能 重叠,最小边界 矩形(MBR,否则称为 边界框,即,“矩形”,在什么 的“R” R-树代表)。

Priority R-Tree(PR-树)是具有最大运行时间变体:

"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." 

在实践中,大多数现实世界的查询将有一个情况要快得多平均运行时间。

仅供参考,除了张贴的其他伟大的代码,有没有像SpatiaLiteSQLite R-tree module

+0

是有可能tweek它使得仅返回具有其中心重叠的边界框。嗯似乎问题是关于点而不是矩形。我想通过将矩形减少到一个点,可以使用相同的技术.... – Setori

+0

的确,您可以检查原点是否在半径范围内。(否则,如果问题要求整个矩形在该地区,你必须检查所有4个角) – jspcal

1

PostGIS一些很酷的东西是一个开源GIS extention PostgreSQL的。

他们有ST_IntersectsST_Intersection功能可用。

如果你有兴趣,你可以挖过来,看看它是如何实现的有:

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

+0

伟大的,谢谢你。看起来像一个相当全面的实现。我会进一步挖掘,谢谢你的时间。 – Setori

+0

关于相交,我需要的是那种函数,它返回一个对象列表。但我想这可以作为抽象的一部分。 *笑容* – Setori