RTree 学习

1.创建RTree 使用静态构造方法

RTree<String, Geometry> tree = RTree.create();

如果确定RTree存储的类型例如Point,则可以指定类型创建

RTree<String, Point> tree = RTree.create();

2.添加结点到Rtree,需要指定该结点的平面位置或范围。Geometries提供了以下几种构造结点的方法

  • Geometries.rectangle
  • Geometries.circle
  • Geometries.point
  • Geometries.line (requires jts-core dependency)

添加方式

tree = tree.add(item, Geometries.point(10,20));
or

tree = tree.add(Entry.entry(item, Geometries.point(10,20));

3.从RTree移除一个结点需要匹配item和geometry

tree = tree.delete(item, Geometries.point(10,20));

or

tree = tree.delete(entry);

4.构造与经纬度相关的位置结点,geometry提供特别的构造方法

Point point = Geometries.pointGeographic(lon, lat);
Rectangle rectangle = Geometries.rectangleGeographic(lon1, lat1, lon2, lat2);

5.RTree的强大之处在于它搜索位置的快速能力,平均搜索时间复杂度为O(log(n)),最差为 O(n)

给定一个查询矩形,返回与查询矩形向重叠的entry

Observable<Entry<T, Geometry>> results =
    tree.search(Geometries.rectangle(0,0,2,2));
或者搜索距离给定区域一定距离

Observable<Entry<T, Geometry>> results =
    tree.search(Geometries.rectangle(0,0,2,2),5.0);

返回RTree的所有结点

Observable<Entry<T, Geometry>> results = tree.entries();


返回距离给定点距离不超过maxDistance的所有entry

publicObservable<Entry<T,S>> search(finalPoint p, final double maxDistance) {
return search(p.mbr(), maxDistance);
}

搜索指定点指定邻域半径的entry,先构造查询窗口,再filter过滤

示例

Rectangle bounds = createBounds(from,eps);   //构造查询窗口
        return tree
                // do the first search using the bounds
                .search(bounds)
                // refine using the exact distance
                .filter(new Func1, Boolean>() {
                    @Override
                    public Boolean call(Entry entry) {
                        Point p = entry.geometry();
                        Position position = Position.create(p.y(), p.x());
                        double dis = from.getDistanceToKm(position);
                        return dis< eps;    //eps为事先设定的邻域半径                   
                    }
                });




你可能感兴趣的:(hadoop)