Local changes

This commit is contained in:
Victor Shcherb 2012-10-22 00:45:12 +02:00
parent 282f8a784d
commit 35f6a1757a
3 changed files with 178 additions and 215 deletions

View file

@ -316,7 +316,7 @@ public class BinaryMapIndexWriter {
} }
} }
public void startRouteBorderBox(int leftX, int rightX, int topY, int bottomY, int zoomToSplit, boolean basemap) throws IOException { public void startWriteRouteBorderBox(int leftX, int rightX, int topY, int bottomY, int zoomToSplit, boolean basemap) throws IOException {
pushState(ROUTE_BORDER_BOX, ROUTE_INDEX_INIT); pushState(ROUTE_BORDER_BOX, ROUTE_INDEX_INIT);
if(basemap) { if(basemap) {
codedOutStream.writeTag(OsmAndRoutingIndex.BASEBORDERBOX_FIELD_NUMBER, WireFormat.WIRETYPE_FIXED32_LENGTH_DELIMITED); codedOutStream.writeTag(OsmAndRoutingIndex.BASEBORDERBOX_FIELD_NUMBER, WireFormat.WIRETYPE_FIXED32_LENGTH_DELIMITED);
@ -366,7 +366,7 @@ public class BinaryMapIndexWriter {
codedOutStream.writeMessageNoTag(builder.build()); codedOutStream.writeMessageNoTag(builder.build());
} }
public void endRouteBorderBox() throws IOException { public void endWriteRouteBorderBox() throws IOException {
stackBounds.pop(); stackBounds.pop();
popState(ROUTE_BORDER_BOX); popState(ROUTE_BORDER_BOX);
writeInt32Size(); writeInt32Size();
@ -1165,7 +1165,7 @@ public class BinaryMapIndexWriter {
codedOutStream.writeMessage(OsmAndTransportIndex.STRINGTABLE_FIELD_NUMBER, st.build()); codedOutStream.writeMessage(OsmAndTransportIndex.STRINGTABLE_FIELD_NUMBER, st.build());
} }
public long startWritePOIIndex(String name, int left31, int right31, int bottom31, int top31) throws IOException { public long startWritePoiIndex(String name, int left31, int right31, int bottom31, int top31) throws IOException {
pushState(POI_INDEX_INIT, OSMAND_STRUCTURE_INIT); pushState(POI_INDEX_INIT, OSMAND_STRUCTURE_INIT);
codedOutStream.writeTag(OsmandOdb.OsmAndStructure.POIINDEX_FIELD_NUMBER, WireFormat.WIRETYPE_FIXED32_LENGTH_DELIMITED); codedOutStream.writeTag(OsmandOdb.OsmAndStructure.POIINDEX_FIELD_NUMBER, WireFormat.WIRETYPE_FIXED32_LENGTH_DELIMITED);
stackBounds.push(new Bounds(0, 0, 0, 0)); // for poi index tree stackBounds.push(new Bounds(0, 0, 0, 0)); // for poi index tree
@ -1183,14 +1183,14 @@ public class BinaryMapIndexWriter {
return startPointer; return startPointer;
} }
public void endWritePOIIndex() throws IOException { public void endWritePoiIndex() throws IOException {
popState(POI_INDEX_INIT); popState(POI_INDEX_INIT);
int len = writeInt32Size(); int len = writeInt32Size();
stackBounds.pop(); stackBounds.pop();
log.info("POI INDEX SIZE : " + len); log.info("POI INDEX SIZE : " + len);
} }
public Map<String, Integer> writePOICategoriesTable(Map<String, Map<String, Integer>> categories) throws IOException { public Map<String, Integer> writePoiCategoriesTable(Map<String, Map<String, Integer>> categories) throws IOException {
checkPeekState(POI_INDEX_INIT); checkPeekState(POI_INDEX_INIT);
Map<String, Integer> catIndexes = new LinkedHashMap<String, Integer>(); Map<String, Integer> catIndexes = new LinkedHashMap<String, Integer>();
int i = 0; int i = 0;
@ -1213,7 +1213,7 @@ public class BinaryMapIndexWriter {
return catIndexes; return catIndexes;
} }
public void writePOICategories(TIntArrayList categories) throws IOException { public void writePoiCategories(TIntArrayList categories) throws IOException {
checkPeekState(POI_BOX); checkPeekState(POI_BOX);
OsmandOdb.OsmAndPoiCategories.Builder builder = OsmandOdb.OsmAndPoiCategories.newBuilder(); OsmandOdb.OsmAndPoiCategories.Builder builder = OsmandOdb.OsmAndPoiCategories.newBuilder();
int prev = -1; int prev = -1;

View file

@ -290,11 +290,11 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
int left31 = minX; int left31 = minX;
int bottom31 = maxY; int bottom31 = maxY;
int top31 = minY; int top31 = minY;
long startFpPoiIndex = writer.startWritePOIIndex(regionName, left31, right31, bottom31, top31); long startFpPoiIndex = writer.startWritePoiIndex(regionName, left31, right31, bottom31, top31);
// 2. write categories table // 2. write categories table
Map<String, Map<String, Integer>> categories = rootZoomsTree.node.categories; Map<String, Map<String, Integer>> categories = rootZoomsTree.node.categories;
Map<String, Integer> catIndexes = writer.writePOICategoriesTable(categories); Map<String, Integer> catIndexes = writer.writePoiCategoriesTable(categories);
// 2.5 write names table // 2.5 write names table
Map<PoiTileBox, List<BinaryFileReference>> fpToWriteSeeks = writer.writePoiNameIndex(namesIndex, startFpPoiIndex); Map<PoiTileBox, List<BinaryFileReference>> fpToWriteSeeks = writer.writePoiNameIndex(namesIndex, startFpPoiIndex);
@ -380,7 +380,7 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
prepareStatement.close(); prepareStatement.close();
writer.endWritePOIIndex(); writer.endWritePoiIndex();
} }
@ -439,7 +439,7 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
buildTypeIds(cat, subcat, categories, catIndexes, types); buildTypeIds(cat, subcat, categories, catIndexes, types);
} }
} }
writer.writePOICategories(types); writer.writePoiCategories(types);
} }
if (!end) { if (!end) {

View file

@ -23,7 +23,6 @@ import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -82,8 +81,8 @@ public class IndexRouteCreator extends AbstractIndexPartCreator {
TLongObjectHashMap<TIntArrayList> pointTypes = new TLongObjectHashMap<TIntArrayList>(); TLongObjectHashMap<TIntArrayList> pointTypes = new TLongObjectHashMap<TIntArrayList>();
Map<MapRoutingTypes.MapRouteType, String> names = new HashMap<MapRoutingTypes.MapRouteType, String>(); Map<MapRoutingTypes.MapRouteType, String> names = new HashMap<MapRoutingTypes.MapRouteType, String>();
TLongObjectHashMap<GeneralizedCluster> generalClusters = new TLongObjectHashMap<GeneralizedCluster>(); TLongObjectHashMap<GeneralizedCluster> generalClusters = new TLongObjectHashMap<GeneralizedCluster>();
private PreparedStatement mapRouteInsertStat; private PreparedStatement mapRouteInsertStat;
private PreparedStatement basemapRouteInsertStat; private PreparedStatement basemapRouteInsertStat;
@ -92,163 +91,6 @@ public class IndexRouteCreator extends AbstractIndexPartCreator {
this.logMapDataWarn = logMapDataWarn; this.logMapDataWarn = logMapDataWarn;
this.routeTypes = new MapRoutingTypes(); this.routeTypes = new MapRoutingTypes();
} }
/*private*/ static class GeneralizedCluster {
public final int x;
public final int y;
public final int zoom;
public GeneralizedCluster(int x, int y, int z){
this.x = x;
this.y = y;
this.zoom = z;
}
public final Set<GeneralizedWay> ways = new HashSet<IndexRouteCreator.GeneralizedWay>();
// either LinkedList<GeneralizedWay> or GeneralizedWay
public final TLongObjectHashMap<Object> map = new TLongObjectHashMap<Object>();
@SuppressWarnings({ "rawtypes", "unchecked" })
public void replaceWayFromLocation(GeneralizedWay delete, int ind, GeneralizedWay toReplace){
ways.remove(delete);
long loc = delete.getLocation(ind);
Object o = map.get(loc);
if(o instanceof GeneralizedWay){
if(delete == o) {
map.put(loc, toReplace);
} else if(toReplace != o){
addWay(toReplace, loc);
}
} else if(o instanceof LinkedList){
((LinkedList) o).remove(delete);
if(!((LinkedList) o).contains(toReplace)){
((LinkedList) o).add(toReplace);
}
} else {
map.put(loc, toReplace);
}
}
public void removeWayFromLocation(GeneralizedWay delete, int ind){
removeWayFromLocation(delete, ind, false);
}
@SuppressWarnings("rawtypes")
public void removeWayFromLocation(GeneralizedWay delete, int ind, boolean deleteAll) {
long loc = delete.getLocation(ind);
boolean ex = false;
if (!deleteAll) {
for (int t = 0; t < delete.size(); t++) {
if (t != ind && map.containsKey(delete.getLocation(t))) {
ex = true;
break;
}
}
}
if (!ex || deleteAll) {
ways.remove(delete);
}
Object o = map.get(loc);
if (o instanceof GeneralizedWay) {
if (delete == o) {
map.remove(loc);
}
} else if (o instanceof LinkedList) {
((LinkedList) o).remove(delete);
if (((LinkedList) o).size() == 1) {
map.put(loc, ((LinkedList) o).iterator().next());
} else if (((LinkedList) o).size() == 0) {
map.remove(loc);
}
}
}
public void addWayFromLocation(GeneralizedWay w, int i) {
ways.add(w);
long loc = w.getLocation(i);
addWay(w, loc);
}
@SuppressWarnings("unchecked")
private void addWay(GeneralizedWay w, long loc) {
if (map.containsKey(loc)) {
Object o = map.get(loc);
if (o instanceof LinkedList) {
if(!((LinkedList<GeneralizedWay>) o).contains(w)){
((LinkedList<GeneralizedWay>) o).add(w);
}
} else if(o != w){
LinkedList<GeneralizedWay> list = new LinkedList<GeneralizedWay>();
list.add((GeneralizedWay) o);
list.add(w);
map.put(loc, list);
}
} else {
map.put(loc, w);
}
}
}
private static class GeneralizedWay {
private long id;
private int mainType;
private TIntHashSet addtypes = new TIntHashSet();
private TIntArrayList px = new TIntArrayList();
private TIntArrayList py = new TIntArrayList();
// TLongObjectHashMap<TIntArrayList> pointTypes = new TLongObjectHashMap<TIntArrayList>();
private Map<MapRoutingTypes.MapRouteType, String> names = new HashMap<MapRoutingTypes.MapRouteType, String>();
public GeneralizedWay(long id) {
this.id = id;
}
public double getDistance() {
double dx = 0;
for (int i = 1; i < px.size(); i++) {
dx += MapUtils.getDistance(MapUtils.get31LatitudeY(py.get(i - 1)), MapUtils.get31LongitudeX(px.get(i - 1)),
MapUtils.get31LatitudeY(py.get(i)), MapUtils.get31LongitudeX(px.get(i)));
}
return dx;
}
public long getLocation(int ind) {
return getBaseId(px.get(ind), py.get(ind));
}
public int size(){
return px.size();
}
// Gives route direction of EAST degrees from NORTH ]-PI, PI]
public double directionRoute(int startPoint, boolean plus) {
float dist = 5;
int x = this.px.get(startPoint);
int y = this.py.get(startPoint);
int nx = startPoint;
int px = x;
int py = y;
double total = 0;
do {
if (plus) {
nx++;
if (nx >= size()) {
break;
}
} else {
nx--;
if (nx < 0) {
break;
}
}
px = this.px.get(nx);
py = this.py.get(nx);
// translate into meters
total += Math.abs(px - x) * 0.011d + Math.abs(py - y) * 0.01863d;
} while (total < dist);
return -Math.atan2( x - px, y - py );
}
}
public void indexRelations(Entity e, OsmDbAccessorContext ctx) throws SQLException { public void indexRelations(Entity e, OsmDbAccessorContext ctx) throws SQLException {
indexHighwayRestrictions(e, ctx); indexHighwayRestrictions(e, ctx);
} }
@ -262,8 +104,8 @@ public class IndexRouteCreator extends AbstractIndexPartCreator {
// Load point with tags! // Load point with tags!
ctx.loadEntityWay(e); ctx.loadEntityWay(e);
routeTypes.encodePointTypes(e, pointTypes); routeTypes.encodePointTypes(e, pointTypes);
addWayToIndex(e.getId(), e.getNodes(), mapRouteInsertStat, routeTree); // addWayToIndex(e.getId(), e.getNodes(), mapRouteInsertStat, routeTree);
generalizeWay(e); // generalizeWay(e);
} }
} }
@ -567,6 +409,9 @@ public class IndexRouteCreator extends AbstractIndexPartCreator {
routeTree, false); routeTree, false);
TLongObjectHashMap<BinaryFileReference> base = writeBinaryRouteIndexHeader(writer, TLongObjectHashMap<BinaryFileReference> base = writeBinaryRouteIndexHeader(writer,
baserouteTree, true); baserouteTree, true);
writeBorderBox(false);
writeBorderBox(true);
writeBinaryRouteIndexBlocks(writer, routeTree, false, route); writeBinaryRouteIndexBlocks(writer, routeTree, false, route);
writeBinaryRouteIndexBlocks(writer, baserouteTree, true, base); writeBinaryRouteIndexBlocks(writer, baserouteTree, true, base);
@ -577,6 +422,10 @@ public class IndexRouteCreator extends AbstractIndexPartCreator {
} }
} }
private void writeBorderBox(boolean basemap) {
// TODO Auto-generated method stub
}
private Node convertBaseToNode(long s) { private Node convertBaseToNode(long s) {
long x = s >> 31; long x = s >> 31;
long y = s - (x << 31); long y = s - (x << 31);
@ -680,10 +529,6 @@ public class IndexRouteCreator extends AbstractIndexPartCreator {
// 3. Douglas peuker simplifications // 3. Douglas peuker simplifications
douglasPeukerSimplificationStep(clusters); douglasPeukerSimplificationStep(clusters);
// 4. remove line duplication
// very buggy poland (deletes part of motorway)
// removeSmall2RoadsConnectors(clusters);
// 5. write to db // 5. write to db
TLongHashSet ids = new TLongHashSet(); TLongHashSet ids = new TLongHashSet();
@ -842,47 +687,7 @@ public class IndexRouteCreator extends AbstractIndexPartCreator {
} }
} }
} }
private void removeSmall2RoadsConnectors(Collection<GeneralizedCluster> clusters) {
for(GeneralizedCluster cluster : clusters) {
ArrayList<GeneralizedWay> copy = new ArrayList<GeneralizedWay>(cluster.ways);
for (GeneralizedWay gw : copy) {
// roundabout
if (gw.getDistance() < 500) {
LinkedHashSet<GeneralizedWay> ll = new LinkedHashSet<GeneralizedWay>();
for (int i = 0; i < gw.size(); i++) {
getAdjacentRoads(cluster, gw, i, ll);
}
if(ll.size() <= 1) {
removeGeneratedWay(gw, cluster);
} else if(ll.size() >= 2){
boolean intersect = true;
while(ll.size() > 1 && intersect) {
Iterator<GeneralizedWay> it = ll.iterator();
GeneralizedWay first = it.next();
it.remove();
intersect = false;
LinkedHashSet<GeneralizedWay> ls = new LinkedHashSet<GeneralizedWay>();
for(int j = 0; j< first.size(); j++) {
getAdjacentRoads(cluster, first, j, ls);
if(ls.containsAll(ll)) {
intersect = true;
break;
}
}
}
if(intersect) {
removeGeneratedWay(gw, cluster);
}
}
}
}
}
}
private void removeGeneratedWay(GeneralizedWay gw, GeneralizedCluster gcluster) { private void removeGeneratedWay(GeneralizedWay gw, GeneralizedCluster gcluster) {
for (int i = 0; i < gw.size(); i++) { for (int i = 0; i < gw.size(); i++) {
gcluster = getCluster(gw, i, gcluster); gcluster = getCluster(gw, i, gcluster);
@ -1225,4 +1030,162 @@ public class IndexRouteCreator extends AbstractIndexPartCreator {
/*private*/ static class GeneralizedCluster {
public final int x;
public final int y;
public final int zoom;
public GeneralizedCluster(int x, int y, int z){
this.x = x;
this.y = y;
this.zoom = z;
}
public final Set<GeneralizedWay> ways = new HashSet<IndexRouteCreator.GeneralizedWay>();
// either LinkedList<GeneralizedWay> or GeneralizedWay
public final TLongObjectHashMap<Object> map = new TLongObjectHashMap<Object>();
@SuppressWarnings({ "rawtypes", "unchecked" })
public void replaceWayFromLocation(GeneralizedWay delete, int ind, GeneralizedWay toReplace){
ways.remove(delete);
long loc = delete.getLocation(ind);
Object o = map.get(loc);
if(o instanceof GeneralizedWay){
if(delete == o) {
map.put(loc, toReplace);
} else if(toReplace != o){
addWay(toReplace, loc);
}
} else if(o instanceof LinkedList){
((LinkedList) o).remove(delete);
if(!((LinkedList) o).contains(toReplace)){
((LinkedList) o).add(toReplace);
}
} else {
map.put(loc, toReplace);
}
}
public void removeWayFromLocation(GeneralizedWay delete, int ind){
removeWayFromLocation(delete, ind, false);
}
@SuppressWarnings("rawtypes")
public void removeWayFromLocation(GeneralizedWay delete, int ind, boolean deleteAll) {
long loc = delete.getLocation(ind);
boolean ex = false;
if (!deleteAll) {
for (int t = 0; t < delete.size(); t++) {
if (t != ind && map.containsKey(delete.getLocation(t))) {
ex = true;
break;
}
}
}
if (!ex || deleteAll) {
ways.remove(delete);
}
Object o = map.get(loc);
if (o instanceof GeneralizedWay) {
if (delete == o) {
map.remove(loc);
}
} else if (o instanceof LinkedList) {
((LinkedList) o).remove(delete);
if (((LinkedList) o).size() == 1) {
map.put(loc, ((LinkedList) o).iterator().next());
} else if (((LinkedList) o).size() == 0) {
map.remove(loc);
}
}
}
public void addWayFromLocation(GeneralizedWay w, int i) {
ways.add(w);
long loc = w.getLocation(i);
addWay(w, loc);
}
@SuppressWarnings("unchecked")
private void addWay(GeneralizedWay w, long loc) {
if (map.containsKey(loc)) {
Object o = map.get(loc);
if (o instanceof LinkedList) {
if(!((LinkedList<GeneralizedWay>) o).contains(w)){
((LinkedList<GeneralizedWay>) o).add(w);
}
} else if(o != w){
LinkedList<GeneralizedWay> list = new LinkedList<GeneralizedWay>();
list.add((GeneralizedWay) o);
list.add(w);
map.put(loc, list);
}
} else {
map.put(loc, w);
}
}
}
/*private*/ static class GeneralizedWay {
private long id;
private int mainType;
private TIntHashSet addtypes = new TIntHashSet();
private TIntArrayList px = new TIntArrayList();
private TIntArrayList py = new TIntArrayList();
// TLongObjectHashMap<TIntArrayList> pointTypes = new TLongObjectHashMap<TIntArrayList>();
private Map<MapRoutingTypes.MapRouteType, String> names = new HashMap<MapRoutingTypes.MapRouteType, String>();
public GeneralizedWay(long id) {
this.id = id;
}
public double getDistance() {
double dx = 0;
for (int i = 1; i < px.size(); i++) {
dx += MapUtils.getDistance(MapUtils.get31LatitudeY(py.get(i - 1)), MapUtils.get31LongitudeX(px.get(i - 1)),
MapUtils.get31LatitudeY(py.get(i)), MapUtils.get31LongitudeX(px.get(i)));
}
return dx;
}
public long getLocation(int ind) {
return getBaseId(px.get(ind), py.get(ind));
}
public int size(){
return px.size();
}
// Gives route direction of EAST degrees from NORTH ]-PI, PI]
public double directionRoute(int startPoint, boolean plus) {
float dist = 5;
int x = this.px.get(startPoint);
int y = this.py.get(startPoint);
int nx = startPoint;
int px = x;
int py = y;
double total = 0;
do {
if (plus) {
nx++;
if (nx >= size()) {
break;
}
} else {
nx--;
if (nx < 0) {
break;
}
}
px = this.px.get(nx);
py = this.py.get(nx);
// translate into meters
total += Math.abs(px - x) * 0.011d + Math.abs(py - y) * 0.01863d;
} while (total < dist);
return -Math.atan2( x - px, y - py );
}
}
} }