@Override public LocationIndex prepareIndex() { if (initialized) throw new IllegalStateException("Call prepareIndex only once"); StopWatch sw = new StopWatch().start(); prepareAlgo(); // in-memory preparation InMemConstructionIndex inMem = getPrepareInMemIndex(); // compact & store to dataAccess dataAccess.create(64 * 1024); try { inMem.store(inMem.root, START_POINTER); flush(); } catch (Exception ex) { throw new IllegalStateException("Problem while storing location index. " + Helper.getMemInfo(), ex); } float entriesPerLeaf = (float) inMem.size / inMem.leafs; initialized = true; logger.info("location index created in " + sw.stop().getSeconds() + "s, size:" + Helper.nf(inMem.size) + ", leafs:" + Helper.nf(inMem.leafs) + ", precision:" + minResolutionInMeter + ", depth:" + entries.length + ", checksum:" + calcChecksum() + ", entries:" + Arrays.toString(entries) + ", entriesPerLeaf:" + entriesPerLeaf); return this; }
void fillLayer(Collection<InMemEntry> list, int selectDepth, int depth, Collection<InMemEntry> entries) { for (InMemEntry entry : entries) { if (selectDepth == depth) { list.add(entry); } else if (entry instanceof InMemTreeEntry) { fillLayer(list, selectDepth, depth + 1, ((InMemTreeEntry) entry).getSubEntriesForDebug()); } } }
void print(InMemEntry e, StringBuilder sb, long key, int depth) { if (e.isLeaf()) { InMemLeafEntry leaf = (InMemLeafEntry) e; int bits = keyAlgo.getBits(); // print reverse keys sb.append(BitUtil.BIG.toBitString(BitUtil.BIG.reverse(key, bits), bits)).append(" "); IntArrayList entries = leaf.getResults(); for (int i = 0; i < entries.size(); i++) { sb.append(leaf.get(i)).append(','); } sb.append('\n'); } else { InMemTreeEntry tree = (InMemTreeEntry) e; key = key << shifts[depth]; for (int counter = 0; counter < tree.subEntries.length; counter++) { InMemEntry sube = tree.subEntries[counter]; if (sube != null) { print(sube, sb, key | counter, depth + 1); } } } }
intIndex = store(subEntry, beforeIntIndex); if (intIndex == beforeIntIndex)
intIndex = store(subEntry, beforeIntIndex); if (intIndex == beforeIntIndex) { dataAccess.setInt(refPointer, 0);
intIndex = store(subEntry, beforeIntIndex); if (intIndex == beforeIntIndex) { dataAccess.setInt(refPointer, 0);
try inMem.store(inMem.root, START_POINTER); flush(); } catch (Exception ex)
@Override public LocationIndex prepareIndex() { if (initialized) throw new IllegalStateException("Call prepareIndex only once"); StopWatch sw = new StopWatch().start(); prepareAlgo(); // in-memory preparation InMemConstructionIndex inMem = getPrepareInMemIndex(); // compact & store to dataAccess dataAccess.create(64 * 1024); try { inMem.store(inMem.root, START_POINTER); flush(); } catch (Exception ex) { throw new IllegalStateException("Problem while storing location index. " + Helper.getMemInfo(), ex); } float entriesPerLeaf = (float) inMem.size / inMem.leafs; initialized = true; logger.info("location index created in " + sw.stop().getSeconds() + "s, size:" + Helper.nf(inMem.size) + ", leafs:" + Helper.nf(inMem.leafs) + ", precision:" + minResolutionInMeter + ", depth:" + entries.length + ", checksum:" + calcChecksum() + ", entries:" + Arrays.toString(entries) + ", entriesPerLeaf:" + entriesPerLeaf); return this; }
void prepare() { final EdgeIterator allIter = graph.getAllEdges(); try { while (allIter.next()) { int nodeA = allIter.getBaseNode(); int nodeB = allIter.getAdjNode(); double lat1 = nodeAccess.getLatitude(nodeA); double lon1 = nodeAccess.getLongitude(nodeA); double lat2; double lon2; PointList points = allIter.fetchWayGeometry(0); int len = points.getSize(); for (int i = 0; i < len; i++) { lat2 = points.getLatitude(i); lon2 = points.getLongitude(i); addNode(nodeA, nodeB, lat1, lon1, lat2, lon2); lat1 = lat2; lon1 = lon2; } lat2 = nodeAccess.getLatitude(nodeB); lon2 = nodeAccess.getLongitude(nodeB); addNode(nodeA, nodeB, lat1, lon1, lat2, lon2); } } catch (Exception ex) { logger.error("Problem! base:" + allIter.getBaseNode() + ", adj:" + allIter.getAdjNode() + ", edge:" + allIter.getEdge(), ex); } }
@Override public LocationIndex prepareIndex() { if (initialized) throw new IllegalStateException("Call prepareIndex only once"); StopWatch sw = new StopWatch().start(); prepareAlgo(); // in-memory preparation InMemConstructionIndex inMem = getPrepareInMemIndex(); // compact & store to dataAccess dataAccess.create(64 * 1024); try { inMem.store(inMem.root, START_POINTER); flush(); } catch (Exception ex) { throw new IllegalStateException("Problem while storing location index. " + Helper.getMemInfo(), ex); } float entriesPerLeaf = (float) inMem.size / inMem.leafs; initialized = true; logger.info("location index created in " + sw.stop().getSeconds() + "s, size:" + Helper.nf(inMem.size) + ", leafs:" + Helper.nf(inMem.leafs) + ", precision:" + minResolutionInMeter + ", depth:" + entries.length + ", checksum:" + calcChecksum() + ", entries:" + Arrays.toString(entries) + ", entriesPerLeaf:" + entriesPerLeaf); return this; }
void prepare() { final EdgeIterator allIter = graph.getAllEdges(); try { while (allIter.next()) { int nodeA = allIter.getBaseNode(); int nodeB = allIter.getAdjNode(); double lat1 = nodeAccess.getLatitude(nodeA); double lon1 = nodeAccess.getLongitude(nodeA); double lat2; double lon2; PointList points = allIter.fetchWayGeometry(0); int len = points.getSize(); for (int i = 0; i < len; i++) { lat2 = points.getLatitude(i); lon2 = points.getLongitude(i); addNode(nodeA, nodeB, lat1, lon1, lat2, lon2); lat1 = lat2; lon1 = lon2; } lat2 = nodeAccess.getLatitude(nodeB); lon2 = nodeAccess.getLongitude(nodeB); addNode(nodeA, nodeB, lat1, lon1, lat2, lon2); } } catch (Exception ex) { logger.error("Problem! base:" + allIter.getBaseNode() + ", adj:" + allIter.getAdjNode() + ", edge:" + allIter.getEdge(), ex); } }
void print( InMemEntry e, StringBuilder sb, long key, int depth ) { if (e.isLeaf()) { InMemLeafEntry leaf = (InMemLeafEntry) e; int bits = keyAlgo.getBits(); // print reverse keys sb.append(BitUtil.BIG.toBitString(BitUtil.BIG.reverse(key, bits), bits)).append(" "); TIntArrayList entries = leaf.getResults(); for (int i = 0; i < entries.size(); i++) { sb.append(leaf.get(i)).append(','); } sb.append('\n'); } else { InMemTreeEntry tree = (InMemTreeEntry) e; key = key << shifts[depth]; for (int counter = 0; counter < tree.subEntries.length; counter++) { InMemEntry sube = tree.subEntries[counter]; if (sube != null) { print(sube, sb, key | counter, depth + 1); } } } }
void addNode( InMemEntry entry, int nodeId, int depth, long keyPart, long key ) { if (entry.isLeaf()) { InMemLeafEntry leafEntry = (InMemLeafEntry) entry; leafEntry.addNode(nodeId); } else { int index = (int) (bitmasks[depth] & keyPart); keyPart = keyPart >>> shifts[depth]; InMemTreeEntry treeEntry = ((InMemTreeEntry) entry); InMemEntry subentry = treeEntry.getSubEntry(index); depth++; if (subentry == null) { if (depth == entries.length) { subentry = new InMemLeafEntry(initSizeLeafEntries, key); } else { subentry = new InMemTreeEntry(entries[depth]); } treeEntry.setSubEntry(index, subentry); } addNode(subentry, nodeId, depth, keyPart, key); } }
void print(InMemEntry e, StringBuilder sb, long key, int depth) { if (e.isLeaf()) { InMemLeafEntry leaf = (InMemLeafEntry) e; int bits = keyAlgo.getBits(); // print reverse keys sb.append(BitUtil.BIG.toBitString(BitUtil.BIG.reverse(key, bits), bits)).append(" "); IntArrayList entries = leaf.getResults(); for (int i = 0; i < entries.size(); i++) { sb.append(leaf.get(i)).append(','); } sb.append('\n'); } else { InMemTreeEntry tree = (InMemTreeEntry) e; key = key << shifts[depth]; for (int counter = 0; counter < tree.subEntries.length; counter++) { InMemEntry sube = tree.subEntries[counter]; if (sube != null) { print(sube, sb, key | counter, depth + 1); } } } }
void print(InMemEntry e, StringBuilder sb, long key, int depth) { if (e.isLeaf()) { InMemLeafEntry leaf = (InMemLeafEntry) e; int bits = keyAlgo.getBits(); // print reverse keys sb.append(BitUtil.BIG.toBitString(BitUtil.BIG.reverse(key, bits), bits)).append(" "); IntArrayList entries = leaf.getResults(); for (int i = 0; i < entries.size(); i++) { sb.append(leaf.get(i)).append(','); } sb.append('\n'); } else { InMemTreeEntry tree = (InMemTreeEntry) e; key = key << shifts[depth]; for (int counter = 0; counter < tree.subEntries.length; counter++) { InMemEntry sube = tree.subEntries[counter]; if (sube != null) { print(sube, sb, key | counter, depth + 1); } } } }
void addNode(InMemEntry entry, int nodeId, int depth, long keyPart, long key) { if (entry.isLeaf()) { InMemLeafEntry leafEntry = (InMemLeafEntry) entry; leafEntry.addNode(nodeId); } else { int index = (int) (bitmasks[depth] & keyPart); keyPart = keyPart >>> shifts[depth]; InMemTreeEntry treeEntry = ((InMemTreeEntry) entry); InMemEntry subentry = treeEntry.getSubEntry(index); depth++; if (subentry == null) { if (depth == entries.length) { subentry = new InMemLeafEntry(initSizeLeafEntries, key); } else { subentry = new InMemTreeEntry(entries[depth]); } treeEntry.setSubEntry(index, subentry); } addNode(subentry, nodeId, depth, keyPart, key); } }
void addNode(InMemEntry entry, int nodeId, int depth, long keyPart, long key) { if (entry.isLeaf()) { InMemLeafEntry leafEntry = (InMemLeafEntry) entry; leafEntry.addNode(nodeId); } else { int index = (int) (bitmasks[depth] & keyPart); keyPart = keyPart >>> shifts[depth]; InMemTreeEntry treeEntry = ((InMemTreeEntry) entry); InMemEntry subentry = treeEntry.getSubEntry(index); depth++; if (subentry == null) { if (depth == entries.length) { subentry = new InMemLeafEntry(initSizeLeafEntries, key); } else { subentry = new InMemTreeEntry(entries[depth]); } treeEntry.setSubEntry(index, subentry); } addNode(subentry, nodeId, depth, keyPart, key); } }
void fillLayer( Collection<InMemEntry> list, int selectDepth, int depth, Collection<InMemEntry> entries ) { for (InMemEntry entry : entries) { if (selectDepth == depth) { list.add(entry); } else if (entry instanceof InMemTreeEntry) { fillLayer(list, selectDepth, depth + 1, ((InMemTreeEntry) entry).getSubEntriesForDebug()); } } }
@Override public void set(double lat, double lon) { long key = keyAlgo.encode(lat, lon); long keyPart = createReverseKey(key); // no need to feed both nodes as we search neighbors in fillIDs addNode(root, nodeA, 0, keyPart, key); } };