From 9ed4bb6ec5e70e69f4b306b3ca4baf9190477277 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 19 Jan 2014 23:23:16 +0100 Subject: [PATCH 1/8] refactor: PbfTileDataSource -> UrlTileDataSource --- .../emu/org/oscim/tiling/source/common/LwHttp.java | 4 ++-- ...PbfTileDataSource.java => UrlTileDataSource.java} | 9 +++++---- vtm/src/org/oscim/tiling/source/ITileDecoder.java | 12 ++++++++++++ .../org/oscim/tiling/source/common/PbfDecoder.java | 8 ++------ ...PbfTileDataSource.java => UrlTileDataSource.java} | 9 +++++---- .../tiling/source/mapnik/MapnikVectorTileSource.java | 4 ++-- .../tiling/source/oscimap/OSciMap1TileSource.java | 4 ++-- .../tiling/source/oscimap2/OSciMap2TileSource.java | 4 ++-- .../tiling/source/oscimap4/OSciMap4TileSource.java | 4 ++-- 9 files changed, 34 insertions(+), 24 deletions(-) rename vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/{PbfTileDataSource.java => UrlTileDataSource.java} (86%) create mode 100644 vtm/src/org/oscim/tiling/source/ITileDecoder.java rename vtm/src/org/oscim/tiling/source/common/{PbfTileDataSource.java => UrlTileDataSource.java} (90%) diff --git a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/LwHttp.java b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/LwHttp.java index 29c54eda..2e3d660f 100644 --- a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/LwHttp.java +++ b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/LwHttp.java @@ -76,9 +76,9 @@ public class LwHttp { mHttpRequest.abort(); } - private PbfTileDataSource mDataSource; + private UrlTileDataSource mDataSource; - public boolean sendRequest(Tile tile, PbfTileDataSource dataSource) throws IOException { + public boolean sendRequest(Tile tile, UrlTileDataSource dataSource) throws IOException { mDataSource = dataSource; byte[] request = mRequestBuffer; diff --git a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/PbfTileDataSource.java b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/UrlTileDataSource.java similarity index 86% rename from vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/PbfTileDataSource.java rename to vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/UrlTileDataSource.java index d92cda30..a3970f4e 100644 --- a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/PbfTileDataSource.java +++ b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/UrlTileDataSource.java @@ -21,6 +21,7 @@ import org.oscim.tiling.MapTile; import org.oscim.tiling.source.ITileCache; import org.oscim.tiling.source.ITileDataSink; import org.oscim.tiling.source.ITileDataSource; +import org.oscim.tiling.source.ITileDecoder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,13 +29,13 @@ import org.slf4j.LoggerFactory; * * */ -public abstract class PbfTileDataSource implements ITileDataSource { - static final Logger log = LoggerFactory.getLogger(PbfTileDataSource.class); +public abstract class UrlTileDataSource implements ITileDataSource { + static final Logger log = LoggerFactory.getLogger(UrlTileDataSource.class); protected LwHttp mConn; - protected final PbfDecoder mTileDecoder; + protected final ITileDecoder mTileDecoder; - public PbfTileDataSource(PbfDecoder tileDecoder, ITileCache cache) { + public UrlTileDataSource(ITileDecoder tileDecoder, ITileCache cache) { mTileDecoder = tileDecoder; } diff --git a/vtm/src/org/oscim/tiling/source/ITileDecoder.java b/vtm/src/org/oscim/tiling/source/ITileDecoder.java new file mode 100644 index 00000000..a2c054cc --- /dev/null +++ b/vtm/src/org/oscim/tiling/source/ITileDecoder.java @@ -0,0 +1,12 @@ +package org.oscim.tiling.source; + +import java.io.IOException; +import java.io.InputStream; + +import org.oscim.core.Tile; + +public interface ITileDecoder { + + boolean decode(Tile tile, ITileDataSink sink, InputStream is, int contentLength) + throws IOException; +} diff --git a/vtm/src/org/oscim/tiling/source/common/PbfDecoder.java b/vtm/src/org/oscim/tiling/source/common/PbfDecoder.java index cfafb077..f0f5ea27 100644 --- a/vtm/src/org/oscim/tiling/source/common/PbfDecoder.java +++ b/vtm/src/org/oscim/tiling/source/common/PbfDecoder.java @@ -19,13 +19,12 @@ package org.oscim.tiling.source.common; import java.io.IOException; import java.io.InputStream; -import org.oscim.core.Tile; -import org.oscim.tiling.source.ITileDataSink; +import org.oscim.tiling.source.ITileDecoder; import org.oscim.utils.UTF8Decoder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class PbfDecoder { +public abstract class PbfDecoder implements ITileDecoder { static final Logger log = LoggerFactory.getLogger(PbfDecoder.class); private final static int S1 = 7; @@ -87,9 +86,6 @@ public abstract class PbfDecoder { mStringDecoder = new UTF8Decoder(); } - public abstract boolean decode(Tile tile, ITileDataSink sink, - InputStream is, int contentLength) throws IOException; - public void setInputStream(InputStream is, int contentLength) { mInputStream = is; diff --git a/vtm/src/org/oscim/tiling/source/common/PbfTileDataSource.java b/vtm/src/org/oscim/tiling/source/common/UrlTileDataSource.java similarity index 90% rename from vtm/src/org/oscim/tiling/source/common/PbfTileDataSource.java rename to vtm/src/org/oscim/tiling/source/common/UrlTileDataSource.java index 44bf74c8..3dfd780c 100644 --- a/vtm/src/org/oscim/tiling/source/common/PbfTileDataSource.java +++ b/vtm/src/org/oscim/tiling/source/common/UrlTileDataSource.java @@ -26,18 +26,19 @@ import org.oscim.tiling.MapTile; import org.oscim.tiling.source.ITileCache; import org.oscim.tiling.source.ITileDataSink; import org.oscim.tiling.source.ITileDataSource; +import org.oscim.tiling.source.ITileDecoder; import org.oscim.utils.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class PbfTileDataSource implements ITileDataSource { - static final Logger log = LoggerFactory.getLogger(PbfTileDataSource.class); +public abstract class UrlTileDataSource implements ITileDataSource { + static final Logger log = LoggerFactory.getLogger(UrlTileDataSource.class); protected LwHttp mConn; - protected final PbfDecoder mTileDecoder; + protected final ITileDecoder mTileDecoder; protected final ITileCache mTileCache; - public PbfTileDataSource(PbfDecoder tileDecoder, ITileCache tileCache) { + public UrlTileDataSource(ITileDecoder tileDecoder, ITileCache tileCache) { mTileDecoder = tileDecoder; mTileCache = tileCache; } diff --git a/vtm/src/org/oscim/tiling/source/mapnik/MapnikVectorTileSource.java b/vtm/src/org/oscim/tiling/source/mapnik/MapnikVectorTileSource.java index 446607bf..a14f008b 100644 --- a/vtm/src/org/oscim/tiling/source/mapnik/MapnikVectorTileSource.java +++ b/vtm/src/org/oscim/tiling/source/mapnik/MapnikVectorTileSource.java @@ -22,7 +22,7 @@ import org.oscim.core.Tile; import org.oscim.tiling.source.ITileDataSource; import org.oscim.tiling.source.TileSource; import org.oscim.tiling.source.common.LwHttp; -import org.oscim.tiling.source.common.PbfTileDataSource; +import org.oscim.tiling.source.common.UrlTileDataSource; import org.oscim.tiling.source.common.UrlTileSource; public class MapnikVectorTileSource extends UrlTileSource { @@ -32,7 +32,7 @@ public class MapnikVectorTileSource extends UrlTileSource { return new TileDataSource(this, mUrl); } - static class TileDataSource extends PbfTileDataSource { + static class TileDataSource extends UrlTileDataSource { public TileDataSource(TileSource tileSource, URL url) { super(new TileDecoder(), tileSource.tileCache); diff --git a/vtm/src/org/oscim/tiling/source/oscimap/OSciMap1TileSource.java b/vtm/src/org/oscim/tiling/source/oscimap/OSciMap1TileSource.java index be96832f..ad7837bd 100644 --- a/vtm/src/org/oscim/tiling/source/oscimap/OSciMap1TileSource.java +++ b/vtm/src/org/oscim/tiling/source/oscimap/OSciMap1TileSource.java @@ -21,7 +21,7 @@ import java.net.URL; import org.oscim.tiling.source.ITileDataSource; import org.oscim.tiling.source.TileSource; import org.oscim.tiling.source.common.LwHttp; -import org.oscim.tiling.source.common.PbfTileDataSource; +import org.oscim.tiling.source.common.UrlTileDataSource; import org.oscim.tiling.source.common.UrlTileSource; /** @@ -35,7 +35,7 @@ public class OSciMap1TileSource extends UrlTileSource { return new TileDataSource(this, mUrl); } - class TileDataSource extends PbfTileDataSource { + class TileDataSource extends UrlTileDataSource { public TileDataSource(TileSource tileSource, URL url) { super(new TileDecoder(), tileSource.tileCache); mConn = new LwHttp(url, "application/osmtile", "osmtile", false); diff --git a/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java b/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java index d3544d73..cb0a6cb1 100644 --- a/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java +++ b/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java @@ -31,7 +31,7 @@ import org.oscim.tiling.source.ITileDataSource; import org.oscim.tiling.source.TileSource; import org.oscim.tiling.source.common.LwHttp; import org.oscim.tiling.source.common.PbfDecoder; -import org.oscim.tiling.source.common.PbfTileDataSource; +import org.oscim.tiling.source.common.UrlTileDataSource; import org.oscim.tiling.source.common.UrlTileSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,7 +43,7 @@ public class OSciMap2TileSource extends UrlTileSource { return new TileDataSource(this, mUrl); } - class TileDataSource extends PbfTileDataSource { + class TileDataSource extends UrlTileDataSource { public TileDataSource(TileSource tileSource, URL url) { super(new TileDecoder(), tileSource.tileCache); mConn = new LwHttp(url, "application/osmtile", "osmtile", false); diff --git a/vtm/src/org/oscim/tiling/source/oscimap4/OSciMap4TileSource.java b/vtm/src/org/oscim/tiling/source/oscimap4/OSciMap4TileSource.java index 81e0b0ce..ae17da45 100644 --- a/vtm/src/org/oscim/tiling/source/oscimap4/OSciMap4TileSource.java +++ b/vtm/src/org/oscim/tiling/source/oscimap4/OSciMap4TileSource.java @@ -21,7 +21,7 @@ import java.net.URL; import org.oscim.tiling.source.ITileDataSource; import org.oscim.tiling.source.TileSource; import org.oscim.tiling.source.common.LwHttp; -import org.oscim.tiling.source.common.PbfTileDataSource; +import org.oscim.tiling.source.common.UrlTileDataSource; import org.oscim.tiling.source.common.UrlTileSource; public class OSciMap4TileSource extends UrlTileSource { @@ -31,7 +31,7 @@ public class OSciMap4TileSource extends UrlTileSource { return new TileDataSource(this, mUrl); } - class TileDataSource extends PbfTileDataSource { + class TileDataSource extends UrlTileDataSource { public TileDataSource(TileSource tileSource, URL url) { super(new TileDecoder(), tileSource.tileCache); //mConn = new LwHttp(url, "application/x-protobuf", "vtm", false); From 402cbe7e57246339a7ae9b205a0f7f2faf3a1827 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Mon, 20 Jan 2014 22:43:57 +0100 Subject: [PATCH 2/8] use LwHttp.Buffer to set limit on InputStream --- .../oscim/tiling/source/common/LwHttp.java | 4 +- .../source/common/UrlTileDataSource.java | 6 +- .../org/oscim/tiling/source/ITileDecoder.java | 2 +- .../oscim/tiling/source/common/LwHttp.java | 86 ++++++++++++------- .../tiling/source/common/PbfDecoder.java | 24 +----- .../source/common/UrlTileDataSource.java | 7 +- .../tiling/source/mapnik/TileDecoder.java | 6 +- .../tiling/source/oscimap/TileDecoder.java | 4 +- .../source/oscimap2/OSciMap2TileSource.java | 11 +-- .../tiling/source/oscimap4/TileDecoder.java | 10 +-- 10 files changed, 79 insertions(+), 81 deletions(-) diff --git a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/LwHttp.java b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/LwHttp.java index 2e3d660f..51a922a5 100644 --- a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/LwHttp.java +++ b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/LwHttp.java @@ -116,9 +116,9 @@ public class LwHttp { if (status == 200) { Uint8Array buf = Uint8ArrayNative.create(xhr.getResponseArrayBuffer()); - mDataSource.process(new Buffer(buf), buf.byteLength()); + mDataSource.process(new Buffer(buf)); } else { - mDataSource.process(null, -1); + mDataSource.process(null); } } } diff --git a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/UrlTileDataSource.java b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/UrlTileDataSource.java index a3970f4e..28a39070 100644 --- a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/UrlTileDataSource.java +++ b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/UrlTileDataSource.java @@ -57,12 +57,12 @@ public abstract class UrlTileDataSource implements ITileDataSource { return result; } - public void process(InputStream is, int length) { + public void process(InputStream is) { boolean win = false; - if (length >= 0) { + if (is != null) { try { - win = mTileDecoder.decode(mTile, mSink, is, length); + win = mTileDecoder.decode(mTile, mSink, is); } catch (IOException e) { e.printStackTrace(); } diff --git a/vtm/src/org/oscim/tiling/source/ITileDecoder.java b/vtm/src/org/oscim/tiling/source/ITileDecoder.java index a2c054cc..9f1e9d14 100644 --- a/vtm/src/org/oscim/tiling/source/ITileDecoder.java +++ b/vtm/src/org/oscim/tiling/source/ITileDecoder.java @@ -7,6 +7,6 @@ import org.oscim.core.Tile; public interface ITileDecoder { - boolean decode(Tile tile, ITileDataSink sink, InputStream is, int contentLength) + boolean decode(Tile tile, ITileDataSink sink, InputStream is) throws IOException; } diff --git a/vtm/src/org/oscim/tiling/source/common/LwHttp.java b/vtm/src/org/oscim/tiling/source/common/LwHttp.java index 206f8aa2..e78e721d 100644 --- a/vtm/src/org/oscim/tiling/source/common/LwHttp.java +++ b/vtm/src/org/oscim/tiling/source/common/LwHttp.java @@ -39,6 +39,7 @@ import org.slf4j.LoggerFactory; */ public class LwHttp { static final Logger log = LoggerFactory.getLogger(LwHttp.class); + static final boolean DBG = false; private final static byte[] HEADER_HTTP_OK = "200 OK".getBytes(); private final static byte[] HEADER_CONTENT_TYPE = "Content-Type".getBytes(); @@ -46,7 +47,7 @@ public class LwHttp { private final static int RESPONSE_EXPECTED_LIVES = 100; private final static long RESPONSE_TIMEOUT = (long) 10E9; // 10 second in nanosecond - private final static int BUFFER_SIZE = 1024; + private final static int BUFFER_SIZE = 4096; private final byte[] buffer = new byte[BUFFER_SIZE]; private final String mHost; @@ -55,7 +56,7 @@ public class LwHttp { private int mMaxReq = 0; private Socket mSocket; private OutputStream mCommandStream; - private InputStream mResponseStream; + private Buffer mResponseStream; private OutputStream mCacheOutputStream; private long mLastRequest = 0; private SocketAddress mSockAddr; @@ -67,8 +68,6 @@ public class LwHttp { private final boolean mInflateContent; private final byte[] mContentType; - private int mContentLength = -1; - /** * @param url * Base url for tiles @@ -106,18 +105,40 @@ public class LwHttp { mRequestBuffer, 0, REQUEST_GET_START.length); } + // TODO: + // to avoid a copy in PbfDecoder one could manage the buffer + // array directly and provide access to it. static class Buffer extends BufferedInputStream { - final OutputStream mCacheOutputstream; + OutputStream mCacheOutputstream; + int sumRead = 0; + int mContentLength; - public Buffer(InputStream is, OutputStream cache) { - super(is, 4096); + public Buffer(InputStream is) { + super(is, BUFFER_SIZE); + } + + public void setCache(OutputStream cache) { mCacheOutputstream = cache; } + public void start(int length) { + sumRead = 0; + mContentLength = length; + } + @Override public int read() throws IOException { + if (sumRead >= mContentLength) + return -1; + int data = super.read(); - if (data >= 0) + + sumRead += 1; + + if (DBG) + log.debug("read {} {}", sumRead, mContentLength); + + if (mCacheOutputstream != null) mCacheOutputstream.write(data); return data; @@ -126,10 +147,18 @@ public class LwHttp { @Override public int read(byte[] buffer, int offset, int byteCount) throws IOException { - int len = super.read(buffer, offset, byteCount); - if (len >= 0) - mCacheOutputstream.write(buffer, offset, len); + if (sumRead >= mContentLength) + return -1; + + int len = super.read(buffer, offset, byteCount); + sumRead += len; + + if (DBG) + log.debug("read {} {} {}", len, sumRead, mContentLength); + + if (mCacheOutputstream != null) + mCacheOutputstream.write(buffer, offset, byteCount); return len; } @@ -149,8 +178,9 @@ public class LwHttp { public InputStream readHeader() throws IOException { - InputStream is = mResponseStream; - is.mark(4096); + Buffer is = mResponseStream; + is.mark(BUFFER_SIZE); + is.start(BUFFER_SIZE); byte[] buf = buffer; boolean first = true; @@ -161,7 +191,7 @@ public class LwHttp { int end = 0; int len = 0; - mContentLength = -1; + int contentLength = -1; // header may not be larger than BUFFER_SIZE for this to work for (; (pos < read) || ((read < BUFFER_SIZE) && @@ -202,11 +232,11 @@ public class LwHttp { } else if (check(HEADER_CONTENT_LENGTH, buf, pos, end)) { // parse Content-Length - mContentLength = parseInt(buf, pos + + contentLength = parseInt(buf, pos + HEADER_CONTENT_LENGTH.length + 2, end - 1); } - if (!ok) { + if (!ok || DBG) { String line = new String(buf, pos, end - pos - 1); log.debug("> {} <", line); } @@ -223,9 +253,8 @@ public class LwHttp { is.mark(0); is.skip(end); - if (mCacheOutputStream != null) { - is = new Buffer(is, mCacheOutputStream); - } + is.setCache(mCacheOutputStream); + is.start(contentLength); if (mInflateContent) return new InflaterInputStream(is); @@ -238,14 +267,10 @@ public class LwHttp { if (mSocket != null && ((mMaxReq-- <= 0) || (System.nanoTime() - mLastRequest > RESPONSE_TIMEOUT))) { - try { - mSocket.close(); - } catch (IOException e) { - log.debug(e.getMessage()); - } + close(); - // log.debug("not alive - recreate connection " + mMaxReq); - mSocket = null; + if (DBG) + log.debug("not alive - recreate connection " + mMaxReq); } if (mSocket == null) { @@ -284,6 +309,9 @@ public class LwHttp { System.arraycopy(REQUEST_GET_END, 0, request, pos, len); len += pos; + if (DBG) + log.debug("request: {}", new String(request, 0, len)); + try { mCommandStream.write(request, 0, len); mCommandStream.flush(); @@ -309,7 +337,7 @@ public class LwHttp { mSocket.setTcpNoDelay(true); mCommandStream = mSocket.getOutputStream(); - mResponseStream = new BufferedInputStream(mSocket.getInputStream()); + mResponseStream = new Buffer(mSocket.getInputStream()); return true; } @@ -366,10 +394,6 @@ public class LwHttp { close(); } - public int getContentLength() { - return mContentLength; - } - /** * Write custom tile url * diff --git a/vtm/src/org/oscim/tiling/source/common/PbfDecoder.java b/vtm/src/org/oscim/tiling/source/common/PbfDecoder.java index f0f5ea27..ab7931e8 100644 --- a/vtm/src/org/oscim/tiling/source/common/PbfDecoder.java +++ b/vtm/src/org/oscim/tiling/source/common/PbfDecoder.java @@ -72,9 +72,6 @@ public abstract class PbfDecoder implements ITileDecoder { // offset of buffer in message private int mBufferOffset; - // max bytes to read: message = header + content - private int mMsgEnd; - // overall bytes of message read private int mMsgPos; @@ -86,7 +83,7 @@ public abstract class PbfDecoder implements ITileDecoder { mStringDecoder = new UTF8Decoder(); } - public void setInputStream(InputStream is, int contentLength) { + public void setInputStream(InputStream is) { mInputStream = is; bufferFill = 0; @@ -94,7 +91,6 @@ public abstract class PbfDecoder implements ITileDecoder { mBufferOffset = 0; mMsgPos = 0; - mMsgEnd = contentLength; } protected int decodeVarint32() throws IOException { @@ -397,8 +393,8 @@ public abstract class PbfDecoder implements ITileDecoder { } public boolean hasData() throws IOException { - if (mBufferOffset + bufferPos >= mMsgEnd) - return false; + //if (mBufferOffset + bufferPos >= mMsgEnd) + // return false; return fillBuffer(1) > 0; } @@ -414,10 +410,6 @@ public abstract class PbfDecoder implements ITileDecoder { if (bytesLeft >= size) return bytesLeft; - // check if inputstream is read to the end - if (mMsgPos >= mMsgEnd) - return bytesLeft; - int maxSize = buffer.length; if (size > maxSize) { @@ -454,10 +446,7 @@ public abstract class PbfDecoder implements ITileDecoder { } while ((bufferFill - bufferPos) < size) { - int max = maxSize - bufferFill; - if (max > mMsgEnd - mMsgPos) - max = mMsgEnd - mMsgPos; if (max <= 0) { // should not be possible @@ -468,9 +457,8 @@ public abstract class PbfDecoder implements ITileDecoder { int len = mInputStream.read(buffer, bufferFill, max); if (len < 0) { - mMsgEnd = mMsgPos; if (debug) - log.debug(" finished reading " + mMsgPos); + log.debug("finished reading {}", mMsgPos); // finished reading, mark end buffer[bufferFill] = 0; @@ -479,10 +467,6 @@ public abstract class PbfDecoder implements ITileDecoder { mMsgPos += len; bufferFill += len; - - if (mMsgPos == mMsgEnd) - break; - } return bufferFill - bufferPos; } diff --git a/vtm/src/org/oscim/tiling/source/common/UrlTileDataSource.java b/vtm/src/org/oscim/tiling/source/common/UrlTileDataSource.java index 3dfd780c..df013886 100644 --- a/vtm/src/org/oscim/tiling/source/common/UrlTileDataSource.java +++ b/vtm/src/org/oscim/tiling/source/common/UrlTileDataSource.java @@ -55,7 +55,7 @@ public abstract class UrlTileDataSource implements ITileDataSource { } else { InputStream is = c.getInputStream(); try { - if (mTileDecoder.decode(tile, sink, is, c.getBytes())) { + if (mTileDecoder.decode(tile, sink, is)) { return QueryResult.SUCCESS; } } catch (IOException e) { @@ -77,15 +77,14 @@ public abstract class UrlTileDataSource implements ITileDataSource { } else if ((is = mConn.readHeader()) == null) { log.debug("{} Network Error", tile); } else { - int bytes = mConn.getContentLength(); - success = mTileDecoder.decode(tile, sink, is, bytes); + success = mTileDecoder.decode(tile, sink, is); } } catch (SocketException e) { log.debug("{} Socket exception: {}", tile, e.getMessage()); } catch (SocketTimeoutException e) { log.debug("{} Socket Timeout", tile); } catch (UnknownHostException e) { - log.debug("{} No Network", tile); + log.debug("{} Unknown host: {}", tile, e.getMessage()); } catch (IOException e) { e.printStackTrace(); } finally { diff --git a/vtm/src/org/oscim/tiling/source/mapnik/TileDecoder.java b/vtm/src/org/oscim/tiling/source/mapnik/TileDecoder.java index a42b5420..de6e364f 100644 --- a/vtm/src/org/oscim/tiling/source/mapnik/TileDecoder.java +++ b/vtm/src/org/oscim/tiling/source/mapnik/TileDecoder.java @@ -71,13 +71,13 @@ public class TileDecoder extends PbfDecoder { private float mScale; @Override - public boolean decode(Tile tile, ITileDataSink mapDataCallback, InputStream is, - int contentLength) + public boolean decode(Tile tile, ITileDataSink mapDataCallback, InputStream is) throws IOException { + if (debug) log.debug(tile + " decode"); - setInputStream(is, Integer.MAX_VALUE); + setInputStream(is); mTile = tile; mMapDataCallback = mapDataCallback; mScale = REF_TILE_SIZE / Tile.SIZE; diff --git a/vtm/src/org/oscim/tiling/source/oscimap/TileDecoder.java b/vtm/src/org/oscim/tiling/source/oscimap/TileDecoder.java index 644b62c4..82a1e0ad 100644 --- a/vtm/src/org/oscim/tiling/source/oscimap/TileDecoder.java +++ b/vtm/src/org/oscim/tiling/source/oscimap/TileDecoder.java @@ -68,10 +68,10 @@ public class TileDecoder extends PbfDecoder { } @Override - public boolean decode(Tile tile, ITileDataSink sink, InputStream is, int contentLength) + public boolean decode(Tile tile, ITileDataSink sink, InputStream is) throws IOException { - setInputStream(is, contentLength); + setInputStream(is); mTile = tile; mSink = sink; diff --git a/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java b/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java index cb0a6cb1..f1c246d6 100644 --- a/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java +++ b/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java @@ -92,17 +92,12 @@ public class OSciMap2TileSource extends UrlTileSource { } @Override - public boolean decode(Tile tile, ITileDataSink sink, InputStream is, int contentLength) + public boolean decode(Tile tile, ITileDataSink sink, InputStream is) throws IOException { - int byteCount = readUnsignedInt(is, buffer); - //log.debug(tile + " contentLength:" + byteCount); - if (byteCount < 0) { - log.debug(tile + " invalid content length: " + byteCount); - return false; - } + readUnsignedInt(is, buffer); - setInputStream(is, byteCount); + setInputStream(is); mTile = tile; mMapDataSink = sink; diff --git a/vtm/src/org/oscim/tiling/source/oscimap4/TileDecoder.java b/vtm/src/org/oscim/tiling/source/oscimap4/TileDecoder.java index 25d246bf..3233d4e3 100644 --- a/vtm/src/org/oscim/tiling/source/oscimap4/TileDecoder.java +++ b/vtm/src/org/oscim/tiling/source/oscimap4/TileDecoder.java @@ -76,17 +76,13 @@ public class TileDecoder extends PbfDecoder { } @Override - public boolean decode(Tile tile, ITileDataSink sink, InputStream is, int contentLength) + public boolean decode(Tile tile, ITileDataSink sink, InputStream is) throws IOException { - int byteCount = readUnsignedInt(is, buffer); + readUnsignedInt(is, buffer); //log.debug(tile + " contentLength:" + byteCount); - if (byteCount < 0) { - log.debug("invalid contentLength: " + byteCount); - return false; - } - setInputStream(is, byteCount); + setInputStream(is); mTile = tile; mMapDataSink = sink; From b70090ea3a8743ed62fc7f5c5dfd6079e88be9c0 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Mon, 20 Jan 2014 22:47:12 +0100 Subject: [PATCH 3/8] refactor: add TileLayer.initLoader() - need to initialize worker thread after (super) class is constructed --- vtm/src/org/oscim/layers/tile/TileLayer.java | 11 +++++++---- .../org/oscim/layers/tile/bitmap/BitmapTileLayer.java | 1 + .../org/oscim/layers/tile/vector/VectorTileLayer.java | 2 ++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/vtm/src/org/oscim/layers/tile/TileLayer.java b/vtm/src/org/oscim/layers/tile/TileLayer.java index b3edb06a..1cc34fc8 100644 --- a/vtm/src/org/oscim/layers/tile/TileLayer.java +++ b/vtm/src/org/oscim/layers/tile/TileLayer.java @@ -53,15 +53,18 @@ public abstract class TileLayer extends Layer implements M // Instantiate TileLoader threads mTileLoader = new ArrayList(); + + // RenderLayer is working in GL Thread and actually + // drawing loaded tiles to screen. + mRenderer = mRenderLayer = new TileRenderer(mTileManager); + } + + protected void initLoader() { for (int i = 0; i < mNumTileLoader; i++) { T tileGenerator = createLoader(mTileManager); mTileLoader.add(tileGenerator); tileGenerator.start(); } - - // RenderLayer is working in GL Thread and actually - // drawing loaded tiles to screen. - mRenderer = mRenderLayer = new TileRenderer(mTileManager); } abstract protected T createLoader(TileManager tm); diff --git a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java index d25ff64c..ee4c5818 100644 --- a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java @@ -58,6 +58,7 @@ public class BitmapTileLayer extends TileLayer { super(map, tileSource.getZoomLevelMin(), tileSource.getZoomLevelMax(), cacheLimit); mTileSource = tileSource; mFade = mTileSource.getFadeSteps(); + initLoader(); } @Override diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java index a580982a..14d25bc0 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java @@ -39,10 +39,12 @@ public class VectorTileLayer extends TileLayer { public VectorTileLayer(Map map) { super(map); + initLoader(); } public VectorTileLayer(Map map, int minZoom, int maxZoom, int cacheLimit) { super(map, minZoom, maxZoom, cacheLimit); + initLoader(); } @Override From c88d5707ad154dd6c6ec8dd12a2e7b01f761766f Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Mon, 20 Jan 2014 22:48:41 +0100 Subject: [PATCH 4/8] add ITileDataSink.setTileImage(bitmap) to interface --- .../oscim/layers/tile/vector/VectorTileLoader.java | 11 +++++++++-- .../oscim/layers/tile/vector/VectorTileLoader.java | 6 ++++++ vtm/src/org/oscim/tiling/source/ITileDataSink.java | 3 +++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java index 7c2074c7..807d71ee 100644 --- a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -14,8 +14,7 @@ */ package org.oscim.layers.tile.vector; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.oscim.backend.canvas.Bitmap; import org.oscim.core.GeometryBuffer.GeometryType; import org.oscim.core.MapElement; import org.oscim.core.MercatorProjection; @@ -47,6 +46,8 @@ import org.oscim.tiling.source.ITileDataSink; import org.oscim.tiling.source.ITileDataSource; import org.oscim.tiling.source.ITileDataSource.QueryResult; import org.oscim.utils.LineClipper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class VectorTileLoader extends TileLoader implements IRenderTheme.Callback, ITileDataSink { @@ -425,4 +426,10 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac } l.add(mElement, height, minHeight); } + + @Override + public void setTileImage(Bitmap bitmap) { + // TODO Auto-generated method stub + + } } diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java index 6c9e4b40..dacffc37 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -18,6 +18,7 @@ package org.oscim.layers.tile.vector; import java.util.concurrent.CancellationException; +import org.oscim.backend.canvas.Bitmap; import org.oscim.core.GeometryBuffer.GeometryType; import org.oscim.core.MapElement; import org.oscim.core.MercatorProjection; @@ -463,4 +464,9 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac @Override public void completed(boolean success) { } + + @Override + public void setTileImage(Bitmap bitmap) { + + } } diff --git a/vtm/src/org/oscim/tiling/source/ITileDataSink.java b/vtm/src/org/oscim/tiling/source/ITileDataSink.java index a21515a4..b368f3f2 100644 --- a/vtm/src/org/oscim/tiling/source/ITileDataSink.java +++ b/vtm/src/org/oscim/tiling/source/ITileDataSink.java @@ -16,6 +16,7 @@ */ package org.oscim.tiling.source; +import org.oscim.backend.canvas.Bitmap; import org.oscim.core.MapElement; /** @@ -28,5 +29,7 @@ public interface ITileDataSink { void process(MapElement element); + void setTileImage(Bitmap bitmap); + void completed(boolean success); } From 652024c5dca0d2261b09af2b39b8f24cb605bb03 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Tue, 21 Jan 2014 02:52:34 +0100 Subject: [PATCH 5/8] fix: always initialize TileManager --- vtm/src/org/oscim/tiling/TileManager.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vtm/src/org/oscim/tiling/TileManager.java b/vtm/src/org/oscim/tiling/TileManager.java index ec559420..f0bf36d9 100644 --- a/vtm/src/org/oscim/tiling/TileManager.java +++ b/vtm/src/org/oscim/tiling/TileManager.java @@ -165,6 +165,11 @@ public class TileManager { * current MapPosition */ public boolean update(MapPosition pos) { + + // FIXME cant expect init to be called otherwise + if (mNewTiles == null) + init(); + // clear JobQueue and set tiles to state == NONE. // one could also append new tiles and sort in JobQueue // but this has the nice side-effect that MapWorkers dont From 94011804bef01d33d3287cfe308062ff4d941d0b Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Mon, 20 Jan 2014 22:49:33 +0100 Subject: [PATCH 6/8] add isValid() to Bitmap interface --- vtm-android/src/org/oscim/android/canvas/AndroidBitmap.java | 6 +++++- .../src/org/oscim/android/canvas/AndroidBitmap.java | 5 +++++ vtm-gdx-desktop/src/org/oscim/awt/AwtBitmap.java | 5 +++++ vtm-gdx-html/src/org/oscim/gdx/client/GwtBitmap.java | 5 +++++ vtm/src/org/oscim/backend/canvas/Bitmap.java | 2 ++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/vtm-android/src/org/oscim/android/canvas/AndroidBitmap.java b/vtm-android/src/org/oscim/android/canvas/AndroidBitmap.java index cbf6b41e..f49f7aff 100644 --- a/vtm-android/src/org/oscim/android/canvas/AndroidBitmap.java +++ b/vtm-android/src/org/oscim/android/canvas/AndroidBitmap.java @@ -25,11 +25,15 @@ import android.opengl.GLUtils; public class AndroidBitmap implements org.oscim.backend.canvas.Bitmap { final Bitmap mBitmap; - public AndroidBitmap(InputStream inputStream) { mBitmap = BitmapFactory.decodeStream(inputStream); } + @Override + public boolean isValid(){ + return mBitmap != null; + } + /** * @param format ignored always ARGB8888 */ diff --git a/vtm-gdx-android/src/org/oscim/android/canvas/AndroidBitmap.java b/vtm-gdx-android/src/org/oscim/android/canvas/AndroidBitmap.java index 04eb43d1..e062b53b 100644 --- a/vtm-gdx-android/src/org/oscim/android/canvas/AndroidBitmap.java +++ b/vtm-gdx-android/src/org/oscim/android/canvas/AndroidBitmap.java @@ -85,4 +85,9 @@ public class AndroidBitmap implements org.oscim.backend.canvas.Bitmap { public void recycle() { mBitmap.recycle(); } + + @Override + public boolean isValid() { + return mBitmap != null; + } } diff --git a/vtm-gdx-desktop/src/org/oscim/awt/AwtBitmap.java b/vtm-gdx-desktop/src/org/oscim/awt/AwtBitmap.java index d183ea0b..6d96893d 100644 --- a/vtm-gdx-desktop/src/org/oscim/awt/AwtBitmap.java +++ b/vtm-gdx-desktop/src/org/oscim/awt/AwtBitmap.java @@ -134,4 +134,9 @@ public class AwtBitmap implements Bitmap { @Override public void recycle() { } + + @Override + public boolean isValid() { + return true; + } } diff --git a/vtm-gdx-html/src/org/oscim/gdx/client/GwtBitmap.java b/vtm-gdx-html/src/org/oscim/gdx/client/GwtBitmap.java index 242249c5..bbc8ac0e 100644 --- a/vtm-gdx-html/src/org/oscim/gdx/client/GwtBitmap.java +++ b/vtm-gdx-html/src/org/oscim/gdx/client/GwtBitmap.java @@ -88,4 +88,9 @@ public class GwtBitmap implements Bitmap { } } + @Override + public boolean isValid() { + return true; + } + } diff --git a/vtm/src/org/oscim/backend/canvas/Bitmap.java b/vtm/src/org/oscim/backend/canvas/Bitmap.java index 5387d70e..79c49a26 100644 --- a/vtm/src/org/oscim/backend/canvas/Bitmap.java +++ b/vtm/src/org/oscim/backend/canvas/Bitmap.java @@ -60,4 +60,6 @@ public interface Bitmap { * @param replace true, when glSubImage2D can be used for upload */ void uploadToTexture(boolean replace); + + boolean isValid(); } From 6e543303c695b75bf4ada3efd705b2ddfbc7bbc0 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Tue, 21 Jan 2014 00:47:57 +0100 Subject: [PATCH 7/8] simplify UrlTileDataSource initialization --- .../oscim/android/test/BaseMapActivity.java | 1 - .../src/org/oscim/gdx/MainActivity.java | 3 - .../src/org/oscim/gdx/client/GwtGdxMap.java | 10 ++- .../source/common/UrlTileDataSource.java | 13 ++-- .../oscim/tiling/source/common/LwHttp.java | 30 ++++----- .../source/common/UrlTileDataSource.java | 10 +-- .../tiling/source/common/UrlTileSource.java | 28 ++++----- .../source/mapnik/MapnikVectorTileSource.java | 61 ++++++++----------- .../source/oscimap/OSciMap1TileSource.java | 17 ++---- .../source/oscimap2/OSciMap2TileSource.java | 16 ++--- .../source/oscimap4/OSciMap4TileSource.java | 23 ++++--- 11 files changed, 91 insertions(+), 121 deletions(-) diff --git a/vtm-android-example/src/org/oscim/android/test/BaseMapActivity.java b/vtm-android-example/src/org/oscim/android/test/BaseMapActivity.java index bcd72fce..93731f06 100644 --- a/vtm-android-example/src/org/oscim/android/test/BaseMapActivity.java +++ b/vtm-android-example/src/org/oscim/android/test/BaseMapActivity.java @@ -45,7 +45,6 @@ public class BaseMapActivity extends MapActivity { registerMapView(mMapView); mTileSource = new OSciMap4TileSource(); - mTileSource.setOption("url", "http://opensciencemap.org/tiles/vtm"); if (USE_CACHE) { mCache = new TileCache(this, "cachedir", "testdb"); diff --git a/vtm-gdx-android/src/org/oscim/gdx/MainActivity.java b/vtm-gdx-android/src/org/oscim/gdx/MainActivity.java index acd7aa50..50b34797 100644 --- a/vtm-gdx-android/src/org/oscim/gdx/MainActivity.java +++ b/vtm-gdx-android/src/org/oscim/gdx/MainActivity.java @@ -57,10 +57,7 @@ public class MainActivity extends AndroidApplication { class GdxMapAndroid extends GdxMap { @Override public void createLayers() { - TileSource ts = new OSciMap4TileSource(); - ts.setOption("url", "http://opensciencemap.org/tiles/vtm"); - initDefaultLayers(ts, true, true, true); } } diff --git a/vtm-gdx-html/src/org/oscim/gdx/client/GwtGdxMap.java b/vtm-gdx-html/src/org/oscim/gdx/client/GwtGdxMap.java index d7f7ab4c..3d9d6e06 100644 --- a/vtm-gdx-html/src/org/oscim/gdx/client/GwtGdxMap.java +++ b/vtm-gdx-html/src/org/oscim/gdx/client/GwtGdxMap.java @@ -19,8 +19,6 @@ package org.oscim.gdx.client; import org.oscim.backend.CanvasAdapter; import org.oscim.backend.GL20; import org.oscim.backend.GLAdapter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.oscim.core.MapPosition; import org.oscim.core.MercatorProjection; import org.oscim.gdx.GdxMap; @@ -30,6 +28,8 @@ import org.oscim.renderer.MapRenderer; import org.oscim.tiling.source.TileSource; import org.oscim.tiling.source.oscimap2.OSciMap2TileSource; import org.oscim.tiling.source.oscimap4.OSciMap4TileSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.gwt.GwtApplication; @@ -108,12 +108,10 @@ class GwtGdxMap extends GdxMap { TileSource tileSource; if ("oscimap4".equals(sourceName)) - tileSource = new OSciMap4TileSource(); + tileSource = new OSciMap4TileSource(url); else //if ("oscimap2".equals(source)) - tileSource = new OSciMap2TileSource(); - - tileSource.setOption("url", url); + tileSource = new OSciMap2TileSource(url); initDefaultLayers(tileSource, false, true, true); diff --git a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/UrlTileDataSource.java b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/UrlTileDataSource.java index 28a39070..92af501f 100644 --- a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/UrlTileDataSource.java +++ b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/tiling/source/common/UrlTileDataSource.java @@ -18,25 +18,22 @@ import java.io.IOException; import java.io.InputStream; import org.oscim.tiling.MapTile; -import org.oscim.tiling.source.ITileCache; import org.oscim.tiling.source.ITileDataSink; import org.oscim.tiling.source.ITileDataSource; import org.oscim.tiling.source.ITileDecoder; +import org.oscim.tiling.source.TileSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/** - * - * - */ -public abstract class UrlTileDataSource implements ITileDataSource { +public class UrlTileDataSource implements ITileDataSource { static final Logger log = LoggerFactory.getLogger(UrlTileDataSource.class); - protected LwHttp mConn; + protected final LwHttp mConn; protected final ITileDecoder mTileDecoder; - public UrlTileDataSource(ITileDecoder tileDecoder, ITileCache cache) { + public UrlTileDataSource(TileSource tileSource, ITileDecoder tileDecoder, LwHttp conn) { mTileDecoder = tileDecoder; + mConn = conn; } private ITileDataSink mSink; diff --git a/vtm/src/org/oscim/tiling/source/common/LwHttp.java b/vtm/src/org/oscim/tiling/source/common/LwHttp.java index e78e721d..0ad8abc0 100644 --- a/vtm/src/org/oscim/tiling/source/common/LwHttp.java +++ b/vtm/src/org/oscim/tiling/source/common/LwHttp.java @@ -47,7 +47,7 @@ public class LwHttp { private final static int RESPONSE_EXPECTED_LIVES = 100; private final static long RESPONSE_TIMEOUT = (long) 10E9; // 10 second in nanosecond - private final static int BUFFER_SIZE = 4096; + private final static int BUFFER_SIZE = 8192; private final byte[] buffer = new byte[BUFFER_SIZE]; private final String mHost; @@ -92,7 +92,7 @@ public class LwHttp { REQUEST_GET_START = ("GET " + path).getBytes(); - REQUEST_GET_END = ("." + extension + " HTTP/1.1" + + REQUEST_GET_END = (extension + " HTTP/1.1" + "\nHost: " + host + "\nConnection: Keep-Alive" + "\n\n").getBytes(); @@ -162,6 +162,10 @@ public class LwHttp { return len; } + + public byte[] getArray() { + return buf; + } } public void close() { @@ -292,18 +296,8 @@ public class LwHttp { byte[] request = mRequestBuffer; int pos = REQUEST_GET_START.length; - int newPos = 0; - if ((newPos = formatTilePath(tile, request, pos)) == 0) { - request[pos++] = '/'; - pos = writeInt(tile.zoomLevel, pos, request); - request[pos++] = '/'; - pos = writeInt(tile.tileX, pos, request); - request[pos++] = '/'; - pos = writeInt(tile.tileY, pos, request); - } else { - pos = newPos; - } + pos = formatTilePath(tile, request, pos); int len = REQUEST_GET_END.length; System.arraycopy(REQUEST_GET_END, 0, request, pos, len); @@ -402,8 +396,14 @@ public class LwHttp { * @param curPos current position * @return new position */ - protected int formatTilePath(Tile tile, byte[] path, int curPos) { - return 0; + protected int formatTilePath(Tile tile, byte[] request, int pos) { + request[pos++] = '/'; + pos = writeInt(tile.zoomLevel, pos, request); + request[pos++] = '/'; + pos = writeInt(tile.tileX, pos, request); + request[pos++] = '/'; + pos = writeInt(tile.tileY, pos, request); + return pos; } } diff --git a/vtm/src/org/oscim/tiling/source/common/UrlTileDataSource.java b/vtm/src/org/oscim/tiling/source/common/UrlTileDataSource.java index df013886..c61012cd 100644 --- a/vtm/src/org/oscim/tiling/source/common/UrlTileDataSource.java +++ b/vtm/src/org/oscim/tiling/source/common/UrlTileDataSource.java @@ -27,20 +27,22 @@ import org.oscim.tiling.source.ITileCache; import org.oscim.tiling.source.ITileDataSink; import org.oscim.tiling.source.ITileDataSource; import org.oscim.tiling.source.ITileDecoder; +import org.oscim.tiling.source.TileSource; import org.oscim.utils.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class UrlTileDataSource implements ITileDataSource { +public class UrlTileDataSource implements ITileDataSource { static final Logger log = LoggerFactory.getLogger(UrlTileDataSource.class); - protected LwHttp mConn; + protected final LwHttp mConn; protected final ITileDecoder mTileDecoder; protected final ITileCache mTileCache; - public UrlTileDataSource(ITileDecoder tileDecoder, ITileCache tileCache) { + public UrlTileDataSource(TileSource tileSource, ITileDecoder tileDecoder, LwHttp conn) { mTileDecoder = tileDecoder; - mTileCache = tileCache; + mTileCache = tileSource.tileCache; + mConn = conn; } @Override diff --git a/vtm/src/org/oscim/tiling/source/common/UrlTileSource.java b/vtm/src/org/oscim/tiling/source/common/UrlTileSource.java index d96cac8c..3d34e51c 100644 --- a/vtm/src/org/oscim/tiling/source/common/UrlTileSource.java +++ b/vtm/src/org/oscim/tiling/source/common/UrlTileSource.java @@ -22,22 +22,21 @@ import java.net.URL; import org.oscim.tiling.source.TileSource; public abstract class UrlTileSource extends TileSource { - private final static String KEY_URL = "url"; - protected URL mUrl; + protected final URL mUrl; + + public UrlTileSource(String urlString) { + URL url = null; + try { + url = new URL(urlString); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + mUrl = url; + } @Override public OpenResult open() { - if (!options.containsKey(KEY_URL)) - return new OpenResult("no url set"); - String urlString = options.get(KEY_URL); - try { - mUrl = new URL(urlString); - } catch (MalformedURLException e) { - e.printStackTrace(); - return new OpenResult("invalid url " + urlString); - } - return OpenResult.SUCCESS; } @@ -45,9 +44,4 @@ public abstract class UrlTileSource extends TileSource { public void close() { } - - public boolean setUrl(String urlString) { - options.put("url", urlString); - return open() == OpenResult.SUCCESS; - } } diff --git a/vtm/src/org/oscim/tiling/source/mapnik/MapnikVectorTileSource.java b/vtm/src/org/oscim/tiling/source/mapnik/MapnikVectorTileSource.java index a14f008b..281ba244 100644 --- a/vtm/src/org/oscim/tiling/source/mapnik/MapnikVectorTileSource.java +++ b/vtm/src/org/oscim/tiling/source/mapnik/MapnikVectorTileSource.java @@ -16,50 +16,43 @@ */ package org.oscim.tiling.source.mapnik; -import java.net.URL; - import org.oscim.core.Tile; import org.oscim.tiling.source.ITileDataSource; -import org.oscim.tiling.source.TileSource; import org.oscim.tiling.source.common.LwHttp; import org.oscim.tiling.source.common.UrlTileDataSource; import org.oscim.tiling.source.common.UrlTileSource; public class MapnikVectorTileSource extends UrlTileSource { + public MapnikVectorTileSource() { + super("http://d1s11ojcu7opje.cloudfront.net/dev/764e0b8d"); + } + @Override public ITileDataSource getDataSource() { - return new TileDataSource(this, mUrl); - } + LwHttp conn = new LwHttp(mUrl, "image/png", ".vector.pbf", true) { + @Override + protected int formatTilePath(Tile tile, byte[] path, int pos) { + // url formatter for mapbox streets + byte[] hexTable = { + '0', '1', '2', '3', + '4', '5', '6', '7', + '8', '9', 'a', 'b', + 'c', 'd', 'e', 'f' + }; - static class TileDataSource extends UrlTileDataSource { - - public TileDataSource(TileSource tileSource, URL url) { - super(new TileDecoder(), tileSource.tileCache); - - mConn = new LwHttp(url, "image/png", "vector.pbf", true) { - @Override - protected int formatTilePath(Tile tile, byte[] path, int pos) { - // url formatter for mapbox streets - byte[] hexTable = { - '0', '1', '2', '3', - '4', '5', '6', '7', - '8', '9', 'a', 'b', - 'c', 'd', 'e', 'f' - }; - - path[pos++] = '/'; - path[pos++] = hexTable[(tile.tileX) % 16]; - path[pos++] = hexTable[(tile.tileY) % 16]; - path[pos++] = '/'; - pos = LwHttp.writeInt(tile.zoomLevel, pos, path); - path[pos++] = '/'; - pos = LwHttp.writeInt(tile.tileX, pos, path); - path[pos++] = '/'; - pos = LwHttp.writeInt(tile.tileY, pos, path); - return pos; - } - }; - } + path[pos++] = '/'; + path[pos++] = hexTable[(tile.tileX) % 16]; + path[pos++] = hexTable[(tile.tileY) % 16]; + path[pos++] = '/'; + pos = LwHttp.writeInt(tile.zoomLevel, pos, path); + path[pos++] = '/'; + pos = LwHttp.writeInt(tile.tileX, pos, path); + path[pos++] = '/'; + pos = LwHttp.writeInt(tile.tileY, pos, path); + return pos; + } + }; + return new UrlTileDataSource(this, new TileDecoder(), conn); } } diff --git a/vtm/src/org/oscim/tiling/source/oscimap/OSciMap1TileSource.java b/vtm/src/org/oscim/tiling/source/oscimap/OSciMap1TileSource.java index ad7837bd..dd12ccee 100644 --- a/vtm/src/org/oscim/tiling/source/oscimap/OSciMap1TileSource.java +++ b/vtm/src/org/oscim/tiling/source/oscimap/OSciMap1TileSource.java @@ -16,10 +16,7 @@ */ package org.oscim.tiling.source.oscimap; -import java.net.URL; - import org.oscim.tiling.source.ITileDataSource; -import org.oscim.tiling.source.TileSource; import org.oscim.tiling.source.common.LwHttp; import org.oscim.tiling.source.common.UrlTileDataSource; import org.oscim.tiling.source.common.UrlTileSource; @@ -30,15 +27,13 @@ import org.oscim.tiling.source.common.UrlTileSource; */ public class OSciMap1TileSource extends UrlTileSource { - @Override - public ITileDataSource getDataSource() { - return new TileDataSource(this, mUrl); + public OSciMap1TileSource(String url) { + super(url); } - class TileDataSource extends UrlTileDataSource { - public TileDataSource(TileSource tileSource, URL url) { - super(new TileDecoder(), tileSource.tileCache); - mConn = new LwHttp(url, "application/osmtile", "osmtile", false); - } + @Override + public ITileDataSource getDataSource() { + LwHttp conn = new LwHttp(mUrl, "application/osmtile", ".osmtile", false); + return new UrlTileDataSource(this, new TileDecoder(), conn); } } diff --git a/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java b/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java index f1c246d6..ae5d1160 100644 --- a/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java +++ b/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java @@ -18,7 +18,6 @@ package org.oscim.tiling.source.oscimap2; import java.io.IOException; import java.io.InputStream; -import java.net.URL; import java.util.Arrays; import org.oscim.core.GeometryBuffer.GeometryType; @@ -28,7 +27,6 @@ import org.oscim.core.TagSet; import org.oscim.core.Tile; import org.oscim.tiling.source.ITileDataSink; import org.oscim.tiling.source.ITileDataSource; -import org.oscim.tiling.source.TileSource; import org.oscim.tiling.source.common.LwHttp; import org.oscim.tiling.source.common.PbfDecoder; import org.oscim.tiling.source.common.UrlTileDataSource; @@ -38,16 +36,14 @@ import org.slf4j.LoggerFactory; public class OSciMap2TileSource extends UrlTileSource { - @Override - public ITileDataSource getDataSource() { - return new TileDataSource(this, mUrl); + public OSciMap2TileSource(String url) { + super(url); } - class TileDataSource extends UrlTileDataSource { - public TileDataSource(TileSource tileSource, URL url) { - super(new TileDecoder(), tileSource.tileCache); - mConn = new LwHttp(url, "application/osmtile", "osmtile", false); - } + @Override + public ITileDataSource getDataSource() { + LwHttp conn = new LwHttp(mUrl, "application/osmtile", ".osmtile", false); + return new UrlTileDataSource(this, new TileDecoder(), conn); } static class TileDecoder extends PbfDecoder { diff --git a/vtm/src/org/oscim/tiling/source/oscimap4/OSciMap4TileSource.java b/vtm/src/org/oscim/tiling/source/oscimap4/OSciMap4TileSource.java index ae17da45..ee9c4d07 100644 --- a/vtm/src/org/oscim/tiling/source/oscimap4/OSciMap4TileSource.java +++ b/vtm/src/org/oscim/tiling/source/oscimap4/OSciMap4TileSource.java @@ -16,26 +16,25 @@ */ package org.oscim.tiling.source.oscimap4; -import java.net.URL; - import org.oscim.tiling.source.ITileDataSource; -import org.oscim.tiling.source.TileSource; import org.oscim.tiling.source.common.LwHttp; import org.oscim.tiling.source.common.UrlTileDataSource; import org.oscim.tiling.source.common.UrlTileSource; public class OSciMap4TileSource extends UrlTileSource { - @Override - public ITileDataSource getDataSource() { - return new TileDataSource(this, mUrl); + public OSciMap4TileSource() { + super("http://opensciencemap.org/tiles/vtm"); } - class TileDataSource extends UrlTileDataSource { - public TileDataSource(TileSource tileSource, URL url) { - super(new TileDecoder(), tileSource.tileCache); - //mConn = new LwHttp(url, "application/x-protobuf", "vtm", false); - mConn = new LwHttp(url, "image/png", "vtm", false); - } + public OSciMap4TileSource(String url) { + super(url); + } + + @Override + public ITileDataSource getDataSource() { + //LwHttp conn = new LwHttp(url, "application/x-protobuf", ".vtm", false); + LwHttp conn = new LwHttp(mUrl, "image/png", ".vtm", false); + return new UrlTileDataSource(this, new TileDecoder(), conn); } } From 9baf5b2b6ea9ef540c589fd08c9a20945cab17a3 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Tue, 21 Jan 2014 02:49:49 +0100 Subject: [PATCH 8/8] new BitmapTileLayer implementation --- .../android/test/BitmapTileMapActivity.java | 13 +- .../android/test/PathOverlayActivity.java | 4 - .../src/org/oscim/gdx/GdxMapApp.java | 14 +- .../src/org/oscim/gdx/client/GwtGdxMap.java | 6 +- .../layers/tile/bitmap/BitmapTileLayer.java | 137 ------------------ .../tile/{bitmap => }/BitmapTileLayer.java | 135 +++++++++-------- .../tile/bitmap/AbstractTileSource.java | 64 -------- .../layers/tile/bitmap/ArcGISWorldShaded.java | 67 --------- .../layers/tile/bitmap/HillShadeTiles.java | 79 ---------- .../layers/tile/bitmap/MapQuestAerial.java | 65 --------- .../layers/tile/bitmap/NaturalEarth.java | 77 ---------- .../layers/tile/bitmap/OpenStreetMap.java | 77 ---------- .../tile/bitmap/OpenStreetMapMapnik.java | 67 --------- .../tile/bitmap/OpenStreetMapTransport.java | 80 ---------- .../layers/tile/bitmap/StamenTonerTiles.java | 70 --------- .../layers/tile/bitmap/StamenWaterTiles.java | 65 --------- .../oscim/layers/tile/bitmap/TileSource.java | 60 -------- vtm/src/org/oscim/map/Map.java | 4 +- .../source/bitmap/BitmapTileSource.java | 94 ++++++++++++ .../tiling/source/bitmap/DefaultSources.java | 102 +++++++++++++ 20 files changed, 292 insertions(+), 988 deletions(-) delete mode 100644 vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/bitmap/BitmapTileLayer.java rename vtm/src/org/oscim/layers/tile/{bitmap => }/BitmapTileLayer.java (54%) delete mode 100644 vtm/src/org/oscim/layers/tile/bitmap/AbstractTileSource.java delete mode 100644 vtm/src/org/oscim/layers/tile/bitmap/ArcGISWorldShaded.java delete mode 100644 vtm/src/org/oscim/layers/tile/bitmap/HillShadeTiles.java delete mode 100644 vtm/src/org/oscim/layers/tile/bitmap/MapQuestAerial.java delete mode 100644 vtm/src/org/oscim/layers/tile/bitmap/NaturalEarth.java delete mode 100644 vtm/src/org/oscim/layers/tile/bitmap/OpenStreetMap.java delete mode 100644 vtm/src/org/oscim/layers/tile/bitmap/OpenStreetMapMapnik.java delete mode 100644 vtm/src/org/oscim/layers/tile/bitmap/OpenStreetMapTransport.java delete mode 100644 vtm/src/org/oscim/layers/tile/bitmap/StamenTonerTiles.java delete mode 100644 vtm/src/org/oscim/layers/tile/bitmap/StamenWaterTiles.java delete mode 100644 vtm/src/org/oscim/layers/tile/bitmap/TileSource.java create mode 100644 vtm/src/org/oscim/tiling/source/bitmap/BitmapTileSource.java create mode 100644 vtm/src/org/oscim/tiling/source/bitmap/DefaultSources.java diff --git a/vtm-android-example/src/org/oscim/android/test/BitmapTileMapActivity.java b/vtm-android-example/src/org/oscim/android/test/BitmapTileMapActivity.java index 927f30a6..f59c2557 100644 --- a/vtm-android-example/src/org/oscim/android/test/BitmapTileMapActivity.java +++ b/vtm-android-example/src/org/oscim/android/test/BitmapTileMapActivity.java @@ -16,8 +16,8 @@ package org.oscim.android.test; import org.oscim.android.MapActivity; import org.oscim.android.MapView; -import org.oscim.layers.tile.bitmap.BitmapTileLayer; -import org.oscim.layers.tile.bitmap.StamenTonerTiles; +import org.oscim.layers.tile.BitmapTileLayer; +import org.oscim.tiling.source.bitmap.DefaultSources.OpenStreetMap; import android.os.Bundle; @@ -30,8 +30,13 @@ public class BitmapTileMapActivity extends MapActivity { setContentView(R.layout.activity_map); mMapView = (MapView) findViewById(R.id.mapView); - //registerMapView(mMapView); + registerMapView(mMapView); - mMap.getLayers().add(new BitmapTileLayer(mMap, StamenTonerTiles.INSTANCE, 20)); + mMap.getLayers().add(new BitmapTileLayer(mMap, new OpenStreetMap(), 20)); + //mMap.getLayers().add(new BitmapTileLayer(mMap, new ImagicoLandcover(), 20)); + //mMap.getLayers().add(new BitmapTileLayer(mMap, new ArcGISWorldShaded(), 20)); + //mMap.getLayers().add(new BitmapTileLayer(mMap, new HillShadeHD(), 20)); + + mMap.setMapPosition(0, 0, 1 << 2); } } diff --git a/vtm-android-example/src/org/oscim/android/test/PathOverlayActivity.java b/vtm-android-example/src/org/oscim/android/test/PathOverlayActivity.java index 86b62368..3b023845 100644 --- a/vtm-android-example/src/org/oscim/android/test/PathOverlayActivity.java +++ b/vtm-android-example/src/org/oscim/android/test/PathOverlayActivity.java @@ -24,8 +24,6 @@ import org.oscim.android.MapView; import org.oscim.backend.canvas.Color; import org.oscim.core.GeoPoint; import org.oscim.layers.PathLayer; -import org.oscim.layers.tile.bitmap.BitmapTileLayer; -import org.oscim.layers.tile.bitmap.StamenTonerTiles; import android.os.Bundle; @@ -41,8 +39,6 @@ public class PathOverlayActivity extends MapActivity { mMapView = (MapView) findViewById(R.id.mapView); registerMapView(mMapView); - mMap.getLayers().add(new BitmapTileLayer(mMap, StamenTonerTiles.INSTANCE, 20)); - for (double lon = -180; lon < 180; lon += 5) { List pts = new ArrayList(); diff --git a/vtm-gdx-desktop/src/org/oscim/gdx/GdxMapApp.java b/vtm-gdx-desktop/src/org/oscim/gdx/GdxMapApp.java index 8651604b..4f4442ba 100644 --- a/vtm-gdx-desktop/src/org/oscim/gdx/GdxMapApp.java +++ b/vtm-gdx-desktop/src/org/oscim/gdx/GdxMapApp.java @@ -21,7 +21,6 @@ import java.nio.Buffer; import org.oscim.awt.AwtGraphics; import org.oscim.backend.CanvasAdapter; import org.oscim.backend.GLAdapter; -import org.oscim.core.MapPosition; import org.oscim.core.Tile; import org.oscim.tiling.source.TileSource; import org.oscim.tiling.source.oscimap4.OSciMap4TileSource; @@ -33,6 +32,9 @@ import com.badlogic.gdx.backends.lwjgl.LwjglGL20; import com.badlogic.gdx.utils.SharedLibraryLoader; public class GdxMapApp extends GdxMap { + static { + System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "TRACE"); + } // wrap LwjglGL20 to add GL20 interface static class GdxGL extends LwjglGL20 implements org.oscim.backend.GL20 { @@ -78,16 +80,16 @@ public class GdxMapApp extends GdxMap { @Override public void createLayers() { TileSource tileSource = new OSciMap4TileSource(); - tileSource.setOption("url", "http://opensciencemap.org/tiles/vtm"); // TileSource tileSource = new MapFileTileSource(); // tileSource.setOption("file", "/home/jeff/germany.map"); initDefaultLayers(tileSource, false, true, true); - MapPosition p = new MapPosition(); - p.setZoomLevel(14); - p.setPosition(53.08, 8.83); - mMap.setMapPosition(p); + //mMap.getLayers().add(new BitmapTileLayer(mMap, new ImagicoLandcover(), 20)); + //mMap.getLayers().add(new BitmapTileLayer(mMap, new OSMTileSource(), 20)); + //mMap.getLayers().add(new BitmapTileLayer(mMap, new ArcGISWorldShaded(), 20)); + + mMap.setMapPosition(0, 0, 1 << 2); } } diff --git a/vtm-gdx-html/src/org/oscim/gdx/client/GwtGdxMap.java b/vtm-gdx-html/src/org/oscim/gdx/client/GwtGdxMap.java index 3d9d6e06..a4eb8464 100644 --- a/vtm-gdx-html/src/org/oscim/gdx/client/GwtGdxMap.java +++ b/vtm-gdx-html/src/org/oscim/gdx/client/GwtGdxMap.java @@ -22,10 +22,10 @@ import org.oscim.backend.GLAdapter; import org.oscim.core.MapPosition; import org.oscim.core.MercatorProjection; import org.oscim.gdx.GdxMap; -import org.oscim.layers.tile.bitmap.BitmapTileLayer; -import org.oscim.layers.tile.bitmap.NaturalEarth; +import org.oscim.layers.tile.BitmapTileLayer; import org.oscim.renderer.MapRenderer; import org.oscim.tiling.source.TileSource; +import org.oscim.tiling.source.bitmap.DefaultSources.NaturalEarth; import org.oscim.tiling.source.oscimap2.OSciMap2TileSource; import org.oscim.tiling.source.oscimap4.OSciMap4TileSource; import org.slf4j.Logger; @@ -116,7 +116,7 @@ class GwtGdxMap extends GdxMap { initDefaultLayers(tileSource, false, true, true); if ("naturalearth".equals(c.getBackgroundLayer())) - mMap.setBackgroundMap(new BitmapTileLayer(mMap, NaturalEarth.INSTANCE)); + mMap.setBackgroundMap(new BitmapTileLayer(mMap, new NaturalEarth())); mSearchBox = new SearchBox(mMap); diff --git a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/bitmap/BitmapTileLayer.java b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/bitmap/BitmapTileLayer.java deleted file mode 100644 index 28fd800d..00000000 --- a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/bitmap/BitmapTileLayer.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright 2013 Hannes Janetzek - * - * This program is free software: you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * this program. If not, see . - */ -package org.oscim.layers.tile.bitmap; - -import java.net.URL; - -import org.oscim.backend.canvas.Bitmap; -import org.oscim.core.MapPosition; -import org.oscim.core.Tile; -import org.oscim.gdx.client.GwtBitmap; -import org.oscim.layers.tile.TileLayer; -import org.oscim.layers.tile.bitmap.TileSource.FadeStep; -import org.oscim.map.Map; -import org.oscim.renderer.elements.BitmapLayer; -import org.oscim.renderer.elements.ElementLayers; -import org.oscim.tiling.MapTile; -import org.oscim.tiling.TileLoader; -import org.oscim.tiling.TileManager; -import org.oscim.utils.FastMath; - -import com.google.gwt.event.dom.client.ErrorEvent; -import com.google.gwt.event.dom.client.ErrorHandler; -import com.google.gwt.event.dom.client.LoadEvent; -import com.google.gwt.event.dom.client.LoadHandler; -import com.google.gwt.user.client.ui.Image; -import com.google.gwt.user.client.ui.RootPanel; - -public class BitmapTileLayer extends TileLayer { - - private final static int CACHE_LIMIT = 50; - - final TileSource mTileSource; - private final FadeStep[] mFade; - - public BitmapTileLayer(Map map, TileSource tileSource) { - this(map, tileSource, CACHE_LIMIT); - } - - public BitmapTileLayer(Map map, TileSource tileSource, int cacheLimit) { - super(map, tileSource.getZoomLevelMin(), tileSource.getZoomLevelMax(), cacheLimit); - mTileSource = tileSource; - mFade = mTileSource.getFadeSteps(); - } - - @Override - public void onMapUpdate(MapPosition pos, boolean changed, boolean clear) { - super.onMapUpdate(pos, changed, clear); - - if (mFade == null) { - mRenderLayer.setBitmapAlpha(1); - return; - } - - float alpha = 0; - for (FadeStep f : mFade) { - if (pos.scale < f.scaleStart || pos.scale > f.scaleEnd) - continue; - - if (f.alphaStart == f.alphaEnd) { - alpha = f.alphaStart; - break; - } - double range = f.scaleEnd / f.scaleStart; - float a = (float) ((range - (pos.scale / f.scaleStart)) / range); - a = FastMath.clamp(a, 0, 1); - // interpolate alpha between start and end - alpha = a * f.alphaStart + (1 - a) * f.alphaEnd; - break; - } - - mRenderLayer.setBitmapAlpha(alpha); - } - - @Override - protected TileLoader createLoader(TileManager tm) { - return new TileLoader(tm) { - - private void loadImage(final MapTile tile, final String url) { - final Image img = new Image(url); - RootPanel.get().add(img); - img.setVisible(false); - - img.addLoadHandler(new LoadHandler() { - public void onLoad(LoadEvent event) { - - Bitmap bitmap = new GwtBitmap(img); - tile.layers = new ElementLayers(); - BitmapLayer l = new BitmapLayer(false); - l.setBitmap(bitmap, Tile.SIZE, Tile.SIZE); - - tile.layers.textureLayers = l; - tile.loader.jobCompleted(tile, true); - } - }); - - img.addErrorHandler(new ErrorHandler() { - - @Override - public void onError(ErrorEvent event) { - tile.loader.jobCompleted(tile, false); - } - }); - } - - @Override - protected boolean executeJob(MapTile tile) { - URL url; - try { - url = mTileSource.getTileUrl(tile); - loadImage(tile, url.toString()); - } catch (Exception e) { - e.printStackTrace(); - tile.loader.jobCompleted(tile, false); - return false; - } - - return false; - } - - @Override - public void cleanup() { - } - }; - } -} diff --git a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java b/vtm/src/org/oscim/layers/tile/BitmapTileLayer.java similarity index 54% rename from vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java rename to vtm/src/org/oscim/layers/tile/BitmapTileLayer.java index ee4c5818..e2cc974e 100644 --- a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/BitmapTileLayer.java @@ -14,26 +14,23 @@ * You should have received a copy of the GNU Lesser General Public License along with * this program. If not, see . */ -package org.oscim.layers.tile.bitmap; +package org.oscim.layers.tile; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; -import java.util.zip.GZIPInputStream; - -import org.oscim.backend.CanvasAdapter; import org.oscim.backend.canvas.Bitmap; +import org.oscim.core.MapElement; import org.oscim.core.MapPosition; import org.oscim.core.Tile; -import org.oscim.layers.tile.TileLayer; -import org.oscim.layers.tile.bitmap.TileSource.FadeStep; import org.oscim.map.Map; import org.oscim.renderer.elements.BitmapLayer; import org.oscim.renderer.elements.ElementLayers; import org.oscim.tiling.MapTile; import org.oscim.tiling.TileLoader; import org.oscim.tiling.TileManager; +import org.oscim.tiling.source.ITileDataSink; +import org.oscim.tiling.source.ITileDataSource; +import org.oscim.tiling.source.ITileDataSource.QueryResult; +import org.oscim.tiling.source.TileSource; +import org.oscim.tiling.source.bitmap.BitmapTileSource; import org.oscim.utils.FastMath; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,20 +41,27 @@ public class BitmapTileLayer extends TileLayer { private final static int CACHE_LIMIT = 50; - private static final int TIMEOUT_CONNECT = 5000; - private static final int TIMEOUT_READ = 10000; + private final BitmapTileSource mTileSource; - final TileSource mTileSource; - private final FadeStep[] mFade; + public static class FadeStep { + public final double scaleStart, scaleEnd; + public final float alphaStart, alphaEnd; - public BitmapTileLayer(Map map, TileSource tileSource) { + public FadeStep(int zoomStart, int zoomEnd, float alphaStart, float alphaEnd) { + this.scaleStart = 1 << zoomStart; + this.scaleEnd = 1 << zoomEnd; + this.alphaStart = alphaStart; + this.alphaEnd = alphaEnd; + } + } + + public BitmapTileLayer(Map map, BitmapTileSource tileSource) { this(map, tileSource, CACHE_LIMIT); } - public BitmapTileLayer(Map map, TileSource tileSource, int cacheLimit) { + public BitmapTileLayer(Map map, BitmapTileSource tileSource, int cacheLimit) { super(map, tileSource.getZoomLevelMin(), tileSource.getZoomLevelMax(), cacheLimit); mTileSource = tileSource; - mFade = mTileSource.getFadeSteps(); initLoader(); } @@ -65,13 +69,15 @@ public class BitmapTileLayer extends TileLayer { public void onMapUpdate(MapPosition pos, boolean changed, boolean clear) { super.onMapUpdate(pos, changed, clear); - if (mFade == null) { + FadeStep[] fade = mTileSource.getFadeSteps(); + + if (fade == null) { mRenderLayer.setBitmapAlpha(1); return; } float alpha = 0; - for (FadeStep f : mFade) { + for (FadeStep f : fade) { if (pos.scale < f.scaleStart || pos.scale > f.scaleEnd) continue; @@ -92,47 +98,54 @@ public class BitmapTileLayer extends TileLayer { @Override protected TileLoader createLoader(TileManager tm) { - return new TileLoader(tm) { - - @Override - protected boolean executeJob(MapTile tile) { - URL url; - try { - url = mTileSource.getTileUrl(tile); - URLConnection urlConnection = getURLConnection(url); - InputStream inputStream = getInputStream(urlConnection); - Bitmap bitmap = CanvasAdapter.g.decodeBitmap(inputStream); - - tile.layers = new ElementLayers(); - BitmapLayer l = new BitmapLayer(false); - l.setBitmap(bitmap, Tile.SIZE, Tile.SIZE); - - tile.layers.textureLayers = l; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - - return true; - } - - @Override - public void cleanup() { - } - - private InputStream getInputStream(URLConnection urlConnection) throws IOException { - if ("gzip".equals(urlConnection.getContentEncoding())) { - return new GZIPInputStream(urlConnection.getInputStream()); - } - return urlConnection.getInputStream(); - } - - private URLConnection getURLConnection(URL url) throws IOException { - URLConnection urlConnection = url.openConnection(); - urlConnection.setConnectTimeout(TIMEOUT_CONNECT); - urlConnection.setReadTimeout(TIMEOUT_READ); - return urlConnection; - } - }; + return new BitmapTileLoader(tm, mTileSource); } + + class BitmapTileLoader extends TileLoader implements ITileDataSink { + + private final ITileDataSource mTileDataSource; + private MapTile mTile; + + public BitmapTileLoader(TileManager tileManager, TileSource tileSource) { + super(tileManager); + mTileDataSource = tileSource.getDataSource(); + } + + @Override + public void cleanup() { + + } + + @Override + protected boolean executeJob(MapTile tile) { + QueryResult result; + + try { + mTile = tile; + result = mTileDataSource.executeQuery(tile, this); + } finally { + mTile = null; + } + return result == QueryResult.SUCCESS; + } + + @Override + public void setTileImage(Bitmap bitmap) { + BitmapLayer l = new BitmapLayer(false); + l.setBitmap(bitmap, Tile.SIZE, Tile.SIZE); + mTile.layers = new ElementLayers(); + mTile.layers.textureLayers = l; + } + + @Override + public void process(MapElement element) { + + } + + @Override + public void completed(boolean success) { + + } + } + } diff --git a/vtm/src/org/oscim/layers/tile/bitmap/AbstractTileSource.java b/vtm/src/org/oscim/layers/tile/bitmap/AbstractTileSource.java deleted file mode 100644 index 24abc2a1..00000000 --- a/vtm/src/org/oscim/layers/tile/bitmap/AbstractTileSource.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2010, 2011, 2012 mapsforge.org - * Copyright 2013 Hannes Janetzek - * - * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). - * - * This program is free software: you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * this program. If not, see . - */ -package org.oscim.layers.tile.bitmap; - -public abstract class AbstractTileSource implements TileSource { - protected final String hostName; - protected final int port; - - protected AbstractTileSource(String hostName, int port) { - if (hostName == null || hostName.isEmpty()) { - throw new IllegalArgumentException("no host name specified"); - } else if (port < 0 || port > 65535) { - throw new IllegalArgumentException("invalid port number: " + port); - } - - this.hostName = hostName; - this.port = port; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } else if (!(obj instanceof AbstractTileSource)) { - return false; - } - AbstractTileSource other = (AbstractTileSource) obj; - if (!this.hostName.equals(other.hostName)) { - return false; - } else if (this.port != other.port) { - return false; - } - return true; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + this.hostName.hashCode(); - result = prime * result + this.port; - return result; - } - - @Override - public FadeStep[] getFadeSteps() { - return null; - } -} diff --git a/vtm/src/org/oscim/layers/tile/bitmap/ArcGISWorldShaded.java b/vtm/src/org/oscim/layers/tile/bitmap/ArcGISWorldShaded.java deleted file mode 100644 index 01c562dd..00000000 --- a/vtm/src/org/oscim/layers/tile/bitmap/ArcGISWorldShaded.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2010, 2011, 2012 mapsforge.org - * Copyright 2013 Hannes Janetzek - * - * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). - * - * This program is free software: you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * this program. If not, see . - */ -package org.oscim.layers.tile.bitmap; - -import java.net.MalformedURLException; -import java.net.URL; - -import org.oscim.core.Tile; -//http://server.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/5/14/14 -//http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer - -public class ArcGISWorldShaded extends AbstractTileSource { - public static final ArcGISWorldShaded INSTANCE = new ArcGISWorldShaded("server.arcgisonline.com", - 80); - private static final int PARALLEL_REQUESTS_LIMIT = 4; - private static final String PROTOCOL = "http"; - private static final int ZOOM_LEVEL_MAX = 6; - private static final int ZOOM_LEVEL_MIN = 0; - - public ArcGISWorldShaded(String hostName, int port) { - super(hostName, port); - } - - @Override - public int getParallelRequestsLimit() { - return PARALLEL_REQUESTS_LIMIT; - } - - @Override - public URL getTileUrl(Tile tile) throws MalformedURLException { - StringBuilder stringBuilder = new StringBuilder(32); - //stringBuilder.append("/ArcGIS/rest/services/World_Imagery/MapServer/tile/"); - stringBuilder.append("/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/"); - stringBuilder.append(tile.zoomLevel); - stringBuilder.append('/'); - stringBuilder.append(tile.tileY); - stringBuilder.append('/'); - stringBuilder.append(tile.tileX); - - return new URL(PROTOCOL, this.hostName, this.port, stringBuilder.toString()); - } - - @Override - public byte getZoomLevelMax() { - return ZOOM_LEVEL_MAX; - } - - @Override - public byte getZoomLevelMin() { - return ZOOM_LEVEL_MIN; - } -} diff --git a/vtm/src/org/oscim/layers/tile/bitmap/HillShadeTiles.java b/vtm/src/org/oscim/layers/tile/bitmap/HillShadeTiles.java deleted file mode 100644 index 33a495f5..00000000 --- a/vtm/src/org/oscim/layers/tile/bitmap/HillShadeTiles.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2010, 2011, 2012 mapsforge.org - * Copyright 2013 Hannes Janetzek - * - * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). - * - * This program is free software: you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * this program. If not, see . - */ -package org.oscim.layers.tile.bitmap; - -import java.net.MalformedURLException; -import java.net.URL; - -import org.oscim.core.Tile; - -public class HillShadeTiles extends AbstractTileSource { - - //public static final HillShadeTiles INSTANCE = new HillShadeTiles("toolserver.org", 80); - - // from http://openmapsurfer.uni-hd.de/ - public static final HillShadeTiles INSTANCE = new HillShadeTiles("129.206.74.245", 8004); - - private static final int PARALLEL_REQUESTS_LIMIT = 8; - private static final String PROTOCOL = "http"; - private static final int ZOOM_LEVEL_MAX = 18; - private static final int ZOOM_LEVEL_MIN = 2; - - public HillShadeTiles(String hostName, int port) { - super(hostName, port); - } - - @Override - public int getParallelRequestsLimit() { - return PARALLEL_REQUESTS_LIMIT; - } - - @Override - public URL getTileUrl(Tile tile) throws MalformedURLException { - StringBuilder stringBuilder = new StringBuilder(32); - - //tms_hs.ashx?x=131&y=94&z=8 - - stringBuilder.append("/tms_hs.ashx?x="); - stringBuilder.append(tile.tileX); - stringBuilder.append("&y="); - stringBuilder.append(tile.tileY); - stringBuilder.append("&z="); - stringBuilder.append(tile.zoomLevel); - - //stringBuilder.append("/~cmarqu/hill/"); - //stringBuilder.append(tile.zoomLevel); - //stringBuilder.append('/'); - //stringBuilder.append(tile.tileX); - //stringBuilder.append('/'); - //stringBuilder.append(tile.tileY); - //stringBuilder.append(".png"); - - return new URL(PROTOCOL, this.hostName, this.port, stringBuilder.toString()); - } - - @Override - public byte getZoomLevelMax() { - return ZOOM_LEVEL_MAX; - } - - @Override - public byte getZoomLevelMin() { - return ZOOM_LEVEL_MIN; - } -} diff --git a/vtm/src/org/oscim/layers/tile/bitmap/MapQuestAerial.java b/vtm/src/org/oscim/layers/tile/bitmap/MapQuestAerial.java deleted file mode 100644 index 8f440fa2..00000000 --- a/vtm/src/org/oscim/layers/tile/bitmap/MapQuestAerial.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2010, 2011, 2012 mapsforge.org - * Copyright 2013 Hannes Janetzek - * - * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). - * - * This program is free software: you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * this program. If not, see . - */ -package org.oscim.layers.tile.bitmap; - -import java.net.MalformedURLException; -import java.net.URL; - -import org.oscim.core.Tile; - -public class MapQuestAerial extends AbstractTileSource { - public static final MapQuestAerial INSTANCE = new MapQuestAerial("otile1.mqcdn.com", 80); - private static final int PARALLEL_REQUESTS_LIMIT = 8; - private static final String PROTOCOL = "http"; - private static final int ZOOM_LEVEL_MAX = 8; - private static final int ZOOM_LEVEL_MIN = 0; - - public MapQuestAerial(String hostName, int port) { - super(hostName, port); - } - - @Override - public int getParallelRequestsLimit() { - return PARALLEL_REQUESTS_LIMIT; - } - - @Override - public URL getTileUrl(Tile tile) throws MalformedURLException { - StringBuilder stringBuilder = new StringBuilder(32); - - stringBuilder.append("/tiles/1.0.0/sat/"); - stringBuilder.append(tile.zoomLevel); - stringBuilder.append('/'); - stringBuilder.append(tile.tileX); - stringBuilder.append('/'); - stringBuilder.append(tile.tileY); - stringBuilder.append(".jpg"); - - return new URL(PROTOCOL, this.hostName, this.port, stringBuilder.toString()); - } - - @Override - public byte getZoomLevelMax() { - return ZOOM_LEVEL_MAX; - } - - @Override - public byte getZoomLevelMin() { - return ZOOM_LEVEL_MIN; - } -} diff --git a/vtm/src/org/oscim/layers/tile/bitmap/NaturalEarth.java b/vtm/src/org/oscim/layers/tile/bitmap/NaturalEarth.java deleted file mode 100644 index 7125afa8..00000000 --- a/vtm/src/org/oscim/layers/tile/bitmap/NaturalEarth.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2010, 2011, 2012 mapsforge.org - * Copyright 2013 Hannes Janetzek - * - * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). - * - * This program is free software: you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * this program. If not, see . - */ -package org.oscim.layers.tile.bitmap; - -import java.net.MalformedURLException; -import java.net.URL; - -import org.oscim.core.Tile; - -public class NaturalEarth extends AbstractTileSource { - public static final NaturalEarth INSTANCE = new NaturalEarth("city.informatik.uni-bremen.de", - 80); - private static final int PARALLEL_REQUESTS_LIMIT = 4; - private static final String PROTOCOL = "http"; - private static final int ZOOM_LEVEL_MAX = 8; - private static final int ZOOM_LEVEL_MIN = 0; - - public NaturalEarth(String hostName, int port) { - super(hostName, port); - } - - @Override - public int getParallelRequestsLimit() { - return PARALLEL_REQUESTS_LIMIT; - } - - @Override - public URL getTileUrl(Tile tile) throws MalformedURLException { - StringBuilder stringBuilder = new StringBuilder(32); - - stringBuilder.append("/tiles/ne/"); - //stringBuilder.append("/osci/ne_image2/"); - stringBuilder.append(tile.zoomLevel); - stringBuilder.append('/'); - stringBuilder.append(tile.tileX); - stringBuilder.append('/'); - stringBuilder.append(tile.tileY); - stringBuilder.append(".png"); - - return new URL(PROTOCOL, this.hostName, this.port, stringBuilder.toString()); - } - - @Override - public byte getZoomLevelMax() { - return ZOOM_LEVEL_MAX; - } - - @Override - public byte getZoomLevelMin() { - return ZOOM_LEVEL_MIN; - } - - @Override - public FadeStep[] getFadeSteps() { - return new FadeStep[] { - new FadeStep(ZOOM_LEVEL_MIN, ZOOM_LEVEL_MAX - 1, 1, 0.7f), - // dont fade between zoom-min/max - // fade above zoom max + 2, interpolate 1 to 0 - new FadeStep(ZOOM_LEVEL_MAX - 1, ZOOM_LEVEL_MAX + 1, 0.7f, 0) - }; - } -} diff --git a/vtm/src/org/oscim/layers/tile/bitmap/OpenStreetMap.java b/vtm/src/org/oscim/layers/tile/bitmap/OpenStreetMap.java deleted file mode 100644 index 6874b4c5..00000000 --- a/vtm/src/org/oscim/layers/tile/bitmap/OpenStreetMap.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2010, 2011, 2012 mapsforge.org - * Copyright 2013 Hannes Janetzek - * - * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). - * - * This program is free software: you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * this program. If not, see . - */ -package org.oscim.layers.tile.bitmap; - -import java.net.MalformedURLException; -import java.net.URL; - -import org.oscim.core.Tile; - -public class OpenStreetMap extends AbstractTileSource { - public static final OpenStreetMap INSTANCE = new OpenStreetMap(".tile.openstreetmap.org", - 80); - - private static final int PARALLEL_REQUESTS_LIMIT = 8; - private static final String PROTOCOL = "http"; - private static final int ZOOM_LEVEL_MAX = 18; - private static final int ZOOM_LEVEL_MIN = 0; - - public OpenStreetMap(String hostName, int port) { - super(hostName, port); - } - - @Override - public int getParallelRequestsLimit() { - return PARALLEL_REQUESTS_LIMIT; - } - - private char[] subdomains = { 'a', 'b', 'c', 'd' }; - private int curDomain = 0; - - @Override - public URL getTileUrl(Tile tile) throws MalformedURLException { - StringBuilder stringBuilder = new StringBuilder(32); - - //stringBuilder.append("/osm/osm/"); - stringBuilder.append("/"); - stringBuilder.append(tile.zoomLevel); - stringBuilder.append('/'); - stringBuilder.append(tile.tileX); - stringBuilder.append('/'); - stringBuilder.append(tile.tileY); - stringBuilder.append(".png"); - - String host; - synchronized (this) { - curDomain = (curDomain++) % 4; - host = subdomains[curDomain] + hostName; - } - - return new URL(PROTOCOL, host, port, stringBuilder.toString()); - } - - @Override - public byte getZoomLevelMax() { - return ZOOM_LEVEL_MAX; - } - - @Override - public byte getZoomLevelMin() { - return ZOOM_LEVEL_MIN; - } -} diff --git a/vtm/src/org/oscim/layers/tile/bitmap/OpenStreetMapMapnik.java b/vtm/src/org/oscim/layers/tile/bitmap/OpenStreetMapMapnik.java deleted file mode 100644 index 326dbde3..00000000 --- a/vtm/src/org/oscim/layers/tile/bitmap/OpenStreetMapMapnik.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2010, 2011, 2012 mapsforge.org - * Copyright 2013 Hannes Janetzek - * - * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). - * - * This program is free software: you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * this program. If not, see . - */ -package org.oscim.layers.tile.bitmap; - -import java.net.MalformedURLException; -import java.net.URL; - -import org.oscim.core.Tile; - -public class OpenStreetMapMapnik extends AbstractTileSource { - public static final OpenStreetMapMapnik INSTANCE = new OpenStreetMapMapnik("tile.openstreetmap.org", 80); - - private static final int PARALLEL_REQUESTS_LIMIT = 8; - private static final String PROTOCOL = "http"; - private static final int ZOOM_LEVEL_MAX = 18; - private static final int ZOOM_LEVEL_MIN = 0; - - public OpenStreetMapMapnik(String hostName, int port) { - super(hostName, port); - } - - @Override - public int getParallelRequestsLimit() { - return PARALLEL_REQUESTS_LIMIT; - } - - @Override - public URL getTileUrl(Tile tile) throws MalformedURLException { - StringBuilder stringBuilder = new StringBuilder(32); - - //stringBuilder.append("/osm/osm/"); - stringBuilder.append("/"); - stringBuilder.append(tile.zoomLevel); - stringBuilder.append('/'); - stringBuilder.append(tile.tileX); - stringBuilder.append('/'); - stringBuilder.append(tile.tileY); - stringBuilder.append(".png"); - - return new URL(PROTOCOL, this.hostName, this.port, stringBuilder.toString()); - } - - @Override - public byte getZoomLevelMax() { - return ZOOM_LEVEL_MAX; - } - - @Override - public byte getZoomLevelMin() { - return ZOOM_LEVEL_MIN; - } -} diff --git a/vtm/src/org/oscim/layers/tile/bitmap/OpenStreetMapTransport.java b/vtm/src/org/oscim/layers/tile/bitmap/OpenStreetMapTransport.java deleted file mode 100644 index ef9c0c32..00000000 --- a/vtm/src/org/oscim/layers/tile/bitmap/OpenStreetMapTransport.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2010, 2011, 2012 mapsforge.org - * Copyright 2013 Hannes Janetzek - * - * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). - * - * This program is free software: you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * this program. If not, see . - */ -package org.oscim.layers.tile.bitmap; - -import java.net.MalformedURLException; -import java.net.URL; - -import org.oscim.core.Tile; - -public class OpenStreetMapTransport extends AbstractTileSource { - //http://tile.thunderforest.com/transport/3/3/3.png - - public static final OpenStreetMapTransport INSTANCE = - new OpenStreetMapTransport(".tile.thunderforest.com", 80); - - private static final int PARALLEL_REQUESTS_LIMIT = 8; - private static final String PROTOCOL = "http"; - private static final int ZOOM_LEVEL_MAX = 18; - private static final int ZOOM_LEVEL_MIN = 0; - - public OpenStreetMapTransport(String hostName, int port) { - super(hostName, port); - } - - @Override - public int getParallelRequestsLimit() { - return PARALLEL_REQUESTS_LIMIT; - } - - private char[] subdomains = { 'a', 'b', 'c', 'd' }; - private int curDomain = 0; - - @Override - public URL getTileUrl(Tile tile) throws MalformedURLException { - StringBuilder stringBuilder = new StringBuilder(32); - - //stringBuilder.append("/transport/"); - stringBuilder.append("/outdoors/"); - //stringBuilder.append("/landscape/"); - stringBuilder.append(tile.zoomLevel); - stringBuilder.append('/'); - stringBuilder.append(tile.tileX); - stringBuilder.append('/'); - stringBuilder.append(tile.tileY); - stringBuilder.append(".png"); - - String host; - synchronized (this) { - curDomain = (curDomain++) % 4; - host = subdomains[curDomain] + hostName; - } - - return new URL(PROTOCOL, host, port, stringBuilder.toString()); - } - - @Override - public byte getZoomLevelMax() { - return ZOOM_LEVEL_MAX; - } - - @Override - public byte getZoomLevelMin() { - return ZOOM_LEVEL_MIN; - } -} diff --git a/vtm/src/org/oscim/layers/tile/bitmap/StamenTonerTiles.java b/vtm/src/org/oscim/layers/tile/bitmap/StamenTonerTiles.java deleted file mode 100644 index a53b01ec..00000000 --- a/vtm/src/org/oscim/layers/tile/bitmap/StamenTonerTiles.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2010, 2011, 2012 mapsforge.org - * Copyright 2013 Hannes Janetzek - * - * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). - * - * This program is free software: you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * this program. If not, see . - */ -package org.oscim.layers.tile.bitmap; - -import java.net.MalformedURLException; -import java.net.URL; - -import org.oscim.core.Tile; - -public class StamenTonerTiles extends AbstractTileSource { - public static final StamenTonerTiles INSTANCE = new StamenTonerTiles(".tile.stamen.com", 80); - private static final int PARALLEL_REQUESTS_LIMIT = 8; - private static final String PROTOCOL = "http"; - private static final int ZOOM_LEVEL_MAX = 16; - private static final int ZOOM_LEVEL_MIN = 0; - - public StamenTonerTiles(String hostName, int port) { - super(hostName, port); - } - - @Override - public int getParallelRequestsLimit() { - return PARALLEL_REQUESTS_LIMIT; - } - - private char[] subdomains = { 'a', 'b', 'c', 'd' }; - private int curDomain = 0; - - @Override - public URL getTileUrl(Tile tile) throws MalformedURLException { - StringBuilder stringBuilder = new StringBuilder(32); - - stringBuilder.append("/toner/"); - stringBuilder.append(tile.zoomLevel); - stringBuilder.append('/'); - stringBuilder.append(tile.tileX); - stringBuilder.append('/'); - stringBuilder.append(tile.tileY); - stringBuilder.append(".png"); - - curDomain = (curDomain++) % 4; - - return new URL(PROTOCOL, subdomains[curDomain] + hostName, port, stringBuilder.toString()); - } - - @Override - public byte getZoomLevelMax() { - return ZOOM_LEVEL_MAX; - } - - @Override - public byte getZoomLevelMin() { - return ZOOM_LEVEL_MIN; - } -} diff --git a/vtm/src/org/oscim/layers/tile/bitmap/StamenWaterTiles.java b/vtm/src/org/oscim/layers/tile/bitmap/StamenWaterTiles.java deleted file mode 100644 index 1c50c935..00000000 --- a/vtm/src/org/oscim/layers/tile/bitmap/StamenWaterTiles.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2010, 2011, 2012 mapsforge.org - * Copyright 2013 Hannes Janetzek - * - * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). - * - * This program is free software: you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * this program. If not, see . - */ -package org.oscim.layers.tile.bitmap; - -import java.net.MalformedURLException; -import java.net.URL; - -import org.oscim.core.Tile; - -public class StamenWaterTiles extends AbstractTileSource { - public static final StamenWaterTiles INSTANCE = new StamenWaterTiles("tile.stamen.com", 80); - private static final int PARALLEL_REQUESTS_LIMIT = 8; - private static final String PROTOCOL = "http"; - private static final int ZOOM_LEVEL_MAX = 16; - private static final int ZOOM_LEVEL_MIN = 0; - - public StamenWaterTiles(String hostName, int port) { - super(hostName, port); - } - - @Override - public int getParallelRequestsLimit() { - return PARALLEL_REQUESTS_LIMIT; - } - - @Override - public URL getTileUrl(Tile tile) throws MalformedURLException { - StringBuilder stringBuilder = new StringBuilder(32); - - stringBuilder.append("/watercolor/"); - stringBuilder.append(tile.zoomLevel); - stringBuilder.append('/'); - stringBuilder.append(tile.tileX); - stringBuilder.append('/'); - stringBuilder.append(tile.tileY); - stringBuilder.append(".jpg"); - - return new URL(PROTOCOL, this.hostName, this.port, stringBuilder.toString()); - } - - @Override - public byte getZoomLevelMax() { - return ZOOM_LEVEL_MAX; - } - - @Override - public byte getZoomLevelMin() { - return ZOOM_LEVEL_MIN; - } -} diff --git a/vtm/src/org/oscim/layers/tile/bitmap/TileSource.java b/vtm/src/org/oscim/layers/tile/bitmap/TileSource.java deleted file mode 100644 index b229ac07..00000000 --- a/vtm/src/org/oscim/layers/tile/bitmap/TileSource.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2010, 2011, 2012 mapsforge.org - * Copyright 2013 Hannes Janetzek - * - * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). - * - * This program is free software: you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * this program. If not, see . - */ -package org.oscim.layers.tile.bitmap; - -import java.net.MalformedURLException; -import java.net.URL; - -import org.oscim.core.Tile; - -public interface TileSource { - /** - * @return the maximum number of parallel requests which this - * {@code TileSource} supports. - */ - int getParallelRequestsLimit(); - - /** - * @return the download URL for the given {@code Tile}. - */ - URL getTileUrl(Tile tile) throws MalformedURLException; - - /** - * @return the maximum zoom level which this {@code TileSource} supports. - */ - byte getZoomLevelMax(); - - /** - * @return the minimum zoom level which this {@code TileSource} supports. - */ - byte getZoomLevelMin(); - - FadeStep[] getFadeSteps(); - - public class FadeStep { - public final double scaleStart, scaleEnd; - public final float alphaStart, alphaEnd; - - public FadeStep(int zoomStart, int zoomEnd, float alphaStart, float alphaEnd) { - this.scaleStart = 1 << zoomStart; - this.scaleEnd = 1 << zoomEnd; - this.alphaStart = alphaStart; - this.alphaEnd = alphaEnd; - } - } -} diff --git a/vtm/src/org/oscim/map/Map.java b/vtm/src/org/oscim/map/Map.java index ace3b6e8..9ee8f2b1 100644 --- a/vtm/src/org/oscim/map/Map.java +++ b/vtm/src/org/oscim/map/Map.java @@ -24,7 +24,7 @@ import org.oscim.event.Gesture; import org.oscim.event.GestureDetector; import org.oscim.event.MotionEvent; import org.oscim.layers.MapEventLayer; -import org.oscim.layers.tile.bitmap.BitmapTileLayer; +import org.oscim.layers.tile.BitmapTileLayer; import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.renderer.MapRenderer; import org.oscim.theme.IRenderTheme; @@ -79,7 +79,7 @@ public abstract class Map { private Set mUpdateListenerSet = new LinkedHashSet(); private UpdateListener[] mUpdateListeners; - protected boolean mClearMap; + protected boolean mClearMap = true; public Map() { mViewport = new Viewport(this); diff --git a/vtm/src/org/oscim/tiling/source/bitmap/BitmapTileSource.java b/vtm/src/org/oscim/tiling/source/bitmap/BitmapTileSource.java new file mode 100644 index 00000000..d94e7b07 --- /dev/null +++ b/vtm/src/org/oscim/tiling/source/bitmap/BitmapTileSource.java @@ -0,0 +1,94 @@ +package org.oscim.tiling.source.bitmap; + +import java.io.IOException; +import java.io.InputStream; + +import org.oscim.backend.CanvasAdapter; +import org.oscim.backend.canvas.Bitmap; +import org.oscim.core.Tile; +import org.oscim.layers.tile.BitmapTileLayer.FadeStep; +import org.oscim.tiling.source.ITileDataSink; +import org.oscim.tiling.source.ITileDataSource; +import org.oscim.tiling.source.ITileDecoder; +import org.oscim.tiling.source.common.LwHttp; +import org.oscim.tiling.source.common.UrlTileDataSource; +import org.oscim.tiling.source.common.UrlTileSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class BitmapTileSource extends UrlTileSource { + static final Logger log = LoggerFactory.getLogger(LwHttp.class); + + private final int mZoomMin; + private final int mZoomMax; + private final String mFileExtension; + private final String mMimeType; + + public BitmapTileSource(String url) { + this(url, 0, 17); + } + + public BitmapTileSource(String url, int zoomMin, int zoomMax) { + this(url, zoomMin, zoomMax, "image/png", ".png"); + } + + public BitmapTileSource(String url, int zoomMin, int zoomMax, String mimeType, + String fileExtension) { + super(url); + mZoomMin = zoomMin; + mZoomMax = zoomMax; + mFileExtension = fileExtension; + mMimeType = mimeType; + } + + @Override + public ITileDataSource getDataSource() { + LwHttp conn = new LwHttp(mUrl, mMimeType, mFileExtension, false) { + @Override + protected int formatTilePath(Tile tile, byte[] path, int curPos) { + String p = getTileUrl(tile); + if (p == null) + return super.formatTilePath(tile, path, curPos); + + byte[] b = p.getBytes(); + System.arraycopy(b, 0, path, curPos, b.length); + + return curPos + b.length; + } + }; + return new UrlTileDataSource(this, new BitmapTileDecoder(), conn); + } + + public int getZoomLevelMax() { + return mZoomMax; + } + + public int getZoomLevelMin() { + return mZoomMin; + } + + public FadeStep[] getFadeSteps() { + return null; + } + + public String getTileUrl(Tile tile) { + return null; + } + + public class BitmapTileDecoder implements ITileDecoder { + + @Override + public boolean decode(Tile tile, ITileDataSink sink, InputStream is) + throws IOException { + + Bitmap bitmap = CanvasAdapter.g.decodeBitmap(is); + if (!bitmap.isValid()) { + log.debug("invalid bitmap"); + return false; + } + sink.setTileImage(bitmap); + + return true; + } + } +} diff --git a/vtm/src/org/oscim/tiling/source/bitmap/DefaultSources.java b/vtm/src/org/oscim/tiling/source/bitmap/DefaultSources.java new file mode 100644 index 00000000..39a49858 --- /dev/null +++ b/vtm/src/org/oscim/tiling/source/bitmap/DefaultSources.java @@ -0,0 +1,102 @@ +package org.oscim.tiling.source.bitmap; + +import org.oscim.core.Tile; +import org.oscim.layers.tile.BitmapTileLayer.FadeStep; + +public class DefaultSources { + + public static class OpenStreetMap extends BitmapTileSource { + public OpenStreetMap() { + super("http://tile.openstreetmap.org", 0, 18); + } + } + + public static class OSMTransport extends BitmapTileSource { + public OSMTransport() { + super("http://a.tile.thunderforest.com/transport", 0, 18); + } + } + + public static class StamenToner extends BitmapTileSource { + public StamenToner() { + super("http://a.tile.stamen.com/toner", 0, 16); + } + } + + public static class StamenWatercolor extends BitmapTileSource { + public StamenWatercolor() { + super("http://a.tile.stamen.com/watercolor", 0, 16); + } + } + + public static class ImagicoLandcover extends BitmapTileSource { + public ImagicoLandcover() { + super("http://www.imagico.de/map/tiles/landcover", + 0, 6, "image/jpeg", ".jpg"); + } + } + + public static class MapQuestAerial extends BitmapTileSource { + public MapQuestAerial() { + super("http://otile1.mqcdn.com/tiles/1.0.0/sat", + 0, 8, "image/jpeg", ".jpg"); + } + + @Override + public FadeStep[] getFadeSteps() { + return fadeSteps; + } + } + + public static class NaturalEarth extends BitmapTileSource { + public NaturalEarth() { + super("http://opensciencemap.org/tiles/ne", 0, 8); + } + + @Override + public FadeStep[] getFadeSteps() { + return fadeSteps; + } + } + + public static class ArcGISWorldShaded extends BitmapTileSource { + public ArcGISWorldShaded() { + super("http://server.arcgisonline.com/ArcGIS/rest/services", + 0, 6, "image/jpg", ""); + } + + @Override + public String getTileUrl(Tile tile) { + StringBuilder sb = new StringBuilder(32); + //sb.append("/World_Imagery/MapServer/tile/"); + sb.append("/World_Shaded_Relief/MapServer/tile/"); + sb.append(tile.zoomLevel); + sb.append('/').append(tile.tileY); + sb.append('/').append(tile.tileX); + return sb.toString(); + } + } + + public static class HillShadeHD extends BitmapTileSource { + public HillShadeHD() { + super("http://129.206.74.245:8004/tms_hs.ashx", + 2, 16, "image/png", ""); + } + + @Override + public String getTileUrl(Tile tile) { + StringBuilder sb = new StringBuilder(32); + sb.append("?x=").append(tile.tileX); + sb.append("&y=").append(tile.tileY); + sb.append("&z=").append(tile.zoomLevel); + return sb.toString(); + } + } + + final static FadeStep[] fadeSteps = new FadeStep[] { + new FadeStep(0, 8 - 1, 1, 0.7f), + // dont fade between zoom-min/max + // fade above zoom max + 2, interpolate 1 to 0 + new FadeStep(8 - 1, 8 + 1, 0.7f, 0) + }; +}