多分辨率图的良好数据结构是什么?

时间:2013-11-20 13:14:31

标签: java data-structures

我有一个由数亿个数据点组成的数据集。我希望能够根据缩放级别(即轴刻度)有效地渲染这样的一组。我希望能够在完整视图中进行采样子集渲染。放大时,您将能够看到更详细的数据点,直到达到最大缩放,此时您将能够看到单个数据点。存储这样的数据集并允许多分辨率访问的良好数据结构是什么?

2 个答案:

答案 0 :(得分:2)

你需要保持你的点在空间上被索引,因为“异常值”和“密度”是空间属性 - 异常值恰好是在低密度区域;并且“缩小”意味着替换“采样”点的多组近点;当你真的“放大”时,你真的想忽略那些落在当前窗口之外的点。您的操作可能类似于:

void addPoint(Point2D p);
void removePoint(Point2D p);
Iterator<Point2D> getPointsToPaint(Rectangle2D viewArea, int maxDensity, double densityArea);

其中viewArea表示要为其找到点的窗口,maxDensity参数可用于控制点抽象:当超过maxDensity点落在densityArea平方内时,你会在该区域内返回maxDensity个随机点。 getPointsToPaintviewArea覆盖densityArea个采样框,并返回以下内容:如果小于maxDensity则为真实点,如果超过{{1}则为“已取样” 1}}(如果1mm2区域内的10个点是随机的,则没有人会注意到。)

典型的空间结构是quad-trees(对于2d)和kd-trees(对于任意数量的ds)。但是,在默认实现中,它们都不适合快速更改动态数据。另一种选择是使用spatial hashing;但是你似乎真的需要一种多层次的方法,而对于多层次来说,树木总是要走的路。通过快速查看“动态空间索引”的搜索结果,似乎r-tree的变体可能就是您要查找的内容。请注意,这些数据结构不容易从头开始实现。最好的方法可能是依靠外部GIS系统为您进行簿记。有几个Java GISs可用。

答案 1 :(得分:0)

不是100%确定你正在渲染什么样的数据,但我猜你可以进行采样并计算近似值,当你放大时你会使近似值越来越准确吗?