package com.nutiteq.maps;
import com.nutiteq.components.MapPos;
import com.nutiteq.components.Point;
import com.nutiteq.components.ZoomRange;
import com.nutiteq.maps.projections.EPSG3301;
import com.nutiteq.ui.StringCopyright;
public class Regio extends EPSG3301 implements GeoMap, UnstreamedMap {
public static final int TYPE_PNG = 0;
public static final int TYPE_ORTO = 1;
public static final int TYPE_HYBRID = 2;
public static final String[] MAP_TYPE_STRINGS = new String[] { "variant2png", "delfiorto",
"hybrid" };
public static final int TILE_EDGE_PX = 256;
public static final int TILE_MIN_E = 365000;
public static final int TILE_MIN_N = 6308000;
public static final int TILE_MAX_E = 749000;
public static final int TILE_MAX_N = 6692000;
public static final int MIN_E = 365000;
public static final int MIN_N = 6308000;
public static final int MAX_E = 749000;
public static final int MAX_N = 6692000;
public static final int MIN_ZOOM = 0;
public static final int MAX_ZOOM = 11;
private static final ZoomRange Z_RANGE = new ZoomRange(MIN_ZOOM, MAX_ZOOM);
public static final int MAP_WIDTH_HEIGHT_METERS = MAX_E - MIN_E;
private final int mapType;
private final String baseurl;
private final String user;
public Regio(final String baseurl, final String user) {
this(TYPE_PNG, baseurl, user);
}
public Regio(final int type, final String baseurl, final String user) {
super(new StringCopyright("Regio"), 256, MIN_ZOOM, MAX_ZOOM);
mapType = type;
this.baseurl = baseurl;
this.user = user;
}
public Point mapPosToWgs(final MapPos pos) {
return toWgs(mapPointToEastingNorthing(pos, pos.getZoom()));
}
private Point mapPointToEastingNorthing(final MapPos pos, final int zoom) {
final int mapWidthHeightInPixels = getMapWidth(zoom);
final float pixelInMeters = MAP_WIDTH_HEIGHT_METERS / (float) mapWidthHeightInPixels;
final int easting = (int) (pos.getX() * pixelInMeters + MIN_E);
final int northing = (int) (MAX_N - pos.getY() * pixelInMeters);
return new Point(easting, northing);
}
public MapPos wgsToMapPos(final Point wgs, final int zoom) {
//calculate easting/northing
final Point enPoint = fromWgs(wgs);
final int eastingFromMapZero = enPoint.getX() - MIN_E;
final int northingFromMapZero = enPoint.getY() - MIN_N;
final int mapWidthHeightInPixels = getMapWidth(zoom);
final int pointX = (int) ((eastingFromMapZero / (float) MAP_WIDTH_HEIGHT_METERS) * mapWidthHeightInPixels);
final int pointY = (int) (mapWidthHeightInPixels - ((northingFromMapZero / (float) MAP_WIDTH_HEIGHT_METERS) * mapWidthHeightInPixels));
return new MapPos(pointX, pointY, zoom);
}
public String buildPath(final int mapX, final int mapY, final int zoom) {
final int x = mapX / TILE_EDGE_PX;
final int y = mapY / TILE_EDGE_PX;
if (mapType == TYPE_HYBRID) {
final StringBuffer result = new StringBuffer();
result.append(getTileUrl(x, y, zoom, TYPE_ORTO));
//TODO jaanus : download separator
//result.append(Downloader.DOWNLOAD_SEPARATOR);
result.append(getTileUrl(x, y, zoom, TYPE_HYBRID));
return result.toString();
} else {
return getTileUrl(x, y, zoom, mapType).toString();
}
}
private String getTileUrl(final int x, final int y, final int zoom, final int type) {
final StringBuffer url = new StringBuffer(baseurl);
url.append("?user=").append(user).append("&map=").append(MAP_TYPE_STRINGS[type]).append(
"&tile=");
//TODO check this
url.append("2");
for (int i = zoom - 1; i >= 0; i--) {
//TODO jaanus : remove magic from here
url.append((((y >> i) & 1) << 1) + ((x >> i) & 1));
}
return url.toString();
}
}