RTree判断点在多边形内-Java版本
1.什么是RTree
2.RTree java依赖
rtree的java开源版本在GitHub上:https://github.com/davidmoten/rtree
上面有详细的使用说明
最新版本的maven依赖可在中央仓库查到:https://mvnrepository.com/artifact/com.github.davidmoten/rtree
这里我们使用0.8.7版本
<!-- https://mvnrepository.com/artifact/com.github.davidmoten/rtree -->
<dependency>
<groupId>com.github.davidmoten</groupId>
<artifactId>rtree</artifactId>
<version>0.8.7</version>
</dependency>
3.使用
3.1创建R树
创建R树
//创建时,可以指定最小、最大孩子结点数,splitter,selector
RTree<String, Geometry> tree = RTree.minChildren(3).maxChildren(6).create();
创建R*树
R*树是R树的变种,是在节点分裂方法上做了改进的R树,这点后续再写篇博客详细介绍
RTree<String, Geometry> tree = RTree.star().maxChildren(6).create();
这样,第一步创建R树操作就完成了,是不是很简单!!!
3.2 往R树插入数据
可插入4种空间数据:点、线、圆、矩形
Geometries.Rectangle
Geometries.circle
Geometries.point
Geometries.line
为什么没有面数据呢?
- 面其实也是多个线的组合,只需要将多边形的边依次插入R树就行
//插入点数据
tree = tree.add("testPoint", Geometries.point(116.0D, 32.0D));
3.3 删除R树里的数据
删除的时候需要匹配名称和地理信息
//删除点数据
tree = tree.delete("testPoint", Geometries.point(116.0D,32.0D));
3.4 搜索
R树对空间信息的查找平均时间复杂度是O(logN),最坏情况下是O(N)
搜索方法返回的结果需要Observable
泛型
Observable<Entry<String, Point>> entries = tree.search(Geometries.rectangle(8, 15, 30, 35));
或者返回Iterable
类型
Iterable<Entry<String, Point>> result = tree.search(Geometries.point(116.11D, 31.11D))
.toBlocking().toIterable();
4. 实际应用:判断点是否在多边形内
待补充