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为事先设定的邻域半径
}
});