我有一个由数亿个数据点组成的数据集。我希望能够根据缩放级别有效地渲染这样的数据集(即轴比例)。我希望能够有一个采样子集渲染在全视图。当你放大,你将能够看到更详细的数据点,直到你达到最大缩放,这时你就可以看到单独的数据点了。什么样的数据结构才是存储这样一个数据集并允许多分辨率访问的好数据结构呢?
1l5u6lss1#
您需要对点进行空间索引,因为“离群值”和“密度”是空间属性--离群值是碰巧位于低密度区域的点;并且“缩小”将意味着用“采样”点替换靠近点的集合;当你“放大”的时候,你真的很想忽略掉那些落在当前窗口之外的点。你的操作可以是:
void addPoint(Point2D p); void removePoint(Point2D p); Iterator<Point2D> getPointsToPaint(Rectangle2D viewArea, int maxDensity, double densityArea);
其中,viewArea表示要查找点的窗口,maxDensity参数可用于控制点抽象:当超过maxDensity的点落在densityArea正方形内时,您将返回该区域内的maxDensity随机点。getPointsToPaint将使用densityArea采样框覆盖viewArea,并返回以下范围内的点:如果小于maxDensity,则为真实的点,如果大于maxDensity,则为“采样”点(没有人会注意到1 mm 2区域内的10个点是否随机)。典型的空间结构是quad-trees(用于2d)和kd-trees(用于任意数量的ds),然而,在它们的默认实现中,对于快速变化的动态数据来说,这两种结构都不是很好。但您似乎确实需要一种多级方法,而对于多级,树总是可行的方法。从对“* 动态空间索引 *"的搜索结果的快速回顾中,看起来r-tree的一个变体可能就是你正在寻找的。注意这些数据结构不容易从头开始实现。最好的方法可能是依靠外部GIS系统来为您做簿记。有几个Java GISs可用。
viewArea
maxDensity
densityArea
getPointsToPaint
webghufk2#
不是100%确定你在渲染什么样的数据,但我猜你可以做采样并计算近似值,随着你放大你会使近似值越来越准确?
2条答案
按热度按时间1l5u6lss1#
您需要对点进行空间索引,因为“离群值”和“密度”是空间属性--离群值是碰巧位于低密度区域的点;并且“缩小”将意味着用“采样”点替换靠近点的集合;当你“放大”的时候,你真的很想忽略掉那些落在当前窗口之外的点。你的操作可以是:
其中,
viewArea
表示要查找点的窗口,maxDensity
参数可用于控制点抽象:当超过maxDensity的点落在densityArea
正方形内时,您将返回该区域内的maxDensity
随机点。getPointsToPaint
将使用densityArea
采样框覆盖viewArea
,并返回以下范围内的点:如果小于maxDensity
,则为真实的点,如果大于maxDensity
,则为“采样”点(没有人会注意到1 mm 2区域内的10个点是否随机)。典型的空间结构是quad-trees(用于2d)和kd-trees(用于任意数量的ds),然而,在它们的默认实现中,对于快速变化的动态数据来说,这两种结构都不是很好。但您似乎确实需要一种多级方法,而对于多级,树总是可行的方法。从对“* 动态空间索引 *"的搜索结果的快速回顾中,看起来r-tree的一个变体可能就是你正在寻找的。注意这些数据结构不容易从头开始实现。最好的方法可能是依靠外部GIS系统来为您做簿记。有几个Java GISs可用。
webghufk2#
不是100%确定你在渲染什么样的数据,但我猜你可以做采样并计算近似值,随着你放大你会使近似值越来越准确?