public void TestKDBush() { int max = 1000000; var pts = new Point[max]; var random = new Random(); for (var i = 0; i < max; i++) { var pt = new Point(); pt.X = random.Next(-180000, 180000) * 0.001; pt.Y = random.Next(-90000, 90000) * 0.001; pts[i] = pt; } Stopwatch sp = new Stopwatch(); sp.Start(); var index = new KDBush(pts); sp.Stop(); Console.WriteLine($"索引耗时:{sp.ElapsedMilliseconds}"); sp.Start(); for (int i = 0; i < 10000; i++) { var pt = new Point(); pt.X = random.Next(-180000, 180000) * 0.001; pt.Y = random.Next(-90000, 90000) * 0.001; index.Range(pt.X - 1, pt.Y - 1, pt.X + 1, pt.Y + 1); } sp.Stop(); Console.WriteLine($"小范围查询耗时:{sp.ElapsedMilliseconds}"); sp.Start(); for (int i = 0; i < 10000; i++) { var pt = new Point(); pt.X = random.Next(-180000, 180000) * 0.001; pt.Y = random.Next(-90000, 90000) * 0.001; index.WithIn(pt.X, pt.Y, 1); } sp.Stop(); Console.WriteLine($"半径查询耗时:{sp.ElapsedMilliseconds}"); var pt1 = new Point(); pt1.X = random.Next(-180000, 180000) * 0.001; pt1.Y = random.Next(-90000, 90000) * 0.001; var rr = index.Range(pt1.X - 10, pt1.Y - 10, pt1.X + 10, pt1.Y + 10); var pt2 = new Point(); pt2.X = random.Next(-180000, 180000) * 0.001; pt2.Y = random.Next(-90000, 90000) * 0.001; var bb = index.WithIn(pt2.X, pt2.Y, 1); }
public void CreateKDBushIndex_RangeSearch_CorrectPointsReturned() { var index = new KDBush <double[]>(pointsData, nodeSize: 10); var result = index.Range(20, 30, 50, 70); Assert.Equal(new[] { 60, 20, 45, 3, 17, 71, 44, 19, 18, 15, 69, 90, 62, 96, 47, 8, 77, 72 }, result); }
public void CreateKDBushIndex_RangeSearch_AllReturnedPointsInRange() { var index = new KDBush <double[]>(pointsData, nodeSize: 10); var result = index.Range(20, 30, 50, 70); foreach (int pIdx in result) { var p = pointsData[pIdx]; Assert.False(p[0] < 20 || p[0] > 50 || p[1] < 30 || p[1] > 70); } }
public void CreateKDBushIndex_RangeSearch_UnReturnedPointsAreOutsideRange() { var index = new KDBush <double[]>(pointsData, nodeSize: 10); var result = index.Range(20, 30, 50, 70); for (var i = 0; i < ids.Length; i++) { var p = pointsData[ids[i]]; var pointIsNotInResult = result.IndexOf(ids[i]) < 0; Assert.False(pointIsNotInResult && p[0] >= 20 && p[0] <= 50 && p[1] >= 30 && p[1] <= 70); } }