package aimax.osm.viewer;
import aimax.osm.data.BoundingBox;
import aimax.osm.data.MapBuilder;
import aimax.osm.data.OsmMap;
import aimax.osm.data.entities.MapEntity;
import aimax.osm.data.impl.DefaultMap;
import aimax.osm.reader.Bz2OsmReader;
import aimax.osm.reader.MapReader;
import java.io.File;
import java.io.InputStream;
import java.util.List;
/**
* @author Ruediger Lunde
*/
public class UnifiedMapDrawer<IMAGE_TYPE> {
protected OsmMap map;
protected CoordTransformer transformer;
private AbstractEntityRenderer renderer;
private UnifiedImageBuilder<IMAGE_TYPE> imageBdr;
public UnifiedMapDrawer(UnifiedImageBuilder<IMAGE_TYPE> imgBdr) {
this(imgBdr, new DefaultMap());
}
public UnifiedMapDrawer(UnifiedImageBuilder<IMAGE_TYPE> imgBdr, OsmMap map) {
transformer = new CoordTransformer();
this.map = map;
renderer = new DefaultEntityRenderer();
imageBdr = imgBdr;
}
public OsmMap getMap() {
return map;
}
public void setMap(OsmMap map) {
this.map = map;
}
public void loadMap(InputStream stream) {
MapBuilder builder = map.getBuilder();
builder.setEntityClassifier(new MapStyleFactory().createDefaultClassifier());
MapReader mapReader = new Bz2OsmReader();
mapReader.readMap(stream, builder);
builder.buildMap();
}
public void loadMap(File file) {
MapBuilder builder = map.getBuilder();
builder.setEntityClassifier(new MapStyleFactory().createDefaultClassifier());
MapReader mapReader = new Bz2OsmReader();
mapReader.readMap(file, builder);
builder.buildMap();
}
public AbstractEntityRenderer getRenderer() {
return renderer;
}
public void setRenderer(AbstractEntityRenderer renderer) {
this.renderer = renderer;
}
public CoordTransformer getTransformer() {
return transformer;
}
public void drawMap(IMAGE_TYPE image, boolean adjustToFit) {
imageBdr.initialize(image);
imageBdr.setColor(UColor.WHITE);
imageBdr.setAreaFilled(true);
imageBdr.drawRect(0, 0, imageBdr.getWidth(), imageBdr.getHeight());
if (imageBdr.getWidth() > 0 && map != null) {
if (adjustToFit)
getTransformer().adjustTransformation(getMap().getBoundingBox(),
imageBdr.getWidth(), imageBdr.getHeight());
float latMin = transformer.lat(imageBdr.getHeight());
float lonMin = transformer.lon(0);
float latMax = transformer.lat(0);
float lonMax = transformer.lon(imageBdr.getWidth());
float scale = transformer.computeScale();
BoundingBox vbox = new BoundingBox(latMin, lonMin, latMax, lonMax);
float viewScale = scale / renderer.getDisplayFactor();
renderer.initForRendering(imageBdr, transformer, map);
map.visitEntities(renderer, vbox, viewScale);
for (MapEntity entity : map.getVisibleMarkersAndTracks(viewScale))
entity.accept(renderer);
renderer.printBufferedObjects();
if (renderer.isDebugModeEnabled() && map instanceof DefaultMap) {
List<double[]> splits = ((DefaultMap) map).getEntityTree()
.getSplitCoords();
imageBdr.setColor(UColor.LIGHT_GRAY);
imageBdr.setLineStyle(false, 1f);
imageBdr.setAreaFilled(false);
CoordTransformer trans = renderer.getTransformer();
for (double[] split : splits)
imageBdr.drawLine(renderer.getTransformer().x(split[1]),
trans.y(split[0]), trans.x(split[3]),
trans.y(split[2]));
}
}
image = imageBdr.getResult();
}
}