git-svn-id: https://osmand.googlecode.com/svn/trunk@160 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
Victor Shcherb 2010-06-14 11:59:30 +00:00
parent d3f51f9c0f
commit de0bae2b38
4 changed files with 55 additions and 39 deletions

View file

@ -26,7 +26,7 @@ public class ToDoConstants {
// 32. Introduce POI predefined filters (car filter(other-fuel, transportation-car_wash, show-car) and others) // 32. Introduce POI predefined filters (car filter(other-fuel, transportation-car_wash, show-car) and others)
// ( 1) predefined filters, 2) choose subtype's, 3) filter by name, 4) opening hours (filter)) // ( 1) predefined filters, 2) choose subtype's, 3) filter by name, 4) opening hours (filter))
// 20. Implement save track/route to gpx
// 8. Enable change POI directly on map (requires OSM login) // 8. Enable change POI directly on map (requires OSM login)
// 33. Build transport locations. Create transport index (transport-stops) (investigate) [TODO] // 33. Build transport locations. Create transport index (transport-stops) (investigate) [TODO]
// 44. Introduce settings presets (car/bicycle/pedestrian/default) - show different icons for car (bigger), // 44. Introduce settings presets (car/bicycle/pedestrian/default) - show different icons for car (bigger),
@ -40,29 +40,24 @@ public class ToDoConstants {
// 34. Suppport navigation for calculated route (example of get route from internet is in swing app). // 34. Suppport navigation for calculated route (example of get route from internet is in swing app).
// 40. Support simple vector road rendering (require new index file) // 40. Support simple vector road rendering (require new index file)
// 43. Enable poi filter by name // 43. Enable poi filter by name (?)
// 26. Show the whole street on map (when it is chosen in search activity). Possibly extend that story to show layer with streets. (?) // 26. Show the whole street on map (when it is chosen in search activity). Possibly extend that story to show layer with streets. (?)
// BUGS Android // BUGS Android
// 5. Improvement : Implement caching files existing on FS, implement specific method in RM // 5. Improvement : Implement caching files existing on FS, implement specific method in RM
// Introducing cache of file names that are on disk (creating new File() consumes a lot of memory) // Introducing cache of file names that are on disk (creating new File() consumes a lot of memory)
// 6. Bug : loading from internet tile (when internet is not accessible). For rotated map investigate loading tile mechanism.
//
// BUGS Swing
// 1. Bug renaming region
// TODO swing // TODO swing
// 4. Fix issues with big files (such as netherlands) - save memory (!) // 4. Fix issues with big files (such as netherlands) - save memory (!)
// Current result : for big file (1 - task 60-80% time, 90% memory) // Current result : for big file (1 - task 60-80% time, 90% memory)
// 1. Download tiles without using dir tiles (?) // 1. Download tiles without using dir tiles (?)
// BUGS Swing
// DONE ANDROID : // DONE ANDROID :
// 20. Implement save track/route to gpx
// DONE SWING // DONE SWING

View file

@ -73,6 +73,7 @@ public class MapTileDownloader {
public final int xTile; public final int xTile;
public final int yTile; public final int yTile;
public final String url; public final String url;
public boolean error;
public DownloadRequest(String url, File fileToSave, int xTile, int yTile, int zoom) { public DownloadRequest(String url, File fileToSave, int xTile, int yTile, int zoom) {
this.url = url; this.url = url;
@ -89,6 +90,10 @@ public class MapTileDownloader {
yTile = -1; yTile = -1;
zoom = -1; zoom = -1;
} }
public void setError(boolean error){
this.error = error;
}
} }
@ -163,12 +168,16 @@ public class MapTileDownloader {
@Override @Override
public void run() { public void run() {
if(log.isDebugEnabled()){
log.debug("Start downloading tile : " + request.url);
}
if (request != null && request.fileToSave != null && request.url != null) { if (request != null && request.fileToSave != null && request.url != null) {
long time = System.currentTimeMillis(); if(currentlyDownloaded.contains(request.fileToSave)){
return;
}
currentlyDownloaded.add(request.fileToSave); currentlyDownloaded.add(request.fileToSave);
if(log.isDebugEnabled()){
log.debug("Start downloading tile : " + request.url);
}
long time = System.currentTimeMillis();
try { try {
request.fileToSave.getParentFile().mkdirs(); request.fileToSave.getParentFile().mkdirs();
URL url = new URL(request.url); URL url = new URL(request.url);
@ -189,9 +198,11 @@ public class MapTileDownloader {
} }
} catch (UnknownHostException e) { } catch (UnknownHostException e) {
currentErrors++; currentErrors++;
request.setError(true);
log.error("UnknownHostException, cannot download tile " + request.url + " " + e.getMessage()); log.error("UnknownHostException, cannot download tile " + request.url + " " + e.getMessage());
} catch (IOException e) { } catch (IOException e) {
currentErrors++; currentErrors++;
request.setError(true);
log.warn("Cannot download tile : " + request.url, e); log.warn("Cannot download tile : " + request.url, e);
} finally { } finally {
currentlyDownloaded.remove(request.fileToSave); currentlyDownloaded.remove(request.fileToSave);

View file

@ -105,7 +105,7 @@ public class OsmExtractionUI implements IMapLocationListener {
@Override @Override
public void uncaughtException(Thread t, Throwable e) { public void uncaughtException(Thread t, Throwable e) {
if(!(e instanceof ThreadDeath)){ if(!(e instanceof ThreadDeath)){
log.error("Error in thread " + t.getName(), e); ExceptionHandler.handle("Error in thread " + t.getName(), e);
} }
defaultHandler.uncaughtException(t, e); defaultHandler.uncaughtException(t, e);
} }
@ -299,24 +299,26 @@ public class OsmExtractionUI implements IMapLocationListener {
treeModelListener = new TreeModelListener() { treeModelListener = new TreeModelListener() {
public void treeNodesChanged(TreeModelEvent e) { public void treeNodesChanged(TreeModelEvent e) {
for (Object node : e.getChildren()) { Object node = e.getTreePath().getLastPathComponent();
if (node instanceof DataExtractionTreeNode) { if(e.getChildren() != null && e.getChildren().length > 0){
DataExtractionTreeNode n = ((DataExtractionTreeNode) node); node =e.getChildren()[0];
if (n.getModelObject() instanceof MapObject) { }
MapObject r = (MapObject) n.getModelObject(); if (node instanceof DataExtractionTreeNode) {
String newName = n.getUserObject().toString(); DataExtractionTreeNode n = ((DataExtractionTreeNode) node);
if(!r.getName().equals(newName)){ if (n.getModelObject() instanceof MapObject) {
r.setName(n.getUserObject().toString()); MapObject r = (MapObject) n.getModelObject();
} String newName = n.getUserObject().toString();
if (r instanceof Street && !((Street) r).isRegisteredInCity()) { if (!r.getName().equals(newName)) {
DefaultMutableTreeNode parent = ((DefaultMutableTreeNode) n.getParent()); r.setName(n.getUserObject().toString());
parent.remove(n); }
((DefaultTreeModel) treePlaces.getModel()).nodeStructureChanged(parent); if (r instanceof Street && !((Street) r).isRegisteredInCity()) {
} DefaultMutableTreeNode parent = ((DefaultMutableTreeNode) n.getParent());
parent.remove(n);
((DefaultTreeModel) treePlaces.getModel()).nodeStructureChanged(parent);
} }
} }
} }
} }
public void treeNodesInserted(TreeModelEvent e) { public void treeNodesInserted(TreeModelEvent e) {
} }
public void treeNodesRemoved(TreeModelEvent e) { public void treeNodesRemoved(TreeModelEvent e) {

View file

@ -330,10 +330,10 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
float y2 = calcDiffPixelY(tileRect.left - ctilex, tileRect.bottom - ctiley); float y2 = calcDiffPixelY(tileRect.left - ctilex, tileRect.bottom - ctiley);
float y3 = calcDiffPixelY(tileRect.right - ctilex, tileRect.top - ctiley); float y3 = calcDiffPixelY(tileRect.right - ctilex, tileRect.top - ctiley);
float y4 = calcDiffPixelY(tileRect.right - ctilex, tileRect.bottom - ctiley); float y4 = calcDiffPixelY(tileRect.right - ctilex, tileRect.bottom - ctiley);
int l = (int) (Math.min(Math.min(x1, x2), Math.min(x3, x4)) + cx); int l = Math.round(Math.min(Math.min(x1, x2), Math.min(x3, x4)) + cx);
int r = (int) (Math.max(Math.max(x1, x2), Math.max(x3, x4)) + cx); int r = Math.round(Math.max(Math.max(x1, x2), Math.max(x3, x4)) + cx);
int t = (int) (Math.min(Math.min(y1, y2), Math.min(y3, y4)) + cy); int t = Math.round(Math.min(Math.min(y1, y2), Math.min(y3, y4)) + cy);
int b = (int) (Math.max(Math.max(y1, y2), Math.max(y3, y4)) + cy); int b = Math.round(Math.max(Math.max(y1, y2), Math.max(y3, y4)) + cy);
pixelRect.set(l, t, r, b); pixelRect.set(l, t, r, b);
} }
@ -426,11 +426,17 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
public void tileDownloaded(DownloadRequest request) { public void tileDownloaded(DownloadRequest request) {
if (request == null) { if (request == null || rotate != 0 ) {
// if image is rotated call refresh the whole canvas
// because we can't find dirty rectangular region but all pixels should be drawn
// we don't know exact images were changed // we don't know exact images were changed
refreshMap(); refreshMap();
return; return;
} }
if(request.error){
return;
}
if (request.zoom != this.zoom) { if (request.zoom != this.zoom) {
return; return;
} }
@ -443,6 +449,7 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
synchronized (holder) { synchronized (holder) {
tilesRect.set(request.xTile, request.yTile, request.xTile + 1, request.yTile + 1); tilesRect.set(request.xTile, request.yTile, request.xTile + 1, request.yTile + 1);
calculatePixelRectangle(boundsRect, w, h, tileX, tileY, tilesRect); calculatePixelRectangle(boundsRect, w, h, tileX, tileY, tilesRect);
if(boundsRect.left > getWidth() || boundsRect.right < 0 || boundsRect.bottom < 0 || boundsRect.top > getHeight()){ if(boundsRect.left > getWidth() || boundsRect.right < 0 || boundsRect.bottom < 0 || boundsRect.top > getHeight()){
return; return;
} }
@ -452,18 +459,19 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
try { try {
ResourceManager mgr = ResourceManager.getResourceManager(); ResourceManager mgr = ResourceManager.getResourceManager();
Bitmap bmp = mgr.getTileImageForMapSync(map, request.xTile, request.yTile, zoom, false); Bitmap bmp = mgr.getTileImageForMapSync(map, request.xTile, request.yTile, zoom, false);
float x = (request.xTile - getXTile()) * getTileSize() + w; float x = (request.xTile - tileX) * getTileSize() + w;
float y = (request.yTile - getYTile()) * getTileSize() + h; float y = (request.yTile - tileY) * getTileSize() + h;
if (bmp == null) { if (bmp == null) {
drawEmptyTile(canvas, x, y); drawEmptyTile(canvas, x, y);
} else { } else {
canvas.drawBitmap(bmp, x, y, null); canvas.drawBitmap(bmp, x, y, paintBitmap);
} }
drawOverMap(canvas); drawOverMap(canvas);
} finally { } finally {
holder.unlockCanvasAndPost(canvas); holder.unlockCanvasAndPost(canvas);
} }
} }
} }
} }