simplify UrlTileDataSource initialization

This commit is contained in:
Hannes Janetzek 2014-01-21 00:47:57 +01:00
parent 94011804be
commit 6e543303c6
11 changed files with 91 additions and 121 deletions

View File

@ -45,7 +45,6 @@ public class BaseMapActivity extends MapActivity {
registerMapView(mMapView); registerMapView(mMapView);
mTileSource = new OSciMap4TileSource(); mTileSource = new OSciMap4TileSource();
mTileSource.setOption("url", "http://opensciencemap.org/tiles/vtm");
if (USE_CACHE) { if (USE_CACHE) {
mCache = new TileCache(this, "cachedir", "testdb"); mCache = new TileCache(this, "cachedir", "testdb");

View File

@ -57,10 +57,7 @@ public class MainActivity extends AndroidApplication {
class GdxMapAndroid extends GdxMap { class GdxMapAndroid extends GdxMap {
@Override @Override
public void createLayers() { public void createLayers() {
TileSource ts = new OSciMap4TileSource(); TileSource ts = new OSciMap4TileSource();
ts.setOption("url", "http://opensciencemap.org/tiles/vtm");
initDefaultLayers(ts, true, true, true); initDefaultLayers(ts, true, true, true);
} }
} }

View File

@ -19,8 +19,6 @@ package org.oscim.gdx.client;
import org.oscim.backend.CanvasAdapter; import org.oscim.backend.CanvasAdapter;
import org.oscim.backend.GL20; import org.oscim.backend.GL20;
import org.oscim.backend.GLAdapter; import org.oscim.backend.GLAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.oscim.core.MapPosition; import org.oscim.core.MapPosition;
import org.oscim.core.MercatorProjection; import org.oscim.core.MercatorProjection;
import org.oscim.gdx.GdxMap; 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.TileSource;
import org.oscim.tiling.source.oscimap2.OSciMap2TileSource; import org.oscim.tiling.source.oscimap2.OSciMap2TileSource;
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource; import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.gwt.GwtApplication; import com.badlogic.gdx.backends.gwt.GwtApplication;
@ -108,12 +108,10 @@ class GwtGdxMap extends GdxMap {
TileSource tileSource; TileSource tileSource;
if ("oscimap4".equals(sourceName)) if ("oscimap4".equals(sourceName))
tileSource = new OSciMap4TileSource(); tileSource = new OSciMap4TileSource(url);
else else
//if ("oscimap2".equals(source)) //if ("oscimap2".equals(source))
tileSource = new OSciMap2TileSource(); tileSource = new OSciMap2TileSource(url);
tileSource.setOption("url", url);
initDefaultLayers(tileSource, false, true, true); initDefaultLayers(tileSource, false, true, true);

View File

@ -18,25 +18,22 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import org.oscim.tiling.MapTile; import org.oscim.tiling.MapTile;
import org.oscim.tiling.source.ITileCache;
import org.oscim.tiling.source.ITileDataSink; import org.oscim.tiling.source.ITileDataSink;
import org.oscim.tiling.source.ITileDataSource; import org.oscim.tiling.source.ITileDataSource;
import org.oscim.tiling.source.ITileDecoder; import org.oscim.tiling.source.ITileDecoder;
import org.oscim.tiling.source.TileSource;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
/** public class UrlTileDataSource implements ITileDataSource {
*
*
*/
public abstract class UrlTileDataSource implements ITileDataSource {
static final Logger log = LoggerFactory.getLogger(UrlTileDataSource.class); static final Logger log = LoggerFactory.getLogger(UrlTileDataSource.class);
protected LwHttp mConn; protected final LwHttp mConn;
protected final ITileDecoder mTileDecoder; protected final ITileDecoder mTileDecoder;
public UrlTileDataSource(ITileDecoder tileDecoder, ITileCache cache) { public UrlTileDataSource(TileSource tileSource, ITileDecoder tileDecoder, LwHttp conn) {
mTileDecoder = tileDecoder; mTileDecoder = tileDecoder;
mConn = conn;
} }
private ITileDataSink mSink; private ITileDataSink mSink;

View File

@ -47,7 +47,7 @@ public class LwHttp {
private final static int RESPONSE_EXPECTED_LIVES = 100; private final static int RESPONSE_EXPECTED_LIVES = 100;
private final static long RESPONSE_TIMEOUT = (long) 10E9; // 10 second in nanosecond 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 byte[] buffer = new byte[BUFFER_SIZE];
private final String mHost; private final String mHost;
@ -92,7 +92,7 @@ public class LwHttp {
REQUEST_GET_START = ("GET " + path).getBytes(); REQUEST_GET_START = ("GET " + path).getBytes();
REQUEST_GET_END = ("." + extension + " HTTP/1.1" + REQUEST_GET_END = (extension + " HTTP/1.1" +
"\nHost: " + host + "\nHost: " + host +
"\nConnection: Keep-Alive" + "\nConnection: Keep-Alive" +
"\n\n").getBytes(); "\n\n").getBytes();
@ -162,6 +162,10 @@ public class LwHttp {
return len; return len;
} }
public byte[] getArray() {
return buf;
}
} }
public void close() { public void close() {
@ -292,18 +296,8 @@ public class LwHttp {
byte[] request = mRequestBuffer; byte[] request = mRequestBuffer;
int pos = REQUEST_GET_START.length; int pos = REQUEST_GET_START.length;
int newPos = 0;
if ((newPos = formatTilePath(tile, request, pos)) == 0) { pos = formatTilePath(tile, request, 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);
} else {
pos = newPos;
}
int len = REQUEST_GET_END.length; int len = REQUEST_GET_END.length;
System.arraycopy(REQUEST_GET_END, 0, request, pos, len); System.arraycopy(REQUEST_GET_END, 0, request, pos, len);
@ -402,8 +396,14 @@ public class LwHttp {
* @param curPos current position * @param curPos current position
* @return new position * @return new position
*/ */
protected int formatTilePath(Tile tile, byte[] path, int curPos) { protected int formatTilePath(Tile tile, byte[] request, int pos) {
return 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);
return pos;
} }
} }

View File

@ -27,20 +27,22 @@ import org.oscim.tiling.source.ITileCache;
import org.oscim.tiling.source.ITileDataSink; import org.oscim.tiling.source.ITileDataSink;
import org.oscim.tiling.source.ITileDataSource; import org.oscim.tiling.source.ITileDataSource;
import org.oscim.tiling.source.ITileDecoder; import org.oscim.tiling.source.ITileDecoder;
import org.oscim.tiling.source.TileSource;
import org.oscim.utils.IOUtils; import org.oscim.utils.IOUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public abstract class UrlTileDataSource implements ITileDataSource { public class UrlTileDataSource implements ITileDataSource {
static final Logger log = LoggerFactory.getLogger(UrlTileDataSource.class); static final Logger log = LoggerFactory.getLogger(UrlTileDataSource.class);
protected LwHttp mConn; protected final LwHttp mConn;
protected final ITileDecoder mTileDecoder; protected final ITileDecoder mTileDecoder;
protected final ITileCache mTileCache; protected final ITileCache mTileCache;
public UrlTileDataSource(ITileDecoder tileDecoder, ITileCache tileCache) { public UrlTileDataSource(TileSource tileSource, ITileDecoder tileDecoder, LwHttp conn) {
mTileDecoder = tileDecoder; mTileDecoder = tileDecoder;
mTileCache = tileCache; mTileCache = tileSource.tileCache;
mConn = conn;
} }
@Override @Override

View File

@ -22,22 +22,21 @@ import java.net.URL;
import org.oscim.tiling.source.TileSource; import org.oscim.tiling.source.TileSource;
public abstract class UrlTileSource extends 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 @Override
public OpenResult open() { 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; return OpenResult.SUCCESS;
} }
@ -45,9 +44,4 @@ public abstract class UrlTileSource extends TileSource {
public void close() { public void close() {
} }
public boolean setUrl(String urlString) {
options.put("url", urlString);
return open() == OpenResult.SUCCESS;
}
} }

View File

@ -16,50 +16,43 @@
*/ */
package org.oscim.tiling.source.mapnik; package org.oscim.tiling.source.mapnik;
import java.net.URL;
import org.oscim.core.Tile; import org.oscim.core.Tile;
import org.oscim.tiling.source.ITileDataSource; 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.LwHttp;
import org.oscim.tiling.source.common.UrlTileDataSource; import org.oscim.tiling.source.common.UrlTileDataSource;
import org.oscim.tiling.source.common.UrlTileSource; import org.oscim.tiling.source.common.UrlTileSource;
public class MapnikVectorTileSource extends UrlTileSource { public class MapnikVectorTileSource extends UrlTileSource {
public MapnikVectorTileSource() {
super("http://d1s11ojcu7opje.cloudfront.net/dev/764e0b8d");
}
@Override @Override
public ITileDataSource getDataSource() { 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 { path[pos++] = '/';
path[pos++] = hexTable[(tile.tileX) % 16];
public TileDataSource(TileSource tileSource, URL url) { path[pos++] = hexTable[(tile.tileY) % 16];
super(new TileDecoder(), tileSource.tileCache); path[pos++] = '/';
pos = LwHttp.writeInt(tile.zoomLevel, pos, path);
mConn = new LwHttp(url, "image/png", "vector.pbf", true) { path[pos++] = '/';
@Override pos = LwHttp.writeInt(tile.tileX, pos, path);
protected int formatTilePath(Tile tile, byte[] path, int pos) { path[pos++] = '/';
// url formatter for mapbox streets pos = LwHttp.writeInt(tile.tileY, pos, path);
byte[] hexTable = { return pos;
'0', '1', '2', '3', }
'4', '5', '6', '7', };
'8', '9', 'a', 'b', return new UrlTileDataSource(this, new TileDecoder(), conn);
'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;
}
};
}
} }
} }

View File

@ -16,10 +16,7 @@
*/ */
package org.oscim.tiling.source.oscimap; package org.oscim.tiling.source.oscimap;
import java.net.URL;
import org.oscim.tiling.source.ITileDataSource; 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.LwHttp;
import org.oscim.tiling.source.common.UrlTileDataSource; import org.oscim.tiling.source.common.UrlTileDataSource;
import org.oscim.tiling.source.common.UrlTileSource; import org.oscim.tiling.source.common.UrlTileSource;
@ -30,15 +27,13 @@ import org.oscim.tiling.source.common.UrlTileSource;
*/ */
public class OSciMap1TileSource extends UrlTileSource { public class OSciMap1TileSource extends UrlTileSource {
@Override public OSciMap1TileSource(String url) {
public ITileDataSource getDataSource() { super(url);
return new TileDataSource(this, mUrl);
} }
class TileDataSource extends UrlTileDataSource { @Override
public TileDataSource(TileSource tileSource, URL url) { public ITileDataSource getDataSource() {
super(new TileDecoder(), tileSource.tileCache); LwHttp conn = new LwHttp(mUrl, "application/osmtile", ".osmtile", false);
mConn = new LwHttp(url, "application/osmtile", "osmtile", false); return new UrlTileDataSource(this, new TileDecoder(), conn);
}
} }
} }

View File

@ -18,7 +18,6 @@ package org.oscim.tiling.source.oscimap2;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL;
import java.util.Arrays; import java.util.Arrays;
import org.oscim.core.GeometryBuffer.GeometryType; import org.oscim.core.GeometryBuffer.GeometryType;
@ -28,7 +27,6 @@ import org.oscim.core.TagSet;
import org.oscim.core.Tile; import org.oscim.core.Tile;
import org.oscim.tiling.source.ITileDataSink; import org.oscim.tiling.source.ITileDataSink;
import org.oscim.tiling.source.ITileDataSource; 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.LwHttp;
import org.oscim.tiling.source.common.PbfDecoder; import org.oscim.tiling.source.common.PbfDecoder;
import org.oscim.tiling.source.common.UrlTileDataSource; import org.oscim.tiling.source.common.UrlTileDataSource;
@ -38,16 +36,14 @@ import org.slf4j.LoggerFactory;
public class OSciMap2TileSource extends UrlTileSource { public class OSciMap2TileSource extends UrlTileSource {
@Override public OSciMap2TileSource(String url) {
public ITileDataSource getDataSource() { super(url);
return new TileDataSource(this, mUrl);
} }
class TileDataSource extends UrlTileDataSource { @Override
public TileDataSource(TileSource tileSource, URL url) { public ITileDataSource getDataSource() {
super(new TileDecoder(), tileSource.tileCache); LwHttp conn = new LwHttp(mUrl, "application/osmtile", ".osmtile", false);
mConn = new LwHttp(url, "application/osmtile", "osmtile", false); return new UrlTileDataSource(this, new TileDecoder(), conn);
}
} }
static class TileDecoder extends PbfDecoder { static class TileDecoder extends PbfDecoder {

View File

@ -16,26 +16,25 @@
*/ */
package org.oscim.tiling.source.oscimap4; package org.oscim.tiling.source.oscimap4;
import java.net.URL;
import org.oscim.tiling.source.ITileDataSource; 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.LwHttp;
import org.oscim.tiling.source.common.UrlTileDataSource; import org.oscim.tiling.source.common.UrlTileDataSource;
import org.oscim.tiling.source.common.UrlTileSource; import org.oscim.tiling.source.common.UrlTileSource;
public class OSciMap4TileSource extends UrlTileSource { public class OSciMap4TileSource extends UrlTileSource {
@Override public OSciMap4TileSource() {
public ITileDataSource getDataSource() { super("http://opensciencemap.org/tiles/vtm");
return new TileDataSource(this, mUrl);
} }
class TileDataSource extends UrlTileDataSource { public OSciMap4TileSource(String url) {
public TileDataSource(TileSource tileSource, URL url) { super(url);
super(new TileDecoder(), tileSource.tileCache); }
//mConn = new LwHttp(url, "application/x-protobuf", "vtm", false);
mConn = new LwHttp(url, "image/png", "vtm", false); @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);
} }
} }