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<Entry<T, Point>, Boolean>() {
                    @Override
                    public Boolean call(Entry<T, Point> entry) {
                        Point p = entry.geometry();
                        Position position = Position.create(p.y(), p.x());
                        double dis = from.getDistanceToKm(position);
                        return dis< eps;    //eps为事先设定的邻域半径                   
                    }
                });




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值