add AbstractVectorLayer
This commit is contained in:
parent
e15163bb08
commit
6507b1369a
126
vtm/src/org/oscim/layers/vector/AbstractVectorLayer.java
Normal file
126
vtm/src/org/oscim/layers/vector/AbstractVectorLayer.java
Normal file
@ -0,0 +1,126 @@
|
||||
package org.oscim.layers.vector;
|
||||
|
||||
import org.oscim.core.BoundingBox;
|
||||
import org.oscim.core.GeometryBuffer;
|
||||
import org.oscim.core.MapPosition;
|
||||
import org.oscim.core.Tile;
|
||||
import org.oscim.event.Event;
|
||||
import org.oscim.layers.Layer;
|
||||
import org.oscim.map.Map;
|
||||
import org.oscim.map.Map.UpdateListener;
|
||||
import org.oscim.map.Viewport;
|
||||
import org.oscim.renderer.ElementRenderer;
|
||||
import org.oscim.renderer.GLViewport;
|
||||
import org.oscim.renderer.elements.ElementLayers;
|
||||
import org.oscim.utils.async.SimpleWorker;
|
||||
import org.oscim.utils.geom.TileClipper;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public abstract class AbstractVectorLayer<T> extends Layer implements UpdateListener {
|
||||
public static final Logger log = LoggerFactory.getLogger(AbstractVectorLayer.class);
|
||||
|
||||
protected final static double UNSCALE_COORD = 4;
|
||||
|
||||
protected final GeometryBuffer mGeom = new GeometryBuffer(128, 4);
|
||||
protected final TileClipper mClipper = new TileClipper(-1024, -1024, 1024, 1024);
|
||||
|
||||
protected final Worker mWorker;
|
||||
protected long mUpdateDelay = 100;
|
||||
|
||||
protected boolean mUpdate = true;
|
||||
|
||||
protected double mMinX;
|
||||
protected double mMinY;
|
||||
|
||||
public AbstractVectorLayer(Map map) {
|
||||
super(map);
|
||||
mWorker = new Worker(mMap);
|
||||
mRenderer = new Renderer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDetach() {
|
||||
super.onDetach();
|
||||
|
||||
mWorker.cancel(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMapEvent(Event e, MapPosition pos) {
|
||||
if (mUpdate) {
|
||||
mUpdate = false;
|
||||
mWorker.submit(0);
|
||||
} else if (e == Map.POSITION_EVENT || e == Map.CLEAR_EVENT) {
|
||||
// throttle worker
|
||||
mWorker.submit(mUpdateDelay);
|
||||
}
|
||||
}
|
||||
|
||||
public void update() {
|
||||
mWorker.submit(0);
|
||||
}
|
||||
|
||||
abstract protected void processFeatures(Task t, BoundingBox b);
|
||||
|
||||
protected class Task {
|
||||
public final ElementLayers layers = new ElementLayers();
|
||||
public final MapPosition position = new MapPosition();
|
||||
}
|
||||
|
||||
protected class Worker extends SimpleWorker<Task> {
|
||||
|
||||
public Worker(Map map) {
|
||||
super(map, 50, new Task(), new Task());
|
||||
}
|
||||
|
||||
/** automatically in sync with worker thread */
|
||||
@Override
|
||||
public void cleanup(Task t) {
|
||||
if (t.layers != null)
|
||||
t.layers.clear();
|
||||
}
|
||||
|
||||
/** running on worker thread */
|
||||
@Override
|
||||
public boolean doWork(Task t) {
|
||||
Viewport v = mMap.viewport();
|
||||
BoundingBox bbox;
|
||||
synchronized (v) {
|
||||
bbox = v.getBBox();
|
||||
v.getMapPosition(t.position);
|
||||
}
|
||||
|
||||
double scale = t.position.scale * Tile.SIZE;
|
||||
|
||||
t.position.x = (long) (t.position.x * scale) / scale;
|
||||
t.position.y = (long) (t.position.y * scale) / scale;
|
||||
processFeatures(t, bbox);
|
||||
|
||||
mMap.render();
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class Renderer extends ElementRenderer {
|
||||
MapPosition mTmpPos = new MapPosition();
|
||||
|
||||
@Override
|
||||
protected void update(GLViewport v) {
|
||||
|
||||
Task t = mWorker.poll();
|
||||
|
||||
if (t == null)
|
||||
return;
|
||||
|
||||
mMapPosition.copy(t.position);
|
||||
mMapPosition.setScale(mMapPosition.scale / UNSCALE_COORD);
|
||||
|
||||
layers.setFrom(t.layers);
|
||||
|
||||
compile();
|
||||
//log.debug("is ready " + isReady() + " " + layers.getSize());
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user