implement map zooms class

git-svn-id: https://osmand.googlecode.com/svn/trunk@727 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
Victor Shcherb 2010-11-30 10:22:05 +00:00
parent 8c6d3d409e
commit abc586c825
6 changed files with 126 additions and 28 deletions

View file

@ -25,6 +25,7 @@ import javax.xml.parsers.ParserConfigurationException;
import net.osmand.Algoritms; import net.osmand.Algoritms;
import net.osmand.LogUtil; import net.osmand.LogUtil;
import net.osmand.data.preparation.IndexCreator; import net.osmand.data.preparation.IndexCreator;
import net.osmand.data.preparation.MapZooms;
import net.osmand.impl.ConsoleProgressImplementation; import net.osmand.impl.ConsoleProgressImplementation;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -50,6 +51,7 @@ public class IndexBatchCreator {
boolean downloadFiles = false; boolean downloadFiles = false;
boolean generateIndexes = false; boolean generateIndexes = false;
boolean uploadIndexes = false; boolean uploadIndexes = false;
MapZooms mapZooms = null;
boolean deleteFilesAfterUploading = true; boolean deleteFilesAfterUploading = true;
File osmDirFiles; File osmDirFiles;
@ -123,6 +125,12 @@ public class IndexBatchCreator {
indexMap = Boolean.parseBoolean(process.getAttribute("indexMap")); indexMap = Boolean.parseBoolean(process.getAttribute("indexMap"));
indexTransport = Boolean.parseBoolean(process.getAttribute("indexTransport")); indexTransport = Boolean.parseBoolean(process.getAttribute("indexTransport"));
indexAddress = Boolean.parseBoolean(process.getAttribute("indexAddress")); indexAddress = Boolean.parseBoolean(process.getAttribute("indexAddress"));
String zooms = process.getAttribute("mapZooms");
if(zooms == null || zooms.length() == 0){
mapZooms = MapZooms.getDefault();
} else {
mapZooms = MapZooms.parseZooms(zooms);
}
String dir = process.getAttribute("directory_for_osm_files"); String dir = process.getAttribute("directory_for_osm_files");
if(dir == null || !new File(dir).exists()) { if(dir == null || !new File(dir).exists()) {
@ -288,7 +296,7 @@ public class IndexBatchCreator {
indexCreator.setMapFileName(mapFileName); indexCreator.setMapFileName(mapFileName);
try { try {
alreadyGeneratedFiles.add(f.getName()); alreadyGeneratedFiles.add(f.getName());
indexCreator.generateIndexes(f, new ConsoleProgressImplementation(3), null); indexCreator.generateIndexes(f, new ConsoleProgressImplementation(3), null, mapZooms);
if (indexPOI) { if (indexPOI) {
uploadIndex(new File(indexDirFiles, poiFileName), alreadyUploadedFiles); uploadIndex(new File(indexDirFiles, poiFileName), alreadyUploadedFiles);
} }

View file

@ -22,7 +22,7 @@
<process directory_for_osm_files="E:/Information/OSM maps/osm_batch" directory_for_index_files="E:/Information/OSM maps/osm_batch_ind" <process directory_for_osm_files="E:/Information/OSM maps/osm_batch" directory_for_index_files="E:/Information/OSM maps/osm_batch_ind"
downloadOsmFiles="true" generateIndexes="true" uploadIndexes="true" downloadOsmFiles="true" generateIndexes="true" uploadIndexes="true"
deleteFilesAfterUploading="true" indexPOI="true" indexMap="true" deleteFilesAfterUploading="true" indexPOI="true" indexMap="true"
indexTransport="true" indexAddress="true"> indexTransport="true" indexAddress="true" mapZooms="">
<!-- Countries to download from osm server --> <!-- Countries to download from osm server -->

View file

@ -153,17 +153,11 @@ public class IndexCreator {
private RTree transportStopsTree; private RTree transportStopsTree;
private RTree[] mapTree = null; private RTree[] mapTree = null;
// maximum 5 limitation => 4 levels allowed private MapZooms mapZooms = null;
public static final int[] MAP_ZOOMS = new int[] { 5, 8, 11, 14, 22 };
// public static final int[] MAP_ZOOMS = new int[]{5, 9, 14, 22};
// 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>>[] multiPolygonsWays = new Map[MAP_ZOOMS.length - 1]; private Map<Long, Set<Integer>>[] multiPolygonsWays;
{
for (int i = 0; i < multiPolygonsWays.length; i++) {
multiPolygonsWays[i] = new LinkedHashMap<Long, Set<Integer>>();
}
}
private Map<Long, String> multiPolygonsNames = new LinkedHashMap<Long, String>(); private Map<Long, String> multiPolygonsNames = new LinkedHashMap<Long, String>();
private Map<Long, List<Long>> highwayRestrictions = new LinkedHashMap<Long, List<Long>>(); private Map<Long, List<Long>> highwayRestrictions = new LinkedHashMap<Long, List<Long>>();
@ -231,7 +225,7 @@ public class IndexCreator {
this.normalizeStreets = normalizeStreets; this.normalizeStreets = normalizeStreets;
} }
protected static int defineLevel(int minZoom) { /* protected static int defineLevel(int minZoom) {
int level = 0; int level = 0;
if (minZoom < 15) { if (minZoom < 15) {
for (int i = 1; i < MAP_ZOOMS.length; i++) { for (int i = 1; i < MAP_ZOOMS.length; i++) {
@ -243,7 +237,7 @@ public class IndexCreator {
} }
return level; return level;
} }
*/
protected class NewDataExtractionOsmFilter implements IOsmStorageFilter { protected class NewDataExtractionOsmFilter implements IOsmStorageFilter {
int currentCountNode = 0; int currentCountNode = 0;
@ -1130,7 +1124,7 @@ public class IndexCreator {
// manipulate what kind of way to load // manipulate what kind of way to load
loadEntityData(e, false); loadEntityData(e, false);
boolean inverse = "-1".equals(e.getTag(OSMTagKey.ONEWAY)); //$NON-NLS-1$ boolean inverse = "-1".equals(e.getTag(OSMTagKey.ONEWAY)); //$NON-NLS-1$
for (int i = 0; i < MAP_ZOOMS.length - 1; i++) { for (int i = 0; i < mapZooms.size(); i++) {
writeBinaryEntityToMapDatabase(e, e.getId(), i == 0 ? inverse : false, i); writeBinaryEntityToMapDatabase(e, e.getId(), i == 0 ? inverse : false, i);
} }
@ -1374,7 +1368,7 @@ public class IndexCreator {
} }
private int findMultiPolygonType(Entity e, int level) { private int findMultiPolygonType(Entity e, int level) {
int t = MapRenderingTypes.encodeEntityWithType(e, MAP_ZOOMS[MAP_ZOOMS.length - level - 1], true, typeUse); int t = MapRenderingTypes.encodeEntityWithType(e, mapZooms.getLevel(level).getMaxZoom(), true, typeUse);
int mtType = 0; int mtType = 0;
if (t != 0) { if (t != 0) {
if ((t & 3) == MapRenderingTypes.MULTY_POLYGON_TYPE) { if ((t & 3) == MapRenderingTypes.MULTY_POLYGON_TYPE) {
@ -1501,7 +1495,7 @@ public class IndexCreator {
} }
private void writeBinaryEntityToMapDatabase(Entity e, long baseId, boolean inverse, int level) throws SQLException { private void writeBinaryEntityToMapDatabase(Entity e, long baseId, boolean inverse, int level) throws SQLException {
int type = MapRenderingTypes.encodeEntityWithType(e, MAP_ZOOMS[MAP_ZOOMS.length - level - 1], false, typeUse); int type = MapRenderingTypes.encodeEntityWithType(e, mapZooms.getLevel(level).getMaxZoom(), false, typeUse);
Map<Long, Set<Integer>> multiPolygonsWays = this.multiPolygonsWays[level]; Map<Long, Set<Integer>> multiPolygonsWays = this.multiPolygonsWays[level];
boolean hasMulti = e instanceof Way && multiPolygonsWays.containsKey(e.getId()); boolean hasMulti = e instanceof Way && multiPolygonsWays.containsKey(e.getId());
if (hasMulti) { if (hasMulti) {
@ -1545,7 +1539,7 @@ public class IndexCreator {
int zoom; int zoom;
long id = (baseId << 3) | ((level & 3) << 1); long id = (baseId << 3) | ((level & 3) << 1);
rtree = mapTree[level]; rtree = mapTree[level];
zoom = MAP_ZOOMS[MAP_ZOOMS.length - level - 1] - 1; zoom = mapZooms.getLevel(level).getMaxZoom() - 1;
boolean skip = false; boolean skip = false;
String eName = MapRenderingTypes.getEntityName(e, type); String eName = MapRenderingTypes.getEntityName(e, type);
@ -1690,7 +1684,7 @@ public class IndexCreator {
visitedWays.add(id); visitedWays.add(id);
int level = rs.getInt(7); int level = rs.getInt(7);
int zoom = MAP_ZOOMS[MAP_ZOOMS.length - level - 1]; int zoom = mapZooms.getLevel(level).getMaxZoom();
long startNode = rs.getLong(2); long startNode = rs.getLong(2);
long endNode = rs.getLong(3); long endNode = rs.getLong(3);
@ -1980,14 +1974,14 @@ public class IndexCreator {
writer.startWriteMapIndex(regionName); writer.startWriteMapIndex(regionName);
for (int i = 0; i < MAP_ZOOMS.length - 1; i++) { for (int i = 0; i < mapZooms.size(); i++) {
RTree rtree = mapTree[i]; RTree rtree = mapTree[i];
long rootIndex = rtree.getFileHdr().getRootIndex(); long rootIndex = rtree.getFileHdr().getRootIndex();
rtree.Node root = rtree.getReadNode(rootIndex); rtree.Node root = rtree.getReadNode(rootIndex);
Rect rootBounds = calcBounds(root); Rect rootBounds = calcBounds(root);
if (rootBounds != null) { if (rootBounds != null) {
boolean last = nodeIsLastSubTree(rtree, rootIndex); boolean last = nodeIsLastSubTree(rtree, rootIndex);
writer.startWriteMapLevelIndex(MAP_ZOOMS[MAP_ZOOMS.length - i - 2] + 1, MAP_ZOOMS[MAP_ZOOMS.length - i - 1], rootBounds writer.startWriteMapLevelIndex(mapZooms.getLevel(i).getMinZoom(), mapZooms.getLevel(i).getMaxZoom(), rootBounds
.getMinX(), rootBounds.getMaxX(), rootBounds.getMinY(), rootBounds.getMaxY()); .getMinX(), rootBounds.getMaxX(), rootBounds.getMinY(), rootBounds.getMaxY());
if (last) { if (last) {
writer.startMapTreeElement(rootBounds.getMinX(), rootBounds.getMaxX(), rootBounds.getMinY(), rootBounds.getMaxY()); writer.startMapTreeElement(rootBounds.getMinX(), rootBounds.getMaxX(), rootBounds.getMinY(), rootBounds.getMaxY());
@ -2235,9 +2229,15 @@ public class IndexCreator {
return mapFile.getAbsolutePath() + ".prtree"; //$NON-NLS-1$ return mapFile.getAbsolutePath() + ".prtree"; //$NON-NLS-1$
} }
public void generateIndexes(File readFile, IProgress progress, IOsmStorageFilter addFilter) throws IOException, SAXException, public void generateIndexes(File readFile, IProgress progress, IOsmStorageFilter addFilter, MapZooms mapZooms) throws IOException, SAXException,
SQLException { SQLException {
this.mapZooms = mapZooms;
multiPolygonsWays = new Map[mapZooms.size()];
for (int i = 0; i < multiPolygonsWays.length; i++) {
multiPolygonsWays[i] = new LinkedHashMap<Long, Set<Integer>>();
}
// clear previous results and setting variables // clear previous results and setting variables
if (readFile != null && regionName == null) { if (readFile != null && regionName == null) {
int i = readFile.getName().indexOf('.'); int i = readFile.getName().indexOf('.');
@ -2301,8 +2301,8 @@ public class IndexCreator {
mapConnection.setAutoCommit(false); mapConnection.setAutoCommit(false);
try { try {
if (indexMap) { if (indexMap) {
mapTree = new RTree[MAP_ZOOMS.length - 1]; mapTree = new RTree[mapZooms.size()];
for (int i = 0; i < MAP_ZOOMS.length - 1; i++) { for (int i = 0; i < mapZooms.size(); i++) {
mapTree[i] = new RTree(getRTreeMapIndexPackFileName() + i); mapTree[i] = new RTree(getRTreeMapIndexPackFileName() + i);
} }
@ -2397,7 +2397,7 @@ public class IndexCreator {
if (indexMap) { if (indexMap) {
progress.setGeneralProgress("[90 / 100]"); //$NON-NLS-1$ progress.setGeneralProgress("[90 / 100]"); //$NON-NLS-1$
progress.startTask(Messages.getString("IndexCreator.PACK_RTREE_MAP"), -1); //$NON-NLS-1$ progress.startTask(Messages.getString("IndexCreator.PACK_RTREE_MAP"), -1); //$NON-NLS-1$
for (int i = 0; i < MAP_ZOOMS.length - 1; i++) { for (int i = 0; i < mapZooms.size(); i++) {
mapTree[i] = packRtreeFile(mapTree[i], getRTreeMapIndexNonPackFileName() + i, getRTreeMapIndexPackFileName() + i); mapTree[i] = packRtreeFile(mapTree[i], getRTreeMapIndexNonPackFileName() + i, getRTreeMapIndexPackFileName() + i);
} }
} }
@ -2663,8 +2663,8 @@ public class IndexCreator {
mapBinaryStat = DataIndexWriter.createStatementMapBinaryInsert(mapConnection); mapBinaryStat = DataIndexWriter.createStatementMapBinaryInsert(mapConnection);
mapLowLevelBinaryStat = DataIndexWriter.createStatementLowLevelMapBinaryInsert(mapConnection); mapLowLevelBinaryStat = DataIndexWriter.createStatementLowLevelMapBinaryInsert(mapConnection);
try { try {
mapTree = new RTree[MAP_ZOOMS.length - 1]; mapTree = new RTree[mapZooms.size()];
for (int i = 0; i < MAP_ZOOMS.length - 1; i++) { for (int i = 0; i < mapZooms.size(); i++) {
File file = new File(getRTreeMapIndexNonPackFileName() + i); File file = new File(getRTreeMapIndexNonPackFileName() + i);
if (file.exists()) { if (file.exists()) {
file.delete(); file.delete();
@ -2777,7 +2777,7 @@ public class IndexCreator {
creator.deleteDatabaseIndexes = true; creator.deleteDatabaseIndexes = true;
creator.setNodesDBFile(new File("e:/Information/OSM maps/osmand/minsk.tmp.odb")); creator.setNodesDBFile(new File("e:/Information/OSM maps/osmand/minsk.tmp.odb"));
creator.generateIndexes(new File("e:/Information/OSM maps/belarus osm/minsk.osm"), new ConsoleProgressImplementation(3), null); creator.generateIndexes(new File("e:/Information/OSM maps/belarus osm/minsk.osm"), new ConsoleProgressImplementation(3), null, MapZooms.getDefault());
// creator.setNodesDBFile(new File("e:/Information/OSM maps/osmand/belarus_nodes.tmp.odb")); //$NON-NLS-1$ // creator.setNodesDBFile(new File("e:/Information/OSM maps/osmand/belarus_nodes.tmp.odb")); //$NON-NLS-1$

View file

@ -0,0 +1,80 @@
package net.osmand.data.preparation;
import java.util.ArrayList;
import java.util.List;
public class MapZooms {
public static class MapZoomPair {
private int minZoom;
private int maxZoom;
public MapZoomPair(int minZoom, int maxZoom) {
this.maxZoom = maxZoom;
this.minZoom = minZoom;
}
public int getMinZoom() {
return minZoom;
}
public int getMaxZoom() {
return maxZoom;
}
}
private List<MapZoomPair> levels = new ArrayList<MapZoomPair>();
public List<MapZoomPair> getLevels() {
return levels;
}
public void setLevels(List<MapZoomPair> levels) {
this.levels = levels;
}
/**
* @param zooms - could be 5-8;7-10;13-15;15
*/
public static MapZooms parseZooms(String zooms) throws IllegalArgumentException {
String[] split = zooms.split(";");
int zeroLevel = 15;
List<MapZoomPair> list = new ArrayList<MapZoomPair>();
for(String s : split){
int i = s.indexOf('-');
if(i == -1){
zeroLevel = Integer.parseInt(s);
} else {
list.add(0, new MapZoomPair(Integer.parseInt(s.substring(0, i)), Integer.parseInt(s.substring(i + 1))));
}
}
list.add(0, new MapZoomPair(zeroLevel, 22));
if(list.size() < 1 || list.size() > 4){
throw new IllegalArgumentException("Map zooms should have at least 1 level and less than 4 levels");
}
MapZooms mapZooms = new MapZooms();
mapZooms.setLevels(list);
return mapZooms;
}
public int size(){
return levels.size();
}
public MapZoomPair getLevel(int level){
return levels.get(level);
}
private static MapZooms DEFAULT = null;
public static String MAP_ZOOMS_DEFAULT = "5-8;9-11;12-14;15";
public static MapZooms getDefault(){
if(DEFAULT == null){
DEFAULT = parseZooms(MAP_ZOOMS_DEFAULT);
}
return DEFAULT;
}
}

View file

@ -6,6 +6,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.prefs.Preferences; import java.util.prefs.Preferences;
import net.osmand.data.preparation.MapZooms;
import net.osmand.osm.LatLon; import net.osmand.osm.LatLon;
@ -51,6 +52,15 @@ public class DataExtractionSettings {
preferences.putDouble("default_lon", lon); preferences.putDouble("default_lon", lon);
} }
public MapZooms getMapZooms(){
String value = preferences.get("map_zooms", MapZooms.MAP_ZOOMS_DEFAULT);
return MapZooms.parseZooms(value);
}
public void setMapZooms(String zooms){
preferences.put("map_zooms", zooms);
}
public int getDefaultZoom(){ public int getDefaultZoom(){
return preferences.getInt("default_zoom", 5); return preferences.getInt("default_zoom", 5);
} }

View file

@ -411,7 +411,7 @@ public class OsmExtractionUI implements IMapLocationListener {
creator.setNormalizeStreets(normalizingStreets.isSelected()); creator.setNormalizeStreets(normalizingStreets.isSelected());
creator.setIndexTransport(buildTransportIndex.isSelected()); creator.setIndexTransport(buildTransportIndex.isSelected());
creator.setIndexMap(buildMapIndex.isSelected()); creator.setIndexMap(buildMapIndex.isSelected());
creator.generateIndexes(f, dlg, filter); creator.generateIndexes(f, dlg, filter, DataExtractionSettings.getSettings().getMapZooms());
} catch (IOException e) { } catch (IOException e) {
throw new IllegalArgumentException(e); throw new IllegalArgumentException(e);
} catch (SAXException e) { } catch (SAXException e) {