//RTreeDemo.java
//
//This library is free software; you can redistribute it and/or
//modify it under the terms of the GNU Lesser General Public
//License as published by the Free Software Foundation; either
//version 2.1 of the License, or (at your option) any later version.
//
//This library is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
//Lesser General Public License for more details.
package rtree;
import java.io.RandomAccessFile;
import java.util.Random;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import rtree.join.*;
import rtree.seeded.*;
import java.util.List;
import java.util.ArrayList;
/**
One can look at this class to understand the usage of RTree.
*/
public class rTreeDemo
{
public static void main(String argv[])
{
//rTreeDemo rt = new rTreeDemo();
new TreeThread();
}
public List tryJoin()
{
TreeThread tr = new TreeThread();
return tr.tryJoin();
}
public void setName(String name)
{
TreeThread.fileName = name;
}
}
class TreeThread implements Runnable
{
static String fileName = "c:\\temp\\temp.tree";
static long seed = 1015395880;//1015395880431;
static int h = 15000000;//2148460;//15000000;
static int w = 6000000;//2757573;//6000000;
Thread tree;
//String tname;
TreeThread()
{
for(int i=0; i<1; i++){
tree = new Thread(this,Integer.toString(i));
// try{Thread.currentThread().sleep(3000);}
// catch(Exception e){System.out.println("shdb");}
tree.start();
}
}
public void run()
{
try{
//RTree rt = new RTree(fileName);
//rt.printTree();
// entry(fileName);
//entryRand(fileName);
// rt.flush();
// HashSet set = new HashSet(list);
// System.out.println("rTreeDemo.run : size of set " + set.size());
//rt.printTree();
//overlapRR(fileName);
//Pack pck = new Pack();
//System.out.println("rTreeDemo : rt has before " + rt.getAllElements().size());
//pck.packTree(rt, fileName);
//System.out.println("rTreeDemo : rt has after " + rt.getAllElements().size());
//rt.printTree();
//pck.packTree(rt, fileName);
//pck.packTree(new RTree(fileName+"2"), fileName+"2");
//trySeed("/tmp/seed.dat", new RTree(fileName));
//System.out.println("rTreeDemo : height " + rt.getHeight());
RTreeRead rd = new RTreeRead(fileName+"1");
rd.readSeq();
rd = new RTreeRead(fileName+"2");
rd.readSeq();
//tryJoin();
}
catch(Exception e){
try{
e.printStackTrace();
}catch(Exception ex){
ex.printStackTrace();
}
}
//tryOverlap();
//tryCvr();
}
/**
Enter records within l - 15000000 and w - 6000000
*/
public void entryRand(String fileName)
throws Exception
{
List vct = new ArrayList(0);
int ix,iy,xx,xy;//mIn,maX
RTree rt = new RTree(fileName);
Random rnd = new Random(seed);
long start = System.currentTimeMillis();
Rect rect = new Rect();
//point data
for(int i=0;i<2000; i++){
iy = rnd.nextInt(h);//height
ix = rnd.nextInt(w);//width
LeafElement lf = new LeafElement(new Rect(ix,iy,ix,iy),218);
rt.insert(lf);
//rect.expandToInclude(lf.getRect());
//vct.add((LeafElement)lf.clone());
}
//rectangles
for(int i=0;i<30000; i++){
iy = rnd.nextInt(h-2);//height
ix = rnd.nextInt(w-2);//width
xy = rnd.nextInt(h - iy);
xx = rnd.nextInt(w - ix);
LeafElement lf = new LeafElement(new Rect(ix,iy,ix+xx,iy+xy),218);
rt.insert(lf);
//rect.expandToInclude(lf.getRect());
//vct.add((LeafElement)lf.clone());
}
for(int i=0;i<20000; i++){
iy = rnd.nextInt(h);//height
ix = rnd.nextInt(w);//width
LeafElement lf = new LeafElement(new Rect(ix,iy,ix,iy),218);
rt.insert(lf);
//rect.expandToInclude(lf.getRect());
//vct.add((LeafElement)lf.clone());
}
//rectangles
for(int i=0;i<30000; i++){
iy = rnd.nextInt(h-2);//height
ix = rnd.nextInt(w-2);//width
xy = rnd.nextInt(h - iy);
xx = rnd.nextInt(w - ix);
LeafElement lf = new LeafElement(new Rect(ix,iy,ix+xx,iy+xy),218);
rt.insert(lf);
rect.expandToInclude(lf.getRect());
//vct.add((LeafElement)lf.clone());
}
//for(int i=0; i<vct.size(); i++){
//System.out.println(i);
//delete(fileName, (LeafElement)vct.get(i));
//}
// RTreeRead rd = new RTreeRead(fileName);
// rd.readSeq();
System.out.println("Entry over in ms : " +(System.currentTimeMillis()-start)
+ " for thread " + Thread.currentThread());
}
//public
public void entry(String fileName)
{
try{
//Point data
/*
RTree rtree = new RTree(fileName);
LeafElement lf1 =
new LeafElement(new Rect(4,3,4,3),218);
LeafElement lf2 =
new LeafElement(new Rect(6,5,6,5),218);
LeafElement lf3 =
new LeafElement(new Rect(5,6,5,6),218);
LeafElement lf4 =
new LeafElement(new Rect(7,2,7,2),218);
rtree.insert(lf1);
rtree.insert(lf2);
rtree.insert(lf3);
rtree.insert(lf4);
*/
//BOXES
long start = System.currentTimeMillis();
RTree rtree = new RTree(fileName);
LeafElement lf1 = new LeafElement(new Rect(3,2,4,3),3243);//keep for join
rtree.insert(lf1);
rtree.delete(lf1);
/*
//getall(fileName);
RTree rtree1 = new RTree(fileName);
LeafElement lf2 = new LeafElement(new Rect(5,4,6,5),5465);
//rtree1.insert(lf2);
RTree rtree2 = new RTree(fileName);
LeafElement lf3 = new LeafElement(new Rect(9,6,10,7),96107);
//rtree2.insert(lf3);
RTree rtree3 = new RTree(fileName);
LeafElement lf4 = new LeafElement(new Rect(6,1,7,3),6173);//keep for join
rtree3.insert(lf4);
RTree rtree4 = new RTree(fileName);
LeafElement lf5 = new LeafElement(new Rect(6,2,8,3),6283);
//rtree4.insert(lf5);
RTree rtree5 = new RTree(fileName);
LeafElement lf6 = new LeafElement(new Rect(4,4,5,6),4456);
//rtree5.insert(lf6);
RTree rtree6 = new RTree(fileName);
LeafElement lf7 = new LeafElement(new Rect(5,3,7,4),5374);
//rtree6.insert(lf7);
RTree rtree7 = new RTree(fileName);
LeafElement lf8 = new LeafElement(new Rect(9,5,10,6),95106);//keep for join
rtree2.insert(lf8);
LeafElement lf9 = new LeafElement(new Rect(1,2,2,3),1223);//keep for join
rtree2.insert(lf9);
*/
System.out.println("Time in ms:" +(System.currentTimeMillis()-start));
System.out.println("Entry over");
}
catch(Exception e){
e.printStackTrace();
System.exit(1);
}
}
/*
Random rect queries
*/
public void overlapRR(String name)
throws Exception
{
RTree rt = new RTree(name);
int ix,iy,xx,xy;
Random rnd = new Random(System.currentTimeMillis());
for(int i=0;i<1;i++){
iy = rnd.nextInt(h-2);//height
ix = rnd.nextInt(w-2);//width
xy = rnd.nextInt(h - iy);
xx = rnd.nextInt(w - ix);
long start4 = System.currentTimeMillis();
List elmts = null;
// elmts = rt.overlaps(new Rect(ix,iy,ix+xx,iy+xy));
// System.out.println("Time in ms:" + (System.currentTimeMillis()-start4));
// System.out.println("Search result-Total elements:"+elmts.size());
System.out.println("Sweep");
start4 = System.currentTimeMillis();
elmts = rt.overlapsSweep(new Rect(ix,iy,ix+xx,iy+xy));
System.out.println("Time in ms:" + (System.currentTimeMillis()-start4));
System.out.println("Search result-Total elements:"+elmts.size());
}
}
/*
Random point queries
*/
public void overlapRP(String name)
throws Exception
{
RTree rt = new RTree(name);
int ix,iy;
Random rnd = new Random(System.currentTimeMillis());
for(int i=0;i<10;i++){
iy = rnd.nextInt(h);//height
ix = rnd.nextInt(w);//width
long start4 = System.currentTimeMillis();
List elmts = rt.overlaps(new Rect(ix,iy,ix,iy));
System.out.println("Time in ms:" +
(System.currentTimeMillis()-start4));
System.out.println("Search result-Total elements:"+elmts.size());
/*
start4 = System.currentTimeMillis();
elmts = rt.overlaps(new Rect(ix,iy,ix,iy));
System.out.println("Time in ms:" +
(System.currentTimeMillis()-start4));
System.out.println("Search result-Total elements:"+elmts.size());
*/
}
}
public void getall(String name)
{
try{
//get All elements
RTree rt = new RTree(name);
long start1 = System.currentTimeMillis();
List elmts1 = rt.getAllElements();
System.out.println("Time in ms:" +
(System.currentTimeMillis()-start1));
System.out.println("Record fetched by "+
Thread.currentThread().getName()+
": " + elmts1.size());
/*
start1 = System.currentTimeMillis();
LinkedList elmts2 = rt.testgetAllElements();
System.out.println("Time in ms:" +
(System.currentTimeMillis()-start1));
System.out.println("Record fetched: " + elmts2.size());
*/
//for(int i=0; i<elmts2.length; i++)
//System.out.println(elmts2[i].toString());
}
catch(Exception e){
e.printStackTrace();
System.exit(1);
}
}
public void overlap(String name,Rect rect)
{
try{
//Test overlap
RTree rt = new RTree(name);
long start4 = System.currentTimeMillis();
List elmts = rt.nonDisjoint(rect);
System.out.println("Time in ms:" +
(System.currentTimeMillis()-start4));
System.out.println("overlap Search -Total elements:"+elmts.size());
//for(int i=0;i<elmts.size();i++)
//System.out.println(((LeafElement)(elmts.elementAt(i))).toString());
}
catch(Exception e){
e.printStackTrace();
System.exit(1);
}
}
public void search(String name)
{
try{
//Search Nearest
RTree rt = new RTree(name);
int ix,iy;
Random rnd = new Random(System.currentTimeMillis());
//for(int i=0;i<10;i++){
iy = rnd.nextInt(h);//height
ix = rnd.nextInt(w);//width
Point pt =
new Point(ix,iy);
//Point pt =
//new Point(2618917,1264511);
//limited number
long start5 = System.currentTimeMillis();
ABL[] nrst = rt.nearestSearch(pt,50000000000L,10);
System.out.println("Time in ms for NNSearch(Limited):"+ (System.currentTimeMillis()-start5));
/*
for(int i=0;i<nrst.length;i++)
if(nrst[i] == null)
System.out.println("Could not find anything!!");
else
System.out.println("Result" + nrst[i].element.toString()
+"\tMINDIST:" + nrst[i].minDist);
*/
//unlimited
System.out.println("List");
start5 = System.currentTimeMillis();
List vec = rt.nearestSearch(pt,10000000000L);
System.out.println("Time in ms for NNSearch(Unlimited):"+ (System.currentTimeMillis()-start5));
System.out.println("Retrieved: "+vec.size());
//for(int i=0;i<vec.size();i++)
// System.out.println("Result" + ((ABL)(vec.elementAt(i)))
// .element.toString()
// +"\tMINDIST:" + ((ABL)(vec.elementAt(i)))
// .minDist);
}
catch(Exception e){
e.printStackTrace();
System.exit(1);
}
}
public void delete(String name,LeafElement element)
{
try{
RTree rt = new RTree(fileName);
rt.delete(element);
//for(int i=0;i<150;i++)
//rt.delete(element);
}
catch(Exception e){
e.printStackTrace();
}
}
public void tryOverlap()
{
try{
Rect rect1 = new Rect();
//Rect rect1 = new Rect(3,2,5,4);
//Rect rect2 = new Rect(3,2,5,4);
//Rect rect2 = new Rect(4,3,4,3);//true
//Rect rect2 = new Rect(5,2,7,4);//false
//Rect rect2 = new Rect(3,4,5,5);//false
//Rect rect2 = new Rect(3,1,5,2);//false
//Rect rect2 = new Rect(3,1,5,3);//false
//Rect rect2 = new Rect(4,3,4,3);//true
//Rect rect2 = new Rect(5,3,5,3);//true
//Rect rect2 = new Rect(6,2,6,2);//false
//Rect rect2 = new Rect(2,1,6,5);//false
Rect rect2 = new Rect(4,2,5,3);
//Rect rect1 = new Rect(9,6,10,7);//true
//Rect rect2 = new Rect(8,5,11,8);//true
System.out.println(rect1.toString()+" \nand\n"+rect2.toString()
+"\noverlap? \n\tAns- "+rect2.contains(rect1));
}
catch(Exception e){
System.out.println("Exception "+e.getMessage());
}
}
public void tryIntersection()
{
try{
//Rect rect1 = new Rect(3,2,5,4);
//Rect rect2 = new Rect(3,2,5,4);//3 2 5 4
//Rect rect2 = new Rect(4,3,4,3);//4 3 4 3
//Rect rect2 = new Rect(5,2,7,4);//5 2 5 4 - not null but a single line
//Rect rect2 = new Rect(3,4,5,5);//3 4 5 4
//Rect rect2 = new Rect(3,1,5,2);//3 2 5 2
//Rect rect2 = new Rect(3,1,5,3);//3 2 5 3
//Rect rect2 = new Rect(4,3,4,3);//4 3 4 3
//Rect rect2 = new Rect(5,3,5,3);//5 3 5 3
//Rect rect2 = new Rect(6,2,6,2);//null
//Rect rect2 = new Rect(2,1,6,5);//3 2 5 4
//Rect rect2 = new Rect(4,2,5,3);//4 2 5 3
Rect rect1 = new Rect(9,6,10,7);//null
Rect rect2 = new Rect(8,5,11,8);//null - comp the two 9 6 10 7
System.out.println(rect1.toString()+" \nand\n"+rect2.toString()
+"\nIntersection \n\tAns- "+rect2.intersection(rect1));
}
catch(Exception e){
System.out.println("Exception "+e.getMessage());
}
}
public void tryCvr()
{
try{
Rect rect1 = new Rect(3,2,5,4);
Rect rect2 = new Rect(3,2,4,4);//true
//Rect rect2 = new Rect(6,2,6,2);//false
System.out.println(rect1.toString()+" \nand\n"+rect2.toString()
+"\nDoes first Eclose second? \n\tAns- "
+rect1.covers(rect2));
}
catch(Exception e){
System.out.println("Exception "+e.getMessage());
}
}
public void tryIntsct()
{
try{
Rect rect1 = new Rect(3,2,5,4);
//Rect rect2 = new Rect(3,2,3,2);//true
//Rect rect2 = new Rect(5,2,7,4);//false
//Rect rect2 = new Rect(3,2,3,2);//true
//Rect rect2 = new Rect(3,4,5,5);//false
//Rect rect2 = new Rect(3,1,5,2);//false
//Rect rect2 = new Rect(3,1,5,3);//true
//Rect rect2 = new Rect(4,3,4,3);//true - check
Rect rect2 = new Rect(3,2,3,2);//true
System.out.println(rect1.toString()+" \nand\n"+rect2.toString()
+"\nDo Both Intersect? \n\tAns- "
+rect1.meet(rect2));
}
catch(Exception e){
System.out.println("Exception "+e.getMessage());
}
}
public void trySeed(String sdTree, RTree rtree)
{
try{
//System.out.println("rTreeDemo.trySeed : height of rtree is " + rtree.getHeight());
SdTree sdt = new SdTree(sdTree, rtree);
//now grow
int ix,iy,xx,xy;//mIn,maX
Random rnd = new Random(seed);
long start = System.currentTimeMillis();
// LeafElement llf = new LeafElement(new Rect(1752, 2179, 5999888, 14999646),218);
// sdt.growLeaf(llf);
for(int i=0;i<2000000; i++){
iy = rnd.nextInt(h-2);//height
ix = rnd.nextInt(w-2);//width
xy = rnd.nextInt(h - iy);
xx = rnd.nextInt(w - ix);
LeafElement lf = new LeafElement(new Rect(ix,iy,ix+xx,iy+xy),218);
sdt.growLeaf(lf);
}
sdt.cleanUp();
(new RTree(sdTree)).flush();
// RTreeRead rd = new RTreeRead(sdTree);
// rd.readSeq();
}catch(Exception e){
e.printStackTrace();
}
}
public List tryJoin()
{
try{
//String lt = new String("c:\\temp\temptree.dat");
//String lt = new String("/mnt/projects/data/MUM4_78.idx");
//String rt = new String("/mnt/projects/data/MUM4_118.idx");
RTree ltTree = new RTree(/*lt*/fileName+"1");
RTree rtTree = new RTree(/*rt*/fileName+"2");
//System.out.println("rTreeDemo.tryJoin : lt size " + ltTree.getAllElements().size());
Join join = new Join(ltTree, rtTree, new Pair(), new IntersectPred());
System.out.println("rTreeDemo : left tree size " + ltTree.getAllElements().size()
+"\nright tree size " + rtTree.getAllElements().size()
+"\n join size " + join.relate().size());
long t = System.currentTimeMillis();
List list = join.relate();
System.out.println("Join returned " + list.size() + " pointers in "
+ (System.currentTimeMillis() - t) + " ms" );
return list;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
}
class RTreeRead
{
static int nleaf;
static int leaf;
static int minX = Integer.MAX_VALUE, minY = Integer.MAX_VALUE,maxX = Integer.MIN_VALUE,
maxY = Integer.MIN_VALUE;
RandomAccessFile file;
RTreeRead(String fileName)
{
nleaf = leaf = 0;
try{
file = new RandomAccessFile(fileName,"r");
}
catch(Exception e){
System.out.println("RTreeRead "+e.getMessage());
}
}
public void readSeq()
{
try{
long length = file.length();
if(length == 0)
return;
Integer ln = new Integer((new Long(file.length())).intValue());
int kbytes = (new Double(Math.floor(ln.doubleValue()/4096))).intValue();
file.seek(0);
for(int i=0;i<kbytes+1;i++)
{
byte[] data = new byte[Node.NODE_SIZE];
file.read(data);
if(i==0)
printFlHdr(data);
else
printNode(i-1,data);
}
System.out.println("Total Leaf:"+leaf+"\tNonLeaf:"+nleaf);
System.out.println("MinX:"+minX+"\tMinY:"+minY+"\tMaxX:"+maxX+"\tMaxY:"+maxY);
}
catch(Exception e){
System.out.println("RTreeRead"+e.getMessage());
}
}
public void printFlHdr(byte[] data)
{
try{
int frNode = 123;
DataInputStream ds =
new DataInputStream(new ByteArrayInputStream(data));
System.out.println("\t***The File Header***");
System.out.println("TotalNodes:(includes unused ones):"+ds.readInt());
System.out.println("RootIndex: " + ds.readLong());
System.out.println("The free nodes Stack");
for(int topIdx=0;(topIdx<Node.FREE_LIST_LIMIT)&&
((frNode = ds.readInt()) !=
Node.NOT_DEFINED); topIdx++){
System.out.println("At " + topIdx + ": "+ frNode);
}
//System.out.println(frNode);
}
catch(Exception e){
System.out.println("Error at printFlHdr");
System.exit(1);
}
}
public void printNode(int index,byte[] data)
{
int mx,my,xx,xy;
try{
DataInputStream ds =
new DataInputStream(new ByteArrayInputStream(data));
System.out.println("\t***Node at Index: "+index+"***");
System.out.println("Node Header");
int totElmt = ds.readInt();
System.out.println("TotalElements:"+totElmt);
System.out.println("Parent:"+ds.readLong());
System.out.println("Element Size:"+ds.readInt());
int elmtType = ds.readInt();
System.out.println("Element Types:"+elmtType);
if(elmtType == Node.NONLEAF_NODE)
nleaf++;
else
leaf++;
for(int i=0;i<totElmt;i++){
System.out.println("Elements...");
mx = ds.readInt();
if(mx < minX)
minX = mx;
System.out.println("MinX: "+mx);
my = ds.readInt();
if(my < minY)
minY = my;
System.out.println("MinY: "+my);
xx = ds.readInt();
if(xx > maxX)
maxX = xx;
System.out.println("MaxX: "+xx);
xy = ds.readInt();
if(xy > maxY)
maxY = xy;
System.out.println("MaxY: "+xy);
System.out.println("Pointer: "+ds.readLong());
}
}
catch(Exception e){
System.out.println("Error");
System.exit(1);
}
}
}