fix some issues
git-svn-id: https://osmand.googlecode.com/svn/trunk@596 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
parent
37606d7f0d
commit
c9982c0b97
2 changed files with 145 additions and 113 deletions
|
@ -1,20 +1,19 @@
|
||||||
package net.osmand.binary;
|
package net.osmand.binary;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.RandomAccessFile;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Stack;
|
import java.util.Stack;
|
||||||
|
|
||||||
import net.osmand.Algoritms;
|
import net.osmand.Algoritms;
|
||||||
import net.osmand.data.index.IndexConstants;
|
|
||||||
|
|
||||||
import com.google.protobuf.CodedOutputStream;
|
import com.google.protobuf.CodedOutputStream;
|
||||||
import com.google.protobuf.WireFormat;
|
import com.google.protobuf.WireFormat;
|
||||||
|
|
||||||
public class BinaryIndexWriter {
|
public class BinaryMapIndexWriter {
|
||||||
|
|
||||||
private final OutputStream out;
|
private RandomAccessFile raf;
|
||||||
private CodedOutputStream codedOutStream;
|
private CodedOutputStream codedOutStream;
|
||||||
|
|
||||||
private static class Bounds {
|
private static class Bounds {
|
||||||
|
@ -39,55 +38,45 @@ public class BinaryIndexWriter {
|
||||||
|
|
||||||
// internal constants to track state of index writing
|
// internal constants to track state of index writing
|
||||||
private Stack<Integer> state = new Stack<Integer>();
|
private Stack<Integer> state = new Stack<Integer>();
|
||||||
|
private Stack<Long> stackSizes = new Stack<Long>();
|
||||||
|
|
||||||
private final static int OSMAND_STRUCTURE_INIT = 1;
|
private final static int OSMAND_STRUCTURE_INIT = 1;
|
||||||
private final static int MAP_INDEX_INIT = 2;
|
private final static int MAP_INDEX_INIT = 2;
|
||||||
private final static int MAP_ROOT_LEVEL_INIT = 3;
|
private final static int MAP_ROOT_LEVEL_INIT = 3;
|
||||||
private final static int MAP_TREE = 4;
|
private final static int MAP_TREE = 4;
|
||||||
|
|
||||||
public BinaryIndexWriter(OutputStream out) throws IOException{
|
public BinaryMapIndexWriter(RandomAccessFile raf, CodedOutputStream codedOutputStream) throws IOException{
|
||||||
this.out = out;
|
this.raf = raf;
|
||||||
codedOutStream = CodedOutputStream.newInstance(out);
|
codedOutStream = codedOutputStream;
|
||||||
codedOutStream.writeInt32(OsmandOdb.OsmAndStructure.VERSION_FIELD_NUMBER, IndexConstants.BINARY_MAP_VERSION);
|
|
||||||
state.push(OSMAND_STRUCTURE_INIT);
|
state.push(OSMAND_STRUCTURE_INIT);
|
||||||
}
|
}
|
||||||
// message MapTree {
|
|
||||||
// required sint32 left = 1; // delta encoded
|
|
||||||
// required sint32 right = 2; // delta encoded
|
|
||||||
// required sint32 top = 3; // delta encoded
|
|
||||||
// required sint32 bottom = 4; // delta encoded
|
|
||||||
//
|
|
||||||
// optional StringTable stringTable = 5;
|
|
||||||
// optional uint64 baseId = 6;
|
|
||||||
//
|
|
||||||
// repeated MapTree subtrees = 7;
|
|
||||||
// repeated MapData leafs = 8;
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
// /// Simple messages
|
|
||||||
// message MapData {
|
|
||||||
// required bytes coordinates = 1; // array of delta x,y uin32 could be read by codedinputstream
|
|
||||||
// required bytes types = 2; // array of fixed int16
|
|
||||||
//
|
|
||||||
// required sint64 id = 3; // delta encoded
|
|
||||||
// optional uint32 stringId = 4;
|
|
||||||
//
|
|
||||||
// repeated sint64 restrictions = 5; // delta encoded 3 bytes for type and other for id
|
|
||||||
// optional int32 highwayMeta = 6;
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
private void preserveInt32Size() throws IOException {
|
||||||
|
stackSizes.push(raf.getFilePointer());
|
||||||
|
codedOutStream.writeFixed32NoTag(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeInt32Size() throws IOException{
|
||||||
|
long filePointer = raf.getFilePointer();
|
||||||
|
Long old = stackSizes.pop();
|
||||||
|
int length = (int) (filePointer - old);
|
||||||
|
raf.seek(old);
|
||||||
|
raf.writeInt(length);
|
||||||
|
raf.seek(filePointer);
|
||||||
|
}
|
||||||
|
|
||||||
public void startWriteMapIndex() throws IOException{
|
public void startWriteMapIndex() throws IOException{
|
||||||
assert state.peek() == OSMAND_STRUCTURE_INIT;
|
assert state.peek() == OSMAND_STRUCTURE_INIT;
|
||||||
state.push(MAP_INDEX_INIT);
|
state.push(MAP_INDEX_INIT);
|
||||||
codedOutStream.writeTag(OsmandOdb.OsmAndStructure.MAPINDEX_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
|
codedOutStream.writeTag(OsmandOdb.OsmAndStructure.MAPINDEX_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
|
||||||
// TODO write size of map index
|
preserveInt32Size();
|
||||||
codedOutStream.writeFixed32NoTag(0);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void endWriteMapIndex() throws IOException{
|
public void endWriteMapIndex() throws IOException{
|
||||||
Integer st = state.pop();
|
Integer st = state.pop();
|
||||||
assert st == MAP_INDEX_INIT;
|
assert st == MAP_INDEX_INIT;
|
||||||
codedOutStream.writeRawVarint32(0);
|
writeInt32Size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startWriteMapLevelIndex(int maxZoom, int minZoom, int leftX, int rightX, int topY, int bottomY) throws IOException{
|
public void startWriteMapLevelIndex(int maxZoom, int minZoom, int leftX, int rightX, int topY, int bottomY) throws IOException{
|
||||||
|
@ -95,8 +84,7 @@ public class BinaryIndexWriter {
|
||||||
state.push(MAP_ROOT_LEVEL_INIT);
|
state.push(MAP_ROOT_LEVEL_INIT);
|
||||||
|
|
||||||
codedOutStream.writeTag(OsmandOdb.OsmAndMapIndex.LEVELS_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
|
codedOutStream.writeTag(OsmandOdb.OsmAndMapIndex.LEVELS_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
|
||||||
// TODO write size of level map index
|
preserveInt32Size();
|
||||||
codedOutStream.writeFixed32NoTag(0);
|
|
||||||
|
|
||||||
codedOutStream.writeInt32(OsmandOdb.MapRootLevel.MAXZOOM_FIELD_NUMBER, maxZoom);
|
codedOutStream.writeInt32(OsmandOdb.MapRootLevel.MAXZOOM_FIELD_NUMBER, maxZoom);
|
||||||
codedOutStream.writeInt32(OsmandOdb.MapRootLevel.MINZOOM_FIELD_NUMBER, minZoom);
|
codedOutStream.writeInt32(OsmandOdb.MapRootLevel.MINZOOM_FIELD_NUMBER, minZoom);
|
||||||
|
@ -111,9 +99,8 @@ public class BinaryIndexWriter {
|
||||||
public void endWriteMapLevelIndex() throws IOException{
|
public void endWriteMapLevelIndex() throws IOException{
|
||||||
assert state.peek() == MAP_ROOT_LEVEL_INIT;
|
assert state.peek() == MAP_ROOT_LEVEL_INIT;
|
||||||
state.pop();
|
state.pop();
|
||||||
|
|
||||||
stackBounds.pop();
|
stackBounds.pop();
|
||||||
codedOutStream.writeRawVarint32(0);
|
writeInt32Size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startMapTreeElement(int leftX, int rightX, int topY, int bottomY) throws IOException{
|
public void startMapTreeElement(int leftX, int rightX, int topY, int bottomY) throws IOException{
|
||||||
|
@ -123,8 +110,7 @@ public class BinaryIndexWriter {
|
||||||
} else {
|
} else {
|
||||||
codedOutStream.writeTag(OsmandOdb.MapTree.SUBTREES_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
|
codedOutStream.writeTag(OsmandOdb.MapTree.SUBTREES_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
|
||||||
}
|
}
|
||||||
// TODO write size of level map index
|
preserveInt32Size();
|
||||||
codedOutStream.writeFixed32NoTag(0);
|
|
||||||
state.push(MAP_TREE);
|
state.push(MAP_TREE);
|
||||||
|
|
||||||
|
|
||||||
|
@ -134,7 +120,7 @@ public class BinaryIndexWriter {
|
||||||
codedOutStream.writeSInt32(OsmandOdb.MapTree.TOP_FIELD_NUMBER, topY - bounds.topY);
|
codedOutStream.writeSInt32(OsmandOdb.MapTree.TOP_FIELD_NUMBER, topY - bounds.topY);
|
||||||
codedOutStream.writeSInt32(OsmandOdb.MapTree.BOTTOM_FIELD_NUMBER, bottomY - bounds.bottomY);
|
codedOutStream.writeSInt32(OsmandOdb.MapTree.BOTTOM_FIELD_NUMBER, bottomY - bounds.bottomY);
|
||||||
stackBounds.push(new Bounds(leftX, rightX, topY, bottomY));
|
stackBounds.push(new Bounds(leftX, rightX, topY, bottomY));
|
||||||
stackBaseIds.push(0L);
|
stackBaseIds.push(-1L);
|
||||||
stackStringTable.push(null);
|
stackStringTable.push(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,47 +130,97 @@ public class BinaryIndexWriter {
|
||||||
|
|
||||||
stackBounds.pop();
|
stackBounds.pop();
|
||||||
Long l = stackBaseIds.pop();
|
Long l = stackBaseIds.pop();
|
||||||
if(l != 0){
|
if(l != -1){
|
||||||
codedOutStream.writeTag(OsmandOdb.MapTree.BASEID_FIELD_NUMBER, WireFormat.FieldType.UINT64.getWireType());
|
codedOutStream.writeTag(OsmandOdb.MapTree.BASEID_FIELD_NUMBER, WireFormat.FieldType.UINT64.getWireType());
|
||||||
codedOutStream.writeUInt64NoTag(l);
|
codedOutStream.writeUInt64NoTag(l);
|
||||||
}
|
}
|
||||||
Map<String, Integer> map = stackStringTable.peek();
|
Map<String, Integer> map = stackStringTable.peek();
|
||||||
if(map != null){
|
if(map != null){
|
||||||
codedOutStream.writeTag(OsmandOdb.MapTree.STRINGTABLE_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
|
|
||||||
// TODO write size
|
|
||||||
codedOutStream.writeFixed32NoTag(0);
|
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
int size = 0;
|
||||||
for(String s : map.keySet()){
|
for(String s : map.keySet()){
|
||||||
Integer integer = map.get(s);
|
Integer integer = map.get(s);
|
||||||
if(integer != i){
|
if(integer != i){
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
codedOutStream.writeTag(OsmandOdb.StringTable.S_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
|
size += CodedOutputStream.computeStringSize(OsmandOdb.StringTable.S_FIELD_NUMBER, s);
|
||||||
codedOutStream.writeStringNoTag(s);
|
}
|
||||||
|
codedOutStream.writeTag(OsmandOdb.MapTree.STRINGTABLE_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
|
||||||
|
codedOutStream.writeRawVarint32(size);
|
||||||
|
for(String s : map.keySet()){
|
||||||
|
codedOutStream.writeString(OsmandOdb.StringTable.S_FIELD_NUMBER, s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
writeInt32Size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeMapData(long id, byte[] nodes, byte[] types, String name, int highwayAttributes, byte[] restrictions) throws IOException{
|
public void writeMapData(long id, byte[] nodes, byte[] types, String name, int highwayAttributes, byte[] restrictions) throws IOException{
|
||||||
assert state.peek() == MAP_TREE;
|
assert state.peek() == MAP_TREE;
|
||||||
codedOutStream.writeTag(OsmandOdb.MapTree.LEAFS_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
|
|
||||||
// TODO write size of map data !!! here
|
|
||||||
|
|
||||||
Bounds bounds = stackBounds.peek();
|
|
||||||
codedOutStream.writeTag(OsmandOdb.MapData.COORDINATES_FIELD_NUMBER, WireFormat.FieldType.BYTES.getWireType());
|
Bounds bounds = stackBounds.peek();
|
||||||
int size = 0;
|
if(stackBaseIds.peek() == -1){
|
||||||
for(int i=0; i< nodes.length / 8; i++){
|
stackBaseIds.pop();
|
||||||
int x = Algoritms.parseIntFromBytes(nodes, i*8) - bounds.leftX;
|
stackBaseIds.push(id);
|
||||||
int y = Algoritms.parseIntFromBytes(nodes, i*8 + 4) - bounds.topY;
|
|
||||||
size += CodedOutputStream.computeInt32SizeNoTag(x);
|
|
||||||
size += CodedOutputStream.computeInt32SizeNoTag(y);
|
|
||||||
}
|
}
|
||||||
codedOutStream.writeRawVarint32(size);
|
// calculate size
|
||||||
|
int allSize = CodedOutputStream.computeTagSize(OsmandOdb.MapData.COORDINATES_FIELD_NUMBER);
|
||||||
|
int sizeCoordinates = 0;
|
||||||
for(int i=0; i< nodes.length / 8; i++){
|
for(int i=0; i< nodes.length / 8; i++){
|
||||||
int x = Algoritms.parseIntFromBytes(nodes, i*8) - bounds.leftX;
|
int x = Algoritms.parseIntFromBytes(nodes, i*8) - bounds.leftX;
|
||||||
int y = Algoritms.parseIntFromBytes(nodes, i*8 + 4) - bounds.topY;
|
int y = Algoritms.parseIntFromBytes(nodes, i*8 + 4) - bounds.topY;
|
||||||
|
sizeCoordinates += CodedOutputStream.computeInt32SizeNoTag(x);
|
||||||
|
sizeCoordinates += CodedOutputStream.computeInt32SizeNoTag(y);
|
||||||
|
}
|
||||||
|
allSize += sizeCoordinates;
|
||||||
|
|
||||||
|
allSize += CodedOutputStream.computeTagSize(OsmandOdb.MapData.TYPES_FIELD_NUMBER);
|
||||||
|
allSize += CodedOutputStream.computeRawVarint32Size(types.length);
|
||||||
|
allSize += types.length;
|
||||||
|
|
||||||
|
allSize += CodedOutputStream.computeSInt64Size(OsmandOdb.MapData.ID_FIELD_NUMBER, id - stackBaseIds.peek());
|
||||||
|
|
||||||
|
int nameId = 0;
|
||||||
|
if(name != null){
|
||||||
|
if(stackStringTable.peek() == null) {
|
||||||
|
stackStringTable.pop();
|
||||||
|
stackStringTable.push(new LinkedHashMap<String, Integer>());
|
||||||
|
}
|
||||||
|
Map<String, Integer> map = stackStringTable.peek();
|
||||||
|
if(map.containsKey(name)) {
|
||||||
|
nameId = map.get(name);
|
||||||
|
} else {
|
||||||
|
nameId = map.size();
|
||||||
|
map.put(name, nameId);
|
||||||
|
}
|
||||||
|
allSize += CodedOutputStream.computeUInt32Size(OsmandOdb.MapData.STRINGID_FIELD_NUMBER, nameId);
|
||||||
|
}
|
||||||
|
|
||||||
|
int restrictionsSize = 0;
|
||||||
|
if(restrictions.length > 0){
|
||||||
|
allSize += CodedOutputStream.computeTagSize(OsmandOdb.MapData.RESTRICTIONS_FIELD_NUMBER);
|
||||||
|
for (int i = 0; i < restrictions.length / 8; i++) {
|
||||||
|
long l = Algoritms.parseLongFromBytes(restrictions, i * 8) - stackBaseIds.peek();
|
||||||
|
restrictionsSize += CodedOutputStream.computeSInt64SizeNoTag(l);
|
||||||
|
}
|
||||||
|
allSize += CodedOutputStream.computeRawVarint32Size(restrictionsSize);
|
||||||
|
allSize += restrictionsSize;
|
||||||
|
}
|
||||||
|
if(highwayAttributes != 0){
|
||||||
|
allSize += CodedOutputStream.computeInt32Size(OsmandOdb.MapData.HIGHWAYMETA_FIELD_NUMBER, highwayAttributes);
|
||||||
|
}
|
||||||
|
|
||||||
|
// writing data
|
||||||
|
codedOutStream.writeTag(OsmandOdb.MapTree.LEAFS_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
|
||||||
|
codedOutStream.writeRawVarint32(allSize);
|
||||||
|
|
||||||
|
codedOutStream.writeTag(OsmandOdb.MapData.COORDINATES_FIELD_NUMBER, WireFormat.FieldType.BYTES.getWireType());
|
||||||
|
codedOutStream.writeRawVarint32(sizeCoordinates);
|
||||||
|
for (int i = 0; i < nodes.length / 8; i++) {
|
||||||
|
int x = Algoritms.parseIntFromBytes(nodes, i * 8) - bounds.leftX;
|
||||||
|
int y = Algoritms.parseIntFromBytes(nodes, i * 8 + 4) - bounds.topY;
|
||||||
codedOutStream.writeInt32NoTag(x);
|
codedOutStream.writeInt32NoTag(x);
|
||||||
codedOutStream.writeInt32NoTag(y);
|
codedOutStream.writeInt32NoTag(y);
|
||||||
}
|
}
|
||||||
|
@ -193,47 +229,29 @@ public class BinaryIndexWriter {
|
||||||
codedOutStream.writeRawVarint32(types.length);
|
codedOutStream.writeRawVarint32(types.length);
|
||||||
codedOutStream.writeRawBytes(types);
|
codedOutStream.writeRawBytes(types);
|
||||||
|
|
||||||
if(stackBaseIds.peek() == 0){
|
|
||||||
stackBaseIds.pop();
|
codedOutStream.writeSInt64(OsmandOdb.MapData.ID_FIELD_NUMBER, id - stackBaseIds.peek());
|
||||||
stackBaseIds.push(id);
|
|
||||||
}
|
|
||||||
codedOutStream.writeTag(OsmandOdb.MapData.ID_FIELD_NUMBER, WireFormat.FieldType.SINT64.getWireType());
|
|
||||||
codedOutStream.writeSInt64NoTag(id - stackBaseIds.peek());
|
|
||||||
|
|
||||||
if(name != null){
|
if(name != null){
|
||||||
if(stackStringTable.peek() == null) {
|
codedOutStream.writeUInt32(OsmandOdb.MapData.STRINGID_FIELD_NUMBER, nameId);
|
||||||
stackStringTable.pop();
|
|
||||||
stackStringTable.push(new LinkedHashMap<String, Integer>());
|
|
||||||
}
|
|
||||||
Map<String, Integer> map = stackStringTable.peek();
|
|
||||||
int s;
|
|
||||||
if(map.containsKey(name)) {
|
|
||||||
s = map.get(name);
|
|
||||||
} else {
|
|
||||||
s = map.size();
|
|
||||||
map.put(name, s);
|
|
||||||
}
|
|
||||||
codedOutStream.writeTag(OsmandOdb.MapData.STRINGID_FIELD_NUMBER, WireFormat.FieldType.UINT32.getWireType());
|
|
||||||
codedOutStream.writeUInt32NoTag(s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(restrictions.length > 0){
|
if(restrictions.length > 0){
|
||||||
// TODO restrictions delta?
|
|
||||||
codedOutStream.writeTag(OsmandOdb.MapData.RESTRICTIONS_FIELD_NUMBER, WireFormat.FieldType.BYTES.getWireType());
|
codedOutStream.writeTag(OsmandOdb.MapData.RESTRICTIONS_FIELD_NUMBER, WireFormat.FieldType.BYTES.getWireType());
|
||||||
codedOutStream.writeRawVarint32(restrictions.length);
|
codedOutStream.writeRawVarint32(restrictionsSize);
|
||||||
codedOutStream.writeRawBytes(restrictions);
|
for (int i = 0; i < restrictions.length / 8; i++) {
|
||||||
|
long l = Algoritms.parseLongFromBytes(restrictions, i * 8) - stackBaseIds.peek();
|
||||||
|
codedOutStream.writeSInt64NoTag(l);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(highwayAttributes != 0){
|
if(highwayAttributes != 0){
|
||||||
codedOutStream.writeTag(OsmandOdb.MapData.HIGHWAYMETA_FIELD_NUMBER, WireFormat.FieldType.UINT32.getWireType());
|
codedOutStream.writeInt32(OsmandOdb.MapData.HIGHWAYMETA_FIELD_NUMBER, highwayAttributes);
|
||||||
codedOutStream.writeRawVarint32(highwayAttributes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void close() throws IOException{
|
public void close() throws IOException{
|
||||||
assert state.peek() == OSMAND_STRUCTURE_INIT;
|
assert state.peek() == OSMAND_STRUCTURE_INIT;
|
||||||
codedOutStream.flush();
|
codedOutStream.flush();
|
||||||
out.close();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -4,9 +4,9 @@ import java.awt.geom.Line2D;
|
||||||
import java.awt.geom.Point2D;
|
import java.awt.geom.Point2D;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
import java.io.RandomAccessFile;
|
import java.io.RandomAccessFile;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.DriverManager;
|
import java.sql.DriverManager;
|
||||||
|
@ -28,7 +28,8 @@ import java.util.Map.Entry;
|
||||||
|
|
||||||
import net.osmand.Algoritms;
|
import net.osmand.Algoritms;
|
||||||
import net.osmand.IProgress;
|
import net.osmand.IProgress;
|
||||||
import net.osmand.binary.BinaryIndexWriter;
|
import net.osmand.binary.BinaryMapIndexWriter;
|
||||||
|
import net.osmand.binary.OsmandOdb;
|
||||||
import net.osmand.data.Amenity;
|
import net.osmand.data.Amenity;
|
||||||
import net.osmand.data.Building;
|
import net.osmand.data.Building;
|
||||||
import net.osmand.data.City;
|
import net.osmand.data.City;
|
||||||
|
@ -77,6 +78,8 @@ import rtree.RTree;
|
||||||
import rtree.RTreeException;
|
import rtree.RTreeException;
|
||||||
import rtree.Rect;
|
import rtree.Rect;
|
||||||
|
|
||||||
|
import com.google.protobuf.CodedOutputStream;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* http://wiki.openstreetmap.org/wiki/OSM_tags_for_routing#Is_inside.2Foutside
|
* http://wiki.openstreetmap.org/wiki/OSM_tags_for_routing#Is_inside.2Foutside
|
||||||
|
@ -148,13 +151,12 @@ public class IndexCreator {
|
||||||
private PreparedStatement addressStreetNodeStat;
|
private PreparedStatement addressStreetNodeStat;
|
||||||
|
|
||||||
private File mapFile;
|
private File mapFile;
|
||||||
|
private RandomAccessFile mapRAFile;
|
||||||
private Connection mapConnection;
|
private Connection mapConnection;
|
||||||
private PreparedStatement mapBinaryStat;
|
private PreparedStatement mapBinaryStat;
|
||||||
private static final int[] MAP_ZOOMS = new int[]{6, 9, 14, 22};
|
private static final int[] MAP_ZOOMS = new int[]{6, 9, 14, 22};
|
||||||
private RTree[] mapTree = null;
|
private RTree[] mapTree = null;
|
||||||
|
|
||||||
private File binaryMapFile;
|
|
||||||
|
|
||||||
// MEMORY map : save it in memory while that is allowed
|
// MEMORY map : save it in memory while that is allowed
|
||||||
private Map<Long, Set<Integer>> multiPolygonsWays0 = new LinkedHashMap<Long, Set<Integer>>();
|
private Map<Long, Set<Integer>> multiPolygonsWays0 = new LinkedHashMap<Long, Set<Integer>>();
|
||||||
private Map<Long, Set<Integer>> multiPolygonsWays1 = new LinkedHashMap<Long, Set<Integer>>();
|
private Map<Long, Set<Integer>> multiPolygonsWays1 = new LinkedHashMap<Long, Set<Integer>>();
|
||||||
|
@ -467,19 +469,13 @@ public class IndexCreator {
|
||||||
}
|
}
|
||||||
public String getMapFileName() {
|
public String getMapFileName() {
|
||||||
if(mapFileName == null){
|
if(mapFileName == null){
|
||||||
return getRegionName() + IndexConstants.MAP_INDEX_EXT;
|
return getRegionName() + IndexConstants.BINARY_MAP_INDEX_EXT;
|
||||||
}
|
}
|
||||||
return mapFileName;
|
return mapFileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBinaryMapFileName(String mapFileName) {
|
public String getTempMapDBFileName(){
|
||||||
this.binaryMapFileName = mapFileName;
|
return getMapFileName() + ".tmp";
|
||||||
}
|
|
||||||
public String getBinaryMapFileName(){
|
|
||||||
if(binaryMapFileName == null){
|
|
||||||
return getRegionName() + IndexConstants.BINARY_MAP_INDEX_EXT;
|
|
||||||
}
|
|
||||||
return binaryMapFileName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getTransportFileName() {
|
public String getTransportFileName() {
|
||||||
|
@ -1073,6 +1069,7 @@ public class IndexCreator {
|
||||||
type = MapRenderingTypes.RESTRICTION_ONLY_STRAIGHT_ON;
|
type = MapRenderingTypes.RESTRICTION_ONLY_STRAIGHT_ON;
|
||||||
}
|
}
|
||||||
if(type != -1){
|
if(type != -1){
|
||||||
|
loadEntityData(e, true);
|
||||||
Collection<EntityId> fromL = ((Relation) e).getMemberIds("from");
|
Collection<EntityId> fromL = ((Relation) e).getMemberIds("from");
|
||||||
Collection<EntityId> toL = ((Relation) e).getMemberIds("to");
|
Collection<EntityId> toL = ((Relation) e).getMemberIds("to");
|
||||||
if(!fromL.isEmpty() && !toL.isEmpty()) {
|
if(!fromL.isEmpty() && !toL.isEmpty()) {
|
||||||
|
@ -1451,15 +1448,21 @@ public class IndexCreator {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void writeBinaryData() throws IOException, SQLException {
|
public void writeBinaryMapIndex() throws IOException, SQLException {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
assert IndexConstants.IndexBinaryMapRenderObject.values().length == 6;
|
assert IndexConstants.IndexBinaryMapRenderObject.values().length == 6;
|
||||||
PreparedStatement selectData = mapConnection.prepareStatement("SELECT * FROM " + IndexBinaryMapRenderObject.getTable() + " WHERE id = ?");
|
PreparedStatement selectData = mapConnection.prepareStatement("SELECT * FROM " + IndexBinaryMapRenderObject.getTable() + " WHERE id = ?");
|
||||||
|
|
||||||
binaryMapFile = new File(workingDir, getBinaryMapFileName());
|
CodedOutputStream codedOutStream = CodedOutputStream.newInstance(new OutputStream() {
|
||||||
FileOutputStream fout = new FileOutputStream(binaryMapFile);
|
@Override
|
||||||
BinaryIndexWriter writer = new BinaryIndexWriter(fout);
|
public void write(int b) throws IOException {
|
||||||
|
mapRAFile.write(b);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
codedOutStream.writeInt32(OsmandOdb.OsmAndStructure.VERSION_FIELD_NUMBER, IndexConstants.BINARY_MAP_VERSION);
|
||||||
|
|
||||||
|
|
||||||
|
BinaryMapIndexWriter writer = new BinaryMapIndexWriter(mapRAFile, codedOutStream);
|
||||||
writer.startWriteMapIndex();
|
writer.startWriteMapIndex();
|
||||||
|
|
||||||
for (int i = 0; i < MAP_ZOOMS.length - 1; i++) {
|
for (int i = 0; i < MAP_ZOOMS.length - 1; i++) {
|
||||||
|
@ -1483,7 +1486,7 @@ public class IndexCreator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeBinaryMapTree(rtree.Node parent, RTree r, BinaryIndexWriter writer, PreparedStatement selectData) throws IOException, RTreeException, SQLException {
|
public void writeBinaryMapTree(rtree.Node parent, RTree r, BinaryMapIndexWriter writer, PreparedStatement selectData) throws IOException, RTreeException, SQLException {
|
||||||
Element[] e = parent.getAllElements();
|
Element[] e = parent.getAllElements();
|
||||||
for (int i = 0; i < parent.getTotalElements(); i++) {
|
for (int i = 0; i < parent.getTotalElements(); i++) {
|
||||||
Rect re = e[i].getRect();
|
Rect re = e[i].getRect();
|
||||||
|
@ -1644,11 +1647,12 @@ public class IndexCreator {
|
||||||
if (indexMap) {
|
if (indexMap) {
|
||||||
mapFile = new File(workingDir, getMapFileName());
|
mapFile = new File(workingDir, getMapFileName());
|
||||||
// to save space
|
// to save space
|
||||||
if (mapFile.exists()) {
|
|
||||||
mapFile.delete();
|
|
||||||
}
|
|
||||||
mapFile.getParentFile().mkdirs();
|
mapFile.getParentFile().mkdirs();
|
||||||
mapConnection = DriverManager.getConnection("jdbc:sqlite:" + mapFile.getAbsolutePath());
|
File tempDBMapFile = new File(workingDir, getTempMapDBFileName());
|
||||||
|
if(tempDBMapFile.exists()){
|
||||||
|
tempDBMapFile.delete();
|
||||||
|
}
|
||||||
|
mapConnection = DriverManager.getConnection("jdbc:sqlite:" + tempDBMapFile.getAbsolutePath());
|
||||||
|
|
||||||
DataIndexWriter.createMapIndexStructure(mapConnection);
|
DataIndexWriter.createMapIndexStructure(mapConnection);
|
||||||
mapBinaryStat = DataIndexWriter.createStatementMapBinaryInsert(mapConnection);
|
mapBinaryStat = DataIndexWriter.createStatementMapBinaryInsert(mapConnection);
|
||||||
|
@ -1847,8 +1851,11 @@ public class IndexCreator {
|
||||||
pStatements.remove(mapBinaryStat);
|
pStatements.remove(mapBinaryStat);
|
||||||
mapConnection.commit();
|
mapConnection.commit();
|
||||||
|
|
||||||
// TODO !!! create binary output stream in order to close it properly (finally)
|
if(mapFile.exists()){
|
||||||
writeBinaryData();
|
mapFile.delete();
|
||||||
|
}
|
||||||
|
mapRAFile = new RandomAccessFile(mapFile, "rw");
|
||||||
|
writeBinaryMapIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -1888,14 +1895,21 @@ public class IndexCreator {
|
||||||
transportIndexFile.setLastModified(lastModifiedDate);
|
transportIndexFile.setLastModified(lastModifiedDate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(mapRAFile != null){
|
||||||
|
mapRAFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
if (mapConnection != null) {
|
if (mapConnection != null) {
|
||||||
mapConnection.commit();
|
mapConnection.commit();
|
||||||
mapConnection.close();
|
mapConnection.close();
|
||||||
mapConnection = null;
|
mapConnection = null;
|
||||||
if (lastModifiedDate != null) {
|
if (lastModifiedDate != null && mapFile.exists()) {
|
||||||
mapFile.setLastModified(lastModifiedDate);
|
mapFile.setLastModified(lastModifiedDate);
|
||||||
}
|
}
|
||||||
|
File tempDBFile = new File(getTempMapDBFileName());
|
||||||
|
if(tempDBFile.exists()){
|
||||||
|
tempDBFile.delete();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addressConnection != null) {
|
if (addressConnection != null) {
|
||||||
|
|
Loading…
Reference in a new issue