好的,現在有這麼一個需求。你所開發的應用的數據庫中有全市所有飯店的經緯度座標,現在你在某地定位了一個座標,應用如何給你找出最近的飯店。多維空間搜索,使用RTree。這裏只推薦已有的實現了RTree的jar包。
maven項目,可下載jar包,並且這是一個簡單的例子:https://github.com/aled/jsi-examples
在線API:http://jsi.sourceforge.net/apidocs/index.html
下面附上自己很low的測試代碼:
package net.sf.jsi.examples; import gnu.trove.procedure.TIntProcedure; import net.sf.jsi.Point; import net.sf.jsi.Rectangle; import net.sf.jsi.SpatialIndex; import net.sf.jsi.rtree.RTree; /** * Created by Administrator on 2017/5/31. */ public class TestRTree { private void run() { //當前所在座標 final Point point = new Point(0, 0); //點 矩形 final Rectangle[] rectangle = new Rectangle[4]; rectangle[0] = new Rectangle(1, 1, 1, 1); rectangle[1] = new Rectangle(0, 1, 0, 1); rectangle[2] = new Rectangle(-1, -1, -1, -1); rectangle[3] = new Rectangle(-2, -2, -2, -2); //將點 矩形依次放入RTree中 SpatialIndex si = new RTree(); si.init(null); for (int i = 0; i < rectangle.length; i++) { si.add(rectangle[i], i); } //離點最近的3個點 矩形 si.nearestN(point, new TIntProcedure() { public boolean execute(int i) { System.out.println("點 矩形" + i + " " + rectangle[i] + ",距離=" + rectangle[i].distance(point)); return true; } }, 3, Float.MAX_VALUE); } public static void main(String[] args) { new TestRTree().run(); } }